Страница 1 из 1

Работа с IBX

Добавлено: 15 апр 2006, 15:18
jenya7
Привет всем!
При переходе на компоненты 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 в приложениях" читал - статья прекрасная, но где живые примеры!!!
один кусок кода заменяет иногда целую книгу!

Добавлено: 16 апр 2006, 01:15
kdv
конечно, статью я дорабатываю, но не знать запросы с параметрами ...

select * from table
where field = :param

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

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

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

Re: Работа с IBX

Добавлено: 16 апр 2006, 04:11
DS
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:

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

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

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

Добавлено: 04 май 2006, 13:40
Mike Lepeshko
Объясните секреты работы с 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 на сервере, то как быть?

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

Добавлено: 04 май 2006, 17:02
Mike Lepeshko
Подключил. Грид увязан на датасорс, тот в свою очередь на датасет.

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

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