IBX For Lazarus (Firebird Express)

Модератор: Модераторы

Re: IBX For Lazarus (Firebird Express)

Сообщение anbsoft » 24.12.2012 18:43:21

Спасибо.
Примерно то же ответил автор компонентов.
Most likely reason is that you have not installed the 64-bit version of the firebird client library.
(Скорее всего, причина заключается в том, что у вас не установлена 64-битная версия firebird client library.)
anbsoft
незнакомец
 
Сообщения: 9
Зарегистрирован: 23.12.2012 21:59:47

Re: IBX For Lazarus (Firebird Express)

Сообщение *Rik* » 02.02.2014 01:23:23

Я немного допилил компоненты IBX, пробую сейчас это всё использовать, если есть желание протестировать, подключайтесь. Если всё пройдет успешно, предложу автору включить мой код в его сборку.
Изменения:
TIBCustomDataSet:
добавлено свойство UpdateTransaction - это вторая транзакция для выполнения коротких запросов. Запросы InsertSQL, ModifySQL, DeleteSQL, RefreshSQL используют UpdateTransaction (SelectSQL использует Transaction). Для использования двух транзакций, наиболее оптимальные параметры транзакций следующие:
Transaction:
read
read_committed
rec_version
nowait

С этими параметрами транзакция запускается только для чтения, не создает версии записей и может жить сколько угодно долго.
UpdateTransaction:
write
wait
no_rec_version
read_committed

Я модифицировал редактор компонента TIBTransaction. В нем пункт ReadCommited вписывает первые параметры только для чтения и добавил пункт Read Write - Он добавляет второй набор.
Сейчас при редактировании данных модифицирующие запросы не прерывают читающую транзакцию.

Добавлены свойства:
AutoStartTransaction, AutoCommit. Думаю комментировать их не нужно.
AutoTrim - автоматическое тримирование строк в TIBStringField.
Добавлена поддержка эмуляции Boolean полей (введен класс TIBBooleanField). Если в базе создать домен
CREATE DOMAIN TBOOLEAN_INT AS
INTEGER
DEFAULT 0
NOT NULL
CHECK (VALUE IN (0, 1));

Любое поле с типом TBOOLEAN_INT на клиенте станет булевым.

Добавлена поддержка в TIBCustomDataSet возвращаемых полей (RETURNING), для этого введено свойство RetField: Boolean (по умолчанию True)
Если в TIBDataSet модифицирующие запросы возвращают значения, они сразу после выполнения запроса будут подставлены в кэш.
Пример:
Таблица CLIENT имеет ключ CLIENT_ID, его значение генерится с помощью генератора GEN_CLIENT_ID на стороне сервера в триггере при вставке записи. Используя выражения RETURNING я могу не беспокоиться о генерации первичного ключа на стороне клиента (если конечно этого не требуют связанные наборы данных Master-Detail и CashedUpdates)
В TIBDataSet.InsertSQL =
INSERT INTO CLIENT
(
FIO,
KOMENT,
BAD,
ZAKAZ,
NAKOP
)
VALUES
(
:FIO,
:KOMENT,
:BAD,
:ZAKAZ,
:NAKOP
) RETURNING CLIENT_ID

После выполнения вставки записи, первичный ключ сгенерированный в триггере, подставится в локальный кэш. Если нет связки Master-Detail и CashedUpdates, когда нужно чтобы первичный ключ появлялся в OnNewRecord, во всех остальных случаях про генерацию ключа на клиенте можно забыть, прописав код в триггер.
Так-же если в TIBDataSet.InsertSQL =
EXECUTE PROCEDURE SP_CLIENT_INS
(
:FIO,
:KOMENT,
:BAD,
:ZAKAZ,
:NAKOP
)

