UDF DATE Firebird 1.5 -> 2.1

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

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

Ответить
alex12389
Сообщения: 3
Зарегистрирован: 10 мар 2011, 13:08

UDF DATE Firebird 1.5 -> 2.1

Сообщение alex12389 » 10 мар 2011, 13:17

Есть функция в UDF

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

DECLARE EXTERNAL FUNCTION IB_LAST_DATE_IN_MONTH
    INTEGER,
    INTEGER
RETURNS DATE
ENTRY_POINT 'IB_LAST_DATE_IN_MONTH' MODULE_NAME 'UDF.DLL';
В firebird 1.5 работала в 2.1 ошибка:

expression evaluation not supported.
value exceeds the range for valid dates.

Как в 2.1 правильно вернуть дату из UDF

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: UDF DATE Firebird 1.5 -> 2.1

Сообщение hvlad » 10 мар 2011, 15:11

Возвращать правильные даты. Механизм возврата не менялся.

alex12389
Сообщения: 3
Зарегистрирован: 10 мар 2011, 13:08

Re: UDF DATE Firebird 1.5 -> 2.1

Сообщение alex12389 » 10 мар 2011, 15:45

Проблема в том, что я немогу найти правильного примера как вернуть дату из UDF в firebird 1.5 работал такой вариант

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

 PIBDateTime = ^TIBDateTime;
  TIBDateTime = record
    Date, Time: Integer;
  end;

IBDateDelta = 15018

function IB_LAST_DATE_IN_MONTH(var Months, Year:integer):PIBDateTime; cdecl; export;
var
  ResultDateTime: TIBDateTime;
  DateTime: TDateTime;
begin
  DateTime := EncodeDate(Year, Months, MonthDays[IsLeapYear(Year)][Months]);
  ResultDateTime.Date := Trunc(DateTime) + IBDateDelta;
  ResultDateTime.Time := 0;
  Result:= @ResultDateTime;
end;

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: UDF DATE Firebird 1.5 -> 2.1

Сообщение hvlad » 10 мар 2011, 16:10

В сети есть миллион примеров, как правильно писать удф. В том числе и на этом сайте.
Данная удф - крива до безобразия ибо нельзя возвращать локальную переменную.

alex12389
Сообщения: 3
Зарегистрирован: 10 мар 2011, 13:08

Re: UDF DATE Firebird 1.5 -> 2.1

Сообщение alex12389 » 10 мар 2011, 16:32

Спасибо разобрался.

Ответить