ujifОбновите ibx, старую версию удалите
http://visual-t.ru/files/components.7zИз архива извлеките только ibx, положите вместо старой. В тестовом проекте сотрите папку lib.
Загрузите Lazarus переустановите ibx, затем загружайте тестовый проект.
Пробуем подключиться к таблице.
На форме лежит компонент TESTTABLE: TIBDataSet, у него есть 5 свойства для работы с SQL: SelectSQL, RefreshSQL, InsertSQL, ModifySQL, DeleteSQL
SelectSQL - читающий запрос, который используется что-бы получить с сервера набор данных из одной или нескольких таблиц. Набор данных может включать как одну так и множество строк.
RefreshSQL - читающий запрос, который возвращает с сервера одну строку для обновления текущей записи по команде Refresh. Пример TESTTABLE.Refresh - перечитает с сервера только текущую строку.
Модифицирующие запросы для изменения данных.
InsertSQL - будет вызываться для вставки записи в таблицу.
ModifySQL - будет вызываться для редактирования записи
DeleteSQL - будет вызываться для удаления записи.
Теперь нужно вписать запросы.
Выбираем в инспекторе SelectSQL, жмем кнопочку в редакторе, для вызова визуального редактора.
В редакторе TableName выберите свою таблицу, нажмите кнопку GenerateSQL, текст запроса автоматически формируется, типа того что на скриншоте, вместо полей после слова Select и до слова From можете поставить *, которая говорит о том, что выбирать нужно все поля, если вы в таблице добавите поле (столбец), этот запрос не придется переписывать. Пример Select * From TESTTABLE - выберет все записи из таблицы.
Жмем ОК.
Заполняем запрос Refresh SQL.
В нем должен быть тот-же самый запрос, что и в SelectSQL, но только ограниченный одной записью, для этого добавим к запросу условие выборки. Должно получится примерно следующее:
- Код: Выделить всё
Select * From TESTTABLE
Where TESTTABLE_ID = :TESTTABLE_ID
В этом условии Where, первое слово которое идет следующим это TESTTABLE_ID - это имя ключевого поля для вашей таблицы. На моем скриншоте Вы видите что ключевое поле это BANK_ID (primary keys), для моего запроса я должен бы был написать следующее Select * From BANK Where BANK_ID = :BANK_ID. То что идет после =, а это :BANK_ID или :TESTTABLE_ID - это параметр, куда можно подставить какое-нибудь значение, в нашем случае, всё будет работать автоматически, имя параметра, совпадает с именем поля, поэтому текущее значение будет подставляться автоматически.
Редактируем содержимое InsertSQL, генерим запрос как и 2 предыдущие, после нажатия кнопки Generate SQL, сформированный текст будет выглядеть примерно так:
- Код: Выделить всё
Insert Into TESTTABLE(TESTTABLE_ID, STRFIELD, INTFIELD, NUMFIELD, AUTOFI)
Values(:TESTTABLE_ID, :STRFIELD, :INTFIELD, :NUMFIELD, :AUTOFI)
Этот запрос для вставки записи мы должны переделать:
- Код: Выделить всё
Insert Into TESTTABLE(STRFIELD, INTFIELD, NUMFIELD, AUTOFI)
Values(:STRFIELD, :INTFIELD, :NUMFIELD, :AUTOFI)
Returning TESTTABLE_ID
Обратите внимание, я убрал ключевое поле из текста запроса и поставил его в Returning, если вы помните, когда мы создавали таблицу, мы поставили галочку автоинкремент, создать генератор и триггер. Значение ключевого поля будет генериться на сервере и через команду Returning, будет возвращаться в наш набор данных, где автоматически подставится в новую строку.
Сам запрос Insert говорит что мы вставляем запись в таблицу, после Insert в скобках перечисляются поля, значения которых мы хотим передать на сервер, здесь могут быть все поля таблицы, а могут быть и не все а только некоторые из них. После слова Values в скобочках перечисляются значения тех самых полей, у нас здесь прописаны параметры, с теми же самыми именами, что и имена полей, во время работы вместо параметров будут подставляться значения и запрос будет выглядеть примерно так:
- Код: Выделить всё
Insert Into TESTTABLE(STRFIELD, INTFIELD, NUMFIELD, AUTOFI)
Values('Это просто строка', 2542, 125.32, 34)
Returning TESTTABLE_ID
Редактируем содержимое ModifySQL.
Генерим запрос как и все предыдущие, после генерации должно получиться что-то вроде:
- Код: Выделить всё
Update TESTTABLE A Set
A.TESTTABLE_ID = :TESTTABLE_ID,
A.STRFIELD = :STRFIELD,
A.INTFIELD = :INTFIELD,
A.NUMFIELD = :NUMFIELD,
A.AUTOFI = :AUTOFI
Where A.TESTTABLE_ID = :OLD_TESTTABLE_ID
Этот запрос нужно исправить, он содержит строку A.TESTTABLE_ID = :TESTTABLE_ID, которая подразумевает изменение значения ключевого поля, это есть великое зло, ключевое поле должно быть не изменным. При желании можно изменить инструкцию Where
- Код: Выделить всё
Update TESTTABLE A Set
A.STRFIELD = :STRFIELD,
A.INTFIELD = :INTFIELD,
A.NUMFIELD = :NUMFIELD,
A.AUTOFI = :AUTOFI
Where A.TESTTABLE_ID = :TESTTABLE_ID
Этот запрос можно перевести как
- Код: Выделить всё
Обновить TESTTABLE установить
Поле1 = Значение1,
Поле2 = Значение2
Где КлючевоеПоле = ЗначениеКлюча
В нашем запросе вместо Значение стоят параметры :STRFIELD, :INTFIELD и т.д. Когда запрос будет передан на сервер, вместо параметров будут подставлены значения и запрос примет вид:
- Код: Выделить всё
Update TESTTABLE A Set
A.STRFIELD = 'Это отредактированное значение',
A.INTFIELD = 2433,
A.NUMFIELD = 1434455.43,
A.AUTOFI = 323
Where A.TESTTABLE_ID = 1024
Обратите внимание на инструкцию Where, здесь говорится, что обновятся данные строки в таблице у которой значение ключевого поля 1024.
Генерим последний запрос DeleteSQL.
После генерации получим следующее:
- Код: Выделить всё
Delete From TESTTABLE A
Where A.TESTTABLE_ID = :TESTTABLE_ID
Значение этого запроса можно перевести как
- Код: Выделить всё
Удалить из TESTTABLE
где TESTTABLE_ID (Ключевое поле) = :Параметр
После того как все запросы прописаны, можно попробовать собрать приложение и запустить его на выполнение, таблица должна редактироваться, только ключевое поле TESTTABLE_ID не редактируйте, потом я скажу как его защитить от изменений.