И эта процедура возвращает первичный ключ:
create or alter procedure SP_CLIENT_INS (
FIO type of column CLIENT.FIO,
KOMENT type of column CLIENT.KOMENT,
BAD type of column CLIENT.BAD,
ZAKAZ type of column CLIENT.ZAKAZ,
NAKOP type of column CLIENT.NAKOP)
returns (
CLIENT_ID bigint)
as
BEGIN
IF ((FIO IS NULL) OR (FIO = '')) THEN EXCEPTION ER_ERROR 'Не указано ФИО';
IF (BAD IS NULL) THEN BAD = 0;
IF (NAKOP IS NULL) THEN NAKOP = 0;


INSERT INTO CLIENT (
FIO,
KOMENT,
BAD,
ZAKAZ,
NAKOP)
VALUES (
:FIO,
:KOMENT,
:BAD,
:ZAKAZ,
:NAKOP) RETURNING CLIENT_ID INTO :CLIENT_ID;
END

Такая конструкция тоже будет работать.

В TIBStoredProc добавил свойство SQL. Если в него прописать вызов хранимой процедуры (без использования свойства StoredProcName), то свойство StroredProcName останется пустым или может содержать не правильное имя процедуры. Поэтому по возможности помните об этом.

Изменил редакторы свойств TIBDataSet.InsertSQL, ModifySQL, DeleteSQL. Сейчас в них можно автоматически генерить вызов хранимых процедур для вставки, редактирования и удаления данных (ранее генерились только запросы Insert Update Delete)

Ещё исправил то что описано здесь:
http://www.ibase.ru/devinfo/ibstp.htm

Компоненты IBX здесь:
http://visual-t.ru/download.html
Пример в папке Examples\IBXTest. В нем база под FireBird 2.5
ps.
Компоненты требуют, чтобы fbclient.dll (so) была всегда доступна, поэтому перед установкой компонент киньте fbclient в системный каталог windows или lib в Linux.
Последний раз редактировалось *Rik* 13.03.2015 12:36:13, всего редактировалось 1 раз.
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 426
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: IBX For Lazarus (Firebird Express)

Сообщение *Rik* » 17.05.2014 13:47:19

Решил опять напомнить о себе, может кому ещё окажется полезным. Продолжаю модифицировать компоненты IBX:
версия 2.0
Изменения в организации доступа к API FireBird. В предыдущей версии, независимо от того какое количество компонентов
TIBDataBase используется в программе, существовал единый метод загрузки клиентской библиотеки, а это значит, что
работа из программы была возможна только с серверами одной и той же версии, нельзя было загрузить 2 разные
клиентские библиотеки. Работа с компонентами была возможна, только если предварительно удалось загрузить клиентскую
библиотеку. В версии 2.0 каждый компонент TIBDatabase получил персональный механизм манипулирования и доступа к
клиентской библиотеке, загрузка библиотеки происходит при установлении соединения с базой, при разрыве соединения,
библиотека освобождается.
В компонент TIBDatabase добавлено свойство LibraryName - в котором указывается имя библиотеки. Поиск и загрузка
библиотеки происходит исключительно по указанному имени. Имя может быть указано с полным путем и без. Если
путь не указан, поиск библиотеки происходит в папке с выполняемой программой. В свойстве LibraryName
по умолчанию присутствует строка: Для windows - 'fbclient.dll', для Linux - 'fbclient.so'.
Переделан метод получения значения генератора в TIBGenerator. Добавлено свойство GenerateFor_0: Boolean по умолчанию
True. Это позволяет генерить значение не только когда в поле пусто, но и когда там 0.

Полный список изменений:
Добавлена работа компонент в рамках 2х транзакций (одна "читающая", вторая "пишущая" для обновляющих запросов Insert, Update, Delete).
Добавлены свойства:
AutoStartTransaction, AutoCommit - управление поведением транзакций (об этом подробнее ниже).
AutoParamToField - Если есть параметры, имена которых совпадают с именами полей, при вставке новой записи, значение параметров автоматом подставляются в соответствующие поля.
AutoTrim - автотримирование строк.
AutoFetchAll - если True, то автоматически выполняет FetchAll после каждого открытия набора данных.

