Запутался с FIBDataset в FIBPlus. Запрос из ХП.

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Leshgan
Сообщения: 18
Зарегистрирован: 05 фев 2007, 16:22

Запутался с FIBDataset в FIBPlus. Запрос из ХП.

Сообщение Leshgan » 02 мар 2007, 14:24

Подскажите пожалуйста по вызову ХП в 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')
возвращает нужный результат.
Где я делаю нет так?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 02 мар 2007, 14:29

Замени AsString на AsDateTime для начала.
Заодно проверь, не включена ли регистрочувствительность имен параметров.

Leshgan
Сообщения: 18
Зарегистрирован: 05 фев 2007, 16:22

Сообщение Leshgan » 02 мар 2007, 14:31

И вот еще вопрос.
Всё то же самое, те же компоненты, толко делаю в pFIBDatase в режиме разработки SelectSQL:

Код: Выделить всё

SELECT * FROM
    MAIN_BASE 
Запускаю приложение, но вижу что за сегодняшний день не все записи. То есть как будто pFIBDatabse делает запросы из кэша за утреннее время. Послеобеденные записи не видно. Подскажите что и тут я делаю не так.
Спасибо.

Leshgan
Сообщения: 18
Зарегистрирован: 05 фев 2007, 16:22

Сообщение Leshgan » 02 мар 2007, 14:39

Dimitry Sibiryakov писал(а):Замени AsString на AsDateTime для начала.
Заодно проверь, не включена ли регистрочувствительность имен параметров.
AsDateTime привело к такому же результату, точнее к его отсутствию :(
pFIBDatabase.UpperOldNames = False

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 02 мар 2007, 14:41

Не к той базе коннектишься.

Leshgan
Сообщения: 18
Зарегистрирован: 05 фев 2007, 16:22

Сообщение Leshgan » 02 мар 2007, 14:50

Dimitry Sibiryakov писал(а):Не к той базе коннектишься.
Проверил. К той. :shock:

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 02 мар 2007, 14:54

TpFIBDatabase во design-time активен? Проверь, чтобы при старте Connected = False было.

Leshgan
Сообщения: 18
Зарегистрирован: 05 фев 2007, 16:22

Сообщение Leshgan » 02 мар 2007, 16:24

CyberMax писал(а):TpFIBDatabase во design-time активен? Проверь, чтобы при старте Connected = False было.
удивительное дело! Помогло! Спасбио большое. Никогда бы не подумал что в этом может быть дело.
2All: а по первому вопросу что можете сказать? На счет Запроса из ХП с входными параметрами?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 02 мар 2007, 17:03

Параметры Date - это строки? И в формате mm.dd.yy или dd/mm/yy?

Leshgan
Сообщения: 18
Зарегистрирован: 05 фев 2007, 16:22

Сообщение Leshgan » 02 мар 2007, 17:38

Код: Выделить всё

  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

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 02 мар 2007, 18:10

Leshgan писал(а): В формате mm.dd.yy
Нет на сервере такого формата.
Leshgan писал(а): По дебагу смотрел, значения принимают '02.03.2007'
То есть, второе марта 2007 года.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 02 мар 2007, 18:14

В чем смысл преобразования даты/строки? Попробуй сразу присваивать дату из пикеров.

Leshgan
Сообщения: 18
Зарегистрирован: 05 фев 2007, 16:22

Сообщение Leshgan » 05 мар 2007, 10:39

Да я уже и как дату, как datetime - пусто :evil:
Итак, подскажите как в делфи выполнить ХП с входными параметрами, возвращающую набор данных?
Вот как я написал:

Код: Выделить всё

 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 работал.

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Сообщение Attid » 05 мар 2007, 11:02

Код: Выделить всё

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)'; 
а с датами сколько рабол все нормально там, может что с транзакциями что не то ? попробуй промежуток побольше на месяц например ..

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 05 мар 2007, 11:37

Leshgan писал(а):Вроде как выполняется что-то, но на DBGrid'е пусто.
Может, у тебя грид динамически не формирует поля?
Например, если уже создано какое-то, причём не возвращаемое твоим запросом.
Опять же, из топика я не понял, если в программе (не в эксперте) запрос с параметрами заменить на
select sum_all, sum_direct, sum_inet1, sum_inet2 from sums('02.03.2007','02.03.2007'),
то что-нибудь выводится?

Slavik
Сообщения: 115
Зарегистрирован: 17 янв 2007, 11:52

Сообщение Slavik » 05 мар 2007, 11:43

Я бы посоветовал ещё в подобных ситуациях включать SQL-монитор и смотреть, какой конкретно передаётся на сервер запрос и с какими параметрами.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 05 мар 2007, 12:07

А также после Open вывести через ShowMessage() RecordCount датасета, чтобы точно знать, где теряются данные. А то ведь и в самом деле, может где-то в DataSource и Grid'е пропадают...

Leshgan
Сообщения: 18
Зарегистрирован: 05 фев 2007, 16:22

Сообщение Leshgan » 05 мар 2007, 14:03

WildSery писал(а):Может, у тебя грид динамически не формирует поля?
Например, если уже создано какое-то, причём не возвращаемое твоим запросом.
Боже, аж стыдно признаваться :( Спасибо, так и было!!! Как же я забыть мог.
](*,)
Через ShowMessage() вывел результаты.
Кстати почему-то в pFIBDataSet не выводится в выпадающем списке свойтсво FieldByName, но оно есть.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 05 мар 2007, 16:47

Leshgan писал(а):Кстати почему-то в pFIBDataSet не выводится в выпадающем списке свойтсво FieldByName, но оно есть.
Да, есть такая проблема в Delphi 7. В Delphi 2005 и старше она пофиксена.

Leshgan
Сообщения: 18
Зарегистрирован: 05 фев 2007, 16:22

Сообщение Leshgan » 12 мар 2007, 13:43

И снова вот вопрос по 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 - не получается.

Ответить