Страница 1 из 2
Запутался с FIBDataset в FIBPlus. Запрос из ХП.
Добавлено: 02 мар 2007, 14:24
Leshgan
Подскажите пожалуйста по вызову ХП в FIBplus
Я делал по книге "Мир Interbase", сервер FB2, Delphi 7.
На форме pFIBDatabase, pFIBDataset, pFIBTransaction, DataSource.
На стандартных компонентах IB я делал так:
Код: Выделить всё
With form1.IBQuery2 do
begin
Close;
SQL.Clear;
SQL.Add('select sum_all, sum_direct, sum_inet1, sum_inet2 from sums(:FROMDATE, :TODATE)');
ParamByName('fromdate').AsString:= Date1;
ParamByName('todate').AsString:= Date2;
Open;
end;
Делаю для FIBplus по аналогии:
Код: Выделить всё
With pFIBDataSet1 do
begin
Close;
SQLs.SelectSQL.Clear;
SQLs.SelectSQL.Add('select sum_all, sum_direct, sum_inet1, sum_inet2 from sums(?FROMDATE, ?TODATE)');
ParamByName('fromdate').AsString:= Date1;
ParamByName('todate').AsString:= Date2;
Open;
end;
Возвращает пустой результат
Проверяю в IB Expert, пишу
select * from sums('02.03.2007','02.03.2007')
возвращает нужный результат.
Где я делаю нет так?
Добавлено: 02 мар 2007, 14:29
Dimitry Sibiryakov
Замени AsString на AsDateTime для начала.
Заодно проверь, не включена ли регистрочувствительность имен параметров.
Добавлено: 02 мар 2007, 14:31
Leshgan
И вот еще вопрос.
Всё то же самое, те же компоненты, толко делаю в pFIBDatase в режиме разработки SelectSQL:
Запускаю приложение, но вижу что за сегодняшний день не все записи. То есть как будто pFIBDatabse делает запросы из кэша за утреннее время. Послеобеденные записи не видно. Подскажите что и тут я делаю не так.
Спасибо.
Добавлено: 02 мар 2007, 14:39
Leshgan
Dimitry Sibiryakov писал(а):Замени AsString на AsDateTime для начала.
Заодно проверь, не включена ли регистрочувствительность имен параметров.
AsDateTime привело к такому же результату, точнее к его отсутствию

pFIBDatabase.UpperOldNames = False
Добавлено: 02 мар 2007, 14:41
Dimitry Sibiryakov
Не к той базе коннектишься.
Добавлено: 02 мар 2007, 14:50
Leshgan
Dimitry Sibiryakov писал(а):Не к той базе коннектишься.
Проверил. К той.

