Работа с IBX

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
jenya7
Сообщения: 16
Зарегистрирован: 07 окт 2005, 12:26

Работа с IBX

Сообщение jenya7 » 15 апр 2006, 15:18

Привет всем!
При переходе на компоненты IBX возникла проблема с редактированием записи.

пробовал так

IBSQL1.SQL.Clear;
IBSQL1.SQL.Add('UPDATE USERACCT SET IS_ACTIVE = ' + Trim (Edit1.Text) + ',LASTDATE = ' + DateTimeToStr(Now));
IBSQL1.SQL.Add('WHERE USERNBR = 1');
IBSQL1.ExecQuery;

генерирует sql error - не нравится формат даты
раньше все было просто
ExecQuery.Edit;
ExecQuery.FieldByName('IS_ACTIVE').AsInteger := 1;
ExecQuery.FieldByName('LAST_DATE').AsDateTime:=Now;
ExecQuery.Post;

при работе с IBDataSet сразу возник вопрос - как передать параметр
в WHERE.
раньше -
ExecQuery.Sql.Add('SELECT * FROM USERACCT');
ExecQuery.Sql.Add('WHERE USERNBR = '+IntToStr(CurrentUserNbr));
где CurrentUserNbr - глобальная переменная.
тееперь пытаюсь так -
IBDataSet1.Database := IBDatabase1;
IBDataSet1.Transaction := IBTransaction1;
IBDataSet1.SelectSQL.Strings['SELECT * FROM USERACCT WERE USERNBR = '+ Trim(Edit1.Text)];
IBDataSet1.Active := True;
выдает incompatible types string & integer

p.s статью "Работа с IBX или использование InterBase eXpress в приложениях" читал - статья прекрасная, но где живые примеры!!!
один кусок кода заменяет иногда целую книгу!

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 16 апр 2006, 01:15

конечно, статью я дорабатываю, но не знать запросы с параметрами ...

select * from table
where field = :param

В в том же хелпе по Delphi примеров море.

кроме того, в последнем приведенном куске с ibdataset - неправильная работа с массивом строк...

надо
SQL.Clear;
SQL.Add('select ...');
и т.п.

DS
Сообщения: 41
Зарегистрирован: 17 фев 2005, 16:54

Re: Работа с IBX

Сообщение DS » 16 апр 2006, 04:11

jenya7 писал(а): IBSQL1.SQL.Add('UPDATE USERACCT SET IS_ACTIVE = ' + Trim (Edit1.Text) + ',LASTDATE = ' + DateTimeToStr(Now));
Не, ну можно и так писать, но там тебе кавычек доковырять надо
Послушай лучше kdv:

IBSQL1.SQL.Add('UPDATE USERACCT SET IS_ACTIVE = :IS_ACTIVE, LASTDATE = :LASTDATE');
IBSQL1.SQL.Add('WHERE USERNBR = :USERNBR');
...
IBSQL1.ParamByName('IS_ACTIVE').AsString := Trim (Edit1.Text);
IBSQL1.ParamByName('LASTDATE').AsDateTime := Now;
IBSQL1.ParamByName('USERNBR').AsInteger := 1;
jenya7 писал(а): p.s статью "Работа с IBX или использование InterBase eXpress в приложениях" читал - статья прекрасная, но где живые примеры!!!
один кусок кода заменяет иногда целую книгу!
:lol:

jenya7
Сообщения: 16
Зарегистрирован: 07 окт 2005, 12:26

Сообщение jenya7 » 16 апр 2006, 16:28

большое спасибо за ответы! :D
единственно что хотелось уточнить - запрос на выборку
select * from table
where field = :param

а параметр я должен приравнять к моей переменной?
param := CurrentUserNbr;

DS
Сообщения: 41
Зарегистрирован: 17 фев 2005, 16:54

Сообщение DS » 16 апр 2006, 19:47

jenya7 писал(а): where field = :param
...
а параметр я должен приравнять к моей переменной?
param := CurrentUserNbr;
ParamByName('param').AsInteger := CurrentUserNbr;

Mike Lepeshko
Сообщения: 5
Зарегистрирован: 09 фев 2005, 15:57

Сообщение Mike Lepeshko » 04 май 2006, 13:40

Объясните секреты работы с IBX. Есть набор инструкций (упрощаю):
IBDataSet1.Close;
IBDataSet1.SelectSQL.Clear;
IBDataSet1.SelectSQL.Add('SELECT P_DATE, P_NUMBER from Protocols');
IBDataSet1.SelectSQL.Add('WHERE P_DATE = :Mask_edit');
IBDataSet1.SelectSQL.Add('ORDER BY P_DATE');
IBDataSet1.Prepare;
IBDataSet1.ParamByName('Mask_edit').AsString := MaskEdit1.Text;
IBDataSet1.Open;

Запустив это из IBExpert убедился, что запрос отрабатывает не вопрос, а вот из выполняя это из Delphi грид не обновляется, пустой после нажатия на кнопку. Где я не прав?

И ещё. При попытке вставки новой записи в таблицу (опять же условно - 3 поля: ID, Field_1, Field_2) через FieldByName компилятор требует ввода значения для ID, т.е. чтобы все три поля были заполнены. Логично, но если для этого поля стоит генератор и создан триггер "before insert" автоматически формирующий значение ID на сервере, то как быть?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 04 май 2006, 15:44

пустой после нажатия на кнопку. Где я не прав?
не подключил грид к датасету.
автоматически формирующий значение ID на сервере, то как быть?
прочитать www.ibase.ru/devinfo/generator.htm

Mike Lepeshko
Сообщения: 5
Зарегистрирован: 09 фев 2005, 15:57

Сообщение Mike Lepeshko » 04 май 2006, 17:02

Подключил. Грид увязан на датасорс, тот в свою очередь на датасет.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 04 май 2006, 18:06

так. посмотри на свой запрос. ты дату вводишь в виде текста. Сервер воспринимает в виде текста только жесткий формат даты.
Следовательно, если уж ты делаешь параметр, то присваивай его не как строку, а как
asDate или asDateTime. И преобразуй СТРОКУ в ДАТУ на клиентской стороне (DateTimeToStr и т.п.).

меня удивляет такое отношение к написанию кода. Ты БЕЗ параметра проверял? С числовым параметром проверял? Нет? О чем тогда разговор про "не работает"?

Ответить