Некорректная работа UDF

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

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

Ответить
slc
Сообщения: 15
Зарегистрирован: 22 авг 2006, 11:45

Некорректная работа UDF

Сообщение slc » 03 апр 2007, 14:24

Доброго времени суток!

Использую IB 5.5, Delphi 7. Есть тестовая UDF следующего содержания

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

CREATE PROCEDURE TEST (
    DATE_BEGIN DATE,
    DATE_END DATE)
RETURNS (
    D1 DATE,
    D2 DATE)
AS
begin
  D1 = :Date_Begin;
  D2 = :Date_End;
end
===

Фрагмент текста программы:
===
  date1:=Yesterday;
  date2:=Tomorrow;

  with IBQuery1 do
    begin
      ParamByName('date_begin').AsDateTime:=date1;
      ParamByName('date_end').AsDateTime:=date2;
      SQL.Clear;
      SQL.Add('SELECT d1, d2 FROM TEST(:date_begin, :date_end)');
      Open;

      with Memo1.Lines do
        begin
          Clear;
          Add('Значение переменной:');
          Add('date1 = ' + DateToStr(date1));
          Add('date2 = ' + DateToStr(date2));
          Add('Значение параметра:');
          Add('date_begin = ' + DateToStr(ParamByName('date_begin').AsDate));
          Add('date_end = ' + DateToStr(ParamByName('date_end').AsDate));
          Add('Значение функции:');
          Add('d1 = ' + DateToStr(FieldByName('d1').AsDateTime));
          Add('d2 = ' + DateToStr(FieldByName('d2').AsDateTime));
        end;
    end;

Проблемы заключаются в следующем:
1) При первом исполнении данного кода значения переменной и параметра выводятся правильно, а возвращаемое функцией - 30.12.1899.
2) При втором и т.д. исполнении - верным остается только значение переменной, а значения параметра и возвращаемое функцией - 30.12.1899.

Подскажите, где ошибка?

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

Сообщение WildSery » 03 апр 2007, 15:46

1. Пользуйся кнопкой "Code" для выделения кода

2.

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

ParamByName('date_end').AsDateTime:=date2; 
SQL.Clear; 
SQL.Add('SELECT d1, d2 FROM TEST(:date_begin, :date_end)');
У тебя сперва присваивается значение параметру, затем меняется сам текст SQL, и неизвестно (сервер не телепат), будет ли там вообще такой параметр.
Надо так:

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

SQL.Text:='SELECT d1, d2 FROM TEST(:date_begin, :date_end)';
Prepare;
ParamByName('date_end').AsDateTime:=date2;
3. При чём тут UDF?

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

Сообщение kdv » 03 апр 2007, 15:47

Использую IB 5.5
плохо, очень плохо. Надо 5.6.
Проблемы заключаются в следующем
отвечаю, в чем проблема:

1. процедура это не UDF
2. в процедуре надо было написать волшебное слово SUSPEND
3. читай документацию или книжки.

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

Сообщение WildSery » 03 апр 2007, 15:50

Да, кстати, про саспенд забыл :oops:

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

Сообщение WildSery » 03 апр 2007, 15:50

kdv писал(а):плохо, очень плохо. Надо 5.6.
Кстати, а он ещё продаётся?

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

Сообщение kdv » 03 апр 2007, 15:52

Кстати, а он ещё продаётся?
только под заказ, запросом через представительство Borland/Codegear. И понятно, в количестве не 1 шт.

Медиакитов нет, все, они сгинули. У меня есть диск медиакита, могу сдублировать (при покупке лицензий через нас).

slc
Сообщения: 15
Зарегистрирован: 22 авг 2006, 11:45

Сообщение slc » 03 апр 2007, 15:56

WildSery писал(а): Надо так:

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

SQL.Text:='SELECT d1, d2 FROM TEST(:date_begin, :date_end)';
Prepare;
ParamByName('date_end').AsDateTime:=date2;

Спасибо, помогло.

WildSery писал(а):
3.
При чём тут UDF?
Да, не при чем. Ошибся в термине.

Ответить