DefFormats - задает форматы отображения и редактирования Numeric и DateTime полей.
EditFormats - позволяет задать собственные форматы редактирования конкретных полей.
FieldsFormats - позволяет задать собственные форматы отображения конкретных полей.
RetFields - включает поддержку возвращаемых полей (RETURNING FIELDS) и возвращаемых значений из EXECUTE PROCEDURE и EXECUTE BLOCK
Добавлен метод FullRefresh.
Добавлена поддержка выражений EXECUTE BLOCK
Добавлена возможность сортировки данных (public свойство OrderFields). Сортировка выполняется не в локальном буфере, а парсится Select запрос,
в который добавляется или изменяется инструкция Order By и запрос переоткрывается.
Изменена организация доступа к API клиентской библиотеки FireBird, у каждого TIBDataBase свой собственный, независимый механизм. Загрузка
библиотеки происходит при подключении к базе и освобождается при разрыве соединения.

Работа свойств AutoStartTransacton и AutoCommit:
Пример 1.
AutoStartTransaction = True и AutoCommit = True и перед выполнением запроса из QSelect Transaction.InTransaction = False то:
Транзакция для QSelect запускается автоматически, после завершения запроса - Commit автоматом. Запросы из QInsert, QModify и QDelete тоже стартуют и завершают "пишущую" UpdateTransaction автоматически.

Пример 2.
AutoStartTransaction = True и AutoCommit = True и перед выполнением запроса из QSelect Transaction.InTransaction = True то:
Транзакция для QSelect уже запущена, после выполнения запроса - Commit не произойдет, т.к. на момент старта запроса, транзакция уже была активна (Т.е. AutoCommit здесь сработает только если читающий запрос запустил для себя транзакцию автоматом). Запросы из QInsert, QModify и QDelete стартуют и завершают "пишущую" UpdateTransaction автоматически.

Пример 3.
AutoStartTransaction = False. AuteCommit = True. Автостарта для "пишущей" и "читающей" транзакции не будет, нужно запускать руками. Читающую транзакцию завершать тоже придется руками. А у "пишущей" commit сработает автоматом.

Пример 4.
AutоCommit = False. Завершаться транзакции, как бы они не были запущены нужно руками, авто завершения после выполнения запросов (и пишущих и читающих) не будет.
И ещё, в случае когда AutoCommit = False и после выполнения модифицирующего запроса требуется выполнить обновление текущей записи (запрос из QRefresh) он будет выполнен через
UpdateTransaction, т.е. если AutoCommit = False и QRefresh.Text <> '' то обновляющая транзакция должна быть не только пишущая, но и иметь параметры для возможности чтения.

По поводу правильного использования раздельных транзакций (какие параметры туда вписывать), смотрите здесь:
http://www.devrace.com/ru/fibplus/articles/2169.php

Взять можно здесь:
http://www.visual-t.ru
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 426
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: IBX For Lazarus (Firebird Express)

Сообщение *Rik* » 25.02.2015 15:55:35

IBX для Lazarus версия 2.2
Исправлен редактор компонента TIBDatabase, в него добавлено поле LibraryName, где можно указать путь к клиентской библиотеке.
Иправлено тестирование подключения при нажатии на кнопку Test.

Изображение