Добавлено: 02 мар 2007, 14:54
CyberMax
TpFIBDatabase во design-time активен? Проверь, чтобы при старте Connected = False было.
Добавлено: 02 мар 2007, 16:24
Leshgan
CyberMax писал(а):TpFIBDatabase во design-time активен? Проверь, чтобы при старте Connected = False было.
удивительное дело! Помогло! Спасбио большое. Никогда бы не подумал что в этом может быть дело.
2All: а по первому вопросу что можете сказать? На счет Запроса из ХП с входными параметрами?
Добавлено: 02 мар 2007, 17:03
Merlin
Параметры Date - это строки? И в формате mm.dd.yy или dd/mm/yy?
Добавлено: 02 мар 2007, 17:38
Leshgan
Код: Выделить всё
Date1:=DateToStr(Form1.DateTimePicker1.Date);
Date2:=DateToStr(Form1.DateTimePicker2.Date);
В формате mm.dd.yy
По дебагу смотрел, значения принимают '02.03.2007'
Опять же в IB Expert запрос вида
Код: Выделить всё
select * from sums('02.03.2007','02.03.2007')
выполняется. Диалект базы = 3
Добавлено: 02 мар 2007, 18:10
Merlin
Leshgan писал(а):
В формате mm.dd.yy
Нет на сервере такого формата.
Leshgan писал(а):
По дебагу смотрел, значения принимают '02.03.2007'
То есть, второе марта 2007 года.
Добавлено: 02 мар 2007, 18:14
CyberMax
В чем смысл преобразования даты/строки? Попробуй сразу присваивать дату из пикеров.
Добавлено: 05 мар 2007, 10:39
Leshgan
Да я уже и как дату, как datetime - пусто
Итак, подскажите как в делфи выполнить ХП с входными параметрами, возвращающую набор данных?
Вот как я написал:
Код: Выделить всё
pFIBDatabase1.Open;
With pFIBDataSet1 do
begin
Close;
SQLs.SelectSQL.Clear;
SQLs.SelectSQL.Add('select sum_all, sum_direct, sum_inet1, sum_inet2 from sums(:FROMDATE, :TODATE)');
ParamByName('FROMDATE').AsDateTime:= Form1.DateTimePicker1.DateTime;
ParamByName('TODATE').AsDateTime:= Form1.DateTimePicker2.DateTime;
Open;
end;
Вроде как выполняется что-то, но на DBGrid'е пусто.
DBGrid.DataSource = DataSource3
DataSource3.DataSet = pFIBDataSet1
pFIBDataSet1.DataBase = pFIBDatabase1
Какие еще данные...
Входные параметры в ХП
sums имеют тип TIMESTAMP
Аналогичный код на компоненте IBQuery работал.
Добавлено: 05 мар 2007, 11:02
Attid
Код: Выделить всё
SQLs.SelectSQL.Clear;
SQLs.SelectSQL.Add('select sum_all, sum_direct, sum_inet1, sum_inet2 from sums(:FROMDATE, :TODATE)');
можно заменить на
Код: Выделить всё
SQLs.SelectSQL.text := 'select sum_all, sum_direct, sum_inet1, sum_inet2 from sums(:FROMDATE, :TODATE)';
а с датами сколько рабол все нормально там, может что с транзакциями что не то ? попробуй промежуток побольше на месяц например ..
Добавлено: 05 мар 2007, 11:37
WildSery
Leshgan писал(а):Вроде как выполняется что-то, но на DBGrid'е пусто.
Может, у тебя грид динамически не формирует поля?
Например, если уже создано какое-то, причём не возвращаемое твоим запросом.
Опять же, из топика я не понял, если в программе (не в эксперте) запрос с параметрами заменить на
select sum_all, sum_direct, sum_inet1, sum_inet2 from sums('02.03.2007','02.03.2007'),
то что-нибудь выводится?
Добавлено: 05 мар 2007, 11:43
Slavik
Я бы посоветовал ещё в подобных ситуациях включать SQL-монитор и смотреть, какой конкретно передаётся на сервер запрос и с какими параметрами.
Добавлено: 05 мар 2007, 12:07
CyberMax
А также после Open вывести через ShowMessage() RecordCount датасета, чтобы точно знать, где теряются данные. А то ведь и в самом деле, может где-то в DataSource и Grid'е пропадают...
Добавлено: 05 мар 2007, 14:03
Leshgan
WildSery писал(а):Может, у тебя грид динамически не формирует поля?
Например, если уже создано какое-то, причём не возвращаемое твоим запросом.
Боже, аж стыдно признаваться

Спасибо, так и было!!! Как же я забыть мог.
Через ShowMessage() вывел результаты.
Кстати почему-то в pFIBDataSet не выводится в выпадающем списке свойтсво FieldByName, но оно есть.
Добавлено: 05 мар 2007, 16:47
CyberMax
Leshgan писал(а):Кстати почему-то в pFIBDataSet не выводится в выпадающем списке свойтсво FieldByName, но оно есть.
Да, есть такая проблема в Delphi 7. В Delphi 2005 и старше она пофиксена.
Добавлено: 12 мар 2007, 13:43
Leshgan
И снова вот вопрос по IBDataSet.
Может отправите к описанию компоненты, а то купить купили, а как пользоваться - туго что-то. Раньше юзал IBQuery - проще было.
Код: Выделить всё
Param:='insert into base '+
'(nom_doc, name_tv, izgot, cena_zav, kol, nac_pos, nds, cena, kol_zak, cena_k, kol_zav, date_good, upak) '+
'values ("'+Temp_nom_doc+'", '+ name_tv+', '+izgot+', '+
cena_z+', '+kol+', '+nac_pos+', '+nds+', '+cena+', '+
kol_z+', '+cena_k+', '+kol_zk+', '+data_good+', '+upak+')';
with pFIBDataSet1 do
begin
SQLs.InsertSQL.Clear;
SQLs.InsertSQL.Add(Param);
try
Insert;
pFIBTransaction1.Commit;
except
pFIBTransaction1.Rollback;
ShowMessage('Ошибка при записи строки в base!!!');
exit;
end;
Ничего не записывает в базу. Код переделывался из IBQuery, там просто методом Open всё выполнялось. В FIBplus пробовал метод Insert, Append - не получается.