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

Учусь писать udf

Добавлено: 30 апр 2012, 13:06
Nikos52
Здравствуйте,

WinXP SP3, FireBird 2.5 Version 5.2.1.26351, IBExpert 2012.04.18, Delphi 7.0 (Build 8.1)

Цель: Научиться писать собственные UDF функции. Например для начала написал две простые UDF функции для обработки даты.

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

function fDateOf (Value: double): double;
begin
 Result := DateOf(Value);
end;
function fTimeOf(Value: double): double;
begin
 Result := TimeOf(Value);
end;
Проверяю, работает.
Изображение
Подключаю UDF в IBExpert

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

SET SQL dialect 3;
--/*
DROP external FUNCTION Date_Of;
DROP external FUNCTION Time_Of;
--*/
DECLARE external FUNCTION Date_Of
DOUBLE precision by DESCRIPTOR
returns DOUBLE precision by DESCRIPTOR
entry_point 'fDateOf' module_name 'date_time_udf';

DECLARE external FUNCTION Time_Of
DOUBLE precision by DESCRIPTOR
returns DOUBLE precision by DESCRIPTOR
entry_point 'fTimeOf' module_name 'date_time_udf';
Изображение

Пробую запустить

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

select  date_of((select current_date from rdb$database)) as "Дата"
       ,time_of((select current_time from rdb$database)) as "Время"
from rdb$database
     rows 1
Результат
Изображение
Тот же самый результат если

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

select  date_of(0) as "Дата"
       ,time_of(0) as "Время"
from rdb$database
     rows 1
Догадываюсь, что проблема м.б. в разных форматах
- Delphi TDateTime = double
- FireBird

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

type
   TIBDate = integer;
   TIBTime = Cardinal;
   TIBTimeStamp= packed record
                    Date: TIBDate;
                    Time: TIBTime;
                 end;
Вопрос :
Если только в этом причина, то почему select date_of(0) as "Дата" возвращает null ?
В чем мои ошибки ? Буду рад прочитать замечания.
Статью http://www.ibase.ru/devinfo/udf_ok.htm читал, но что-то наверное не понял. Как говорится... если что, извините :)

Убедительно прошу "не мазать мордой лица по фейсу", типа: погугли, а слабо почитай доку и т.д. :)
Спасибо.
Николай.

Re: Учусь писать udf

Добавлено: 30 апр 2012, 13:22
hvlad
Ты ошибся везде :
а) в БД объявил пар-ры ф-ций с BY DESCRIPTOR, но твой код работает не c дескрипторами.
б) где cdecl ?
в) дата\время не передаются в UDF как double

Читай статью ещё раз, внимательно и полностью, а не по диагонали через слово

Re: Учусь писать udf

Добавлено: 01 май 2012, 04:31
Nikos52
Вот что получилось.
http://youtu.be/wNTxHtyohFU
Качество неважное, слишком большой размер экрана снимал. :oops: Если будет интересно кому, могу переснять.
В grid IBExpert не отображается время, появляется только если grid перевести в режим Form View,
после того как установить и снять Null.

Проблема в формате даты.
Продолжаю копать .... :roll:

Re: Учусь писать udf

Добавлено: 02 май 2012, 20:22
kdv
видео пока не смотрел, но прошу объяснить - зачем видео, если есть статья и примеры? Вы творите что-то новое? Или сейчас люди неспособны ничего кроме ютуба воспринимать? :)

Re: Учусь писать udf

Добавлено: 03 май 2012, 09:48
Nikos52
kdv писал(а):видео пока не смотрел, но прошу объяснить - зачем видео, если есть статья и примеры? Вы творите что-то новое? Или сейчас люди неспособны ничего кроме ютуба воспринимать? :)
Эх ... просто хотел показать что чтение статьи помогло разобраться, но не до конца. А remote debug пробовал сделать еще в приснопамятные времена Baikonur,
но все забыл... :( Статья помогла вспомнить .