Улучшен механизм Master-Detail в TIBCustomDataSet. Раньше, любое событие в DataMaster приводило к переоткрытию набора данных
Detail. Сейчас Detail переоткрывается, только если в Master сменилась строка.
Добавлено свойство DetailConditions: TDetailConditions [dcForceOpenClose, dcForceMasterRefresh]. Если у TIBDataSet установлено
dcForceOpenClose и назначен DataSource.DataSet, то при открытии и закрытии DataSource.DataSet сам TIBDataSet вместе с ним открывается и
закрывается, если назначено dcForceMasterRefresh, то после Post и Delete в TIBDataSet вызвается DataSource.DataSet.Refresh.
История изменений:
http://visual-t.ru/ibx.htm
Взять можно здесь:
http://visual-t.ru/files/components.7z
В архиве кроме ibx ещё другие компоненты, которые я колупаю, это TxDBF - клон TDBF, адаптированный для работы с кодовыми страницами 1251 и 866, компоненты Visualtech - набор собственных контролов и дизайнер форм.
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 426
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: IBX For Lazarus (Firebird Express)

Сообщение Tango » 12.03.2015 14:47:13

Так а где всё это, новые версии IBX от *Rik*?
Ссылочка не работает.
Аватара пользователя
Tango
постоялец
 
Сообщения: 156
Зарегистрирован: 31.05.2012 17:07:30

Re: IBX For Lazarus (Firebird Express)

Сообщение *Rik* » 12.03.2015 17:57:26

Tango писал(а):Так а где всё это, новые версии IBX от *Rik*?
Ссылочка не работает.

Проверил, работает, может проблемы какие были с доступом к серверу...
http://visual-t.ru/files/components.7z
или тут можно найти
http://visual-t.ru/download.html
В архиве components.7z компоненты VisualTech, TxDBF, IBX, можете извлечь только IBX.
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 426
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: IBX For Lazarus (Firebird Express)

Сообщение Tango » 13.03.2015 10:54:13

А это качается, а вот обещанных AllowAutoStart и других там нет.
Аватара пользователя
Tango
постоялец
 
Сообщения: 156
Зарегистрирован: 31.05.2012 17:07:30

Re: IBX For Lazarus (Firebird Express)

Сообщение *Rik* » 13.03.2015 12:29:17

Tango писал(а):А это качается, а вот обещанных AllowAutoStart и других там нет.

AllowAutoStart - такого там и не было никогда...
Если Вы про транзакции, то TIBDataSet, TIBStoredProc, TIBQuery:
AutoStartTransaction, AutoCommit.
Для TIBDataSet для Select запросов, если на момент старта запроса Transaction уже активна, то AutoCommit не сработает. Т.е.
Если сделать руками StartTranscation
Код: Выделить всё
Transaction1.StartTransaction;
IBDataSet1.Open;
.....
IBDataSet1.Close;
Transaction1.Commit;

то Commit или Rollback то-же завершать нужно вручную. Т.е. AutoCommit работает если был AutoStart.

Для UpdateTransaction, для запросов из InsertSQL,ModifySQL,DeleteSQL, если указан AutoStart и на момент выполнения запроса UpdateTransaction не активна, то это вызовет автоматический старт UpdateTransaction. Если указан AutoCommit, то после выполнения любого из пишущих запросов будет вызван UpdateTransaction.Commit.
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 426
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: IBX For Lazarus (Firebird Express)

Сообщение Tango » 16.03.2015 11:46:31

Спасибо.
Аватара пользователя
Tango
постоялец
 
Сообщения: 156
Зарегистрирован: 31.05.2012 17:07:30

Re: IBX For Lazarus (Firebird Express)

Сообщение *Rik* » 18.03.2015 13:58:16

версия 2.2.2
Добавлена поддержка параметра транзакции isc_tpb_lock_timeout. Доступен только для FireBird версии 2.1 и выше. Применяется совместно с парметром
isc_tpb_wait. Параметр isc_tpb_lock_timeout указывает время ожидания в секундах, в случае, если изменяемая запись заблокирована другой транзакцией,
по истечении этого времени ожидания будет выдана ошибка блокировки. Если isc_tpb_lock_timeout не указан, время ожидания когда конкурирующая
транзакция отпустит запись с параметром isc_tpb_wait будет бесконечным. Применение, в параметрах транзакции указать lock_timeout=10
(здесь 10 - количество секунд ожидания). Переделан редактор компонента TIBTransaction, в нем доступен пункт "FB wirte", в котором wait применяется
совместно с lock_timeout.
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 426
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: IBX For Lazarus (Firebird Express)

Сообщение *Rik* » 25.03.2015 19:00:39

версия 2.2.3
TIBDataSet добавлено свойство CancelActon: Boolean (по умолчанию True), оно
работает совместно с AutoCommit и срабатывает при вызове TIBDataSet.Cancel, если при отмене записи UpdateTransaction.inTransaction то к транзакции
будут применены действия в соответствии со значением свойства UpdateTransaction.DefaultAction для завершения транзакции. Например может возникнуть
ситуация: при вызове метода Post, UpdateTransaction стартует транзакцию, но на стороне сервера обнаруживается ошибка и возникает исключение и
TIBDataSet.Post не завершается, набор данных остается в состоянии редактирования. Пользователь отменяет запись, которой не удалось сделать Post,
но UpdateTransaction остается активной (можно увидеть в мониторе транзакций). Учитывая параметры, с которыми стартует UpdateTranscation, видно,
что транзакция влияет на Oldest Active Transaction (OAT), она просто застряет до тех пор пока жив сам TIBDataSet, либо в результате следующей
операции с этой-же транзакцией не будет выполнен Commit или Rollback. Но до тех пор пока транзакция в активном состоянии, будут накапливаться
версии записей, причем не связанные напрямую с данной транзакцией т.к. OAT застряла и не движется, это приведет к чрезмерному потреблению ресурсов
сервера и замедлению работы
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 426
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: IBX For Lazarus (Firebird Express)

Сообщение Nick74 » 02.06.2017 12:47:46

Повторю еще тут вопрос...

Подскажите можно ли читать через IBX из Firebird DECIMAL-поля с количеством знаков после запятой больше 4 знаков? Поле Decimal(18,6)
IBX определяет эти поля как TFloatField, но возвращает только 4 знака после запятой.
Читаю значение как QueryFIELDNAME.AsFloat или как .Value или отображение в DBGrid - без разницы, только 4 знака (Хоть DBGrid и показывает мне 6, но последние нули всегда).
Nick74
новенький
 
Сообщения: 25
Зарегистрирован: 15.03.2017 13:55:06
Откуда: Москва

Re: IBX For Lazarus (Firebird Express)

Сообщение *Rik* » 02.06.2017 13:50:03

Я проверю...
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 426
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: IBX For Lazarus (Firebird Express)

Сообщение Nick74 » 02.06.2017 14:01:45

Походу проблема в поле PRECISION у TFloatField, которое устанавливается в 2 по умолчанию для всех полей, получающихся из DECIMAL и из DOUBLE PRECISION.
Если ручками поменять на 18, то показываются все цифры. Я правда не осознал почему 2 дает 4 знака после запятой...

Добавлено спустя 13 минут 45 секунд:
Ничего не понял, сейчас вдруг заработало.
Про Decimal правда не знаю, надо проверить еще, но для DOUBLE PRECISION все заработало как надо. Такое ощущение, что Lazarus где-то кешировал метаданные столбцов и не сразу поменял их типы...
Nick74
новенький
 
Сообщения: 25
Зарегистрирован: 15.03.2017 13:55:06
Откуда: Москва

Re: IBX For Lazarus (Firebird Express)

Сообщение *Rik* » 02.06.2017 14:33:46

Там с маской, которая формат отображения задает, косяк похоже. Попробуйте задать для вашего поля формат отображения руками.
У TIBDataSet свойство FieldsFormats, в него добавьте строку ИмяПоля=#,##0.000000
В свойстве EditFormats задайте ИмяПоля=0.000000
Я потом покулупаюсь из-за чего так происходит. И какая версия FireBird у Вас?

Изображение
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 426
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Пред.След.

Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru