UDF с простой функцией FormatDateTime

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

Модератор: kdv

Ответить
Solo
Сообщения: 108
Зарегистрирован: 18 апр 2005, 04:05

UDF с простой функцией FormatDateTime

Сообщение Solo » 26 дек 2006, 09:18

Хм... торможу что-то...
UDF имеет только одну функцию:

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

function ShortYearStr(Dat : TDateTime): PChar; cdecl; export;
begin
[b]Result := PChar(FormatDateTime('YY', Dat));[/b]
end;
Задекларируем ее в базе:

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

DECLARE EXTERNAL FUNCTION YEARTOSTR
    DATE
RETURNS CHAR(2)
ENTRY_POINT 'ShortYearStr' MODULE_NAME 'UDFYear.dll'
И используем её:

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

  for select contracts.locationcode
  from contracts
  where contracts.ncontcode = :IN_NCONT
  into :v_locationcode
  do
  begin
    out_locationcode = :v_locationcode||:v_delimeter||:in_ncont||:v_delimeter||
:in_ndoc||:v_delimeter||yeartostr(:in_doc_begin)||:v_pyaticod;
    suspend;
  end
Входящая величина - дата 01.01.2006, То-есть, выходящая строка должна быть "06", две последних цифры года. А получается почему-то вот что:
33-1111-000001-99/98-71
То-есть 99 вместо 06
Что я не так делаю?

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

Сообщение kdv » 26 дек 2006, 09:33

фигня какая то, а не функция. берет и возвращает какой-то pchar, возникающий из воздуха. Да еще не просто pchar, а char.

1. из функций возвращать надо cstring, а не char или pchar
2. кто-то должен аллокировать выходную строку. примеров на сайте достаточно, например safeudf
3. вместо udf в этом конкретном случае можно было воспользоваться функцией extract(year from ...

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

Сообщение WildSery » 26 дек 2006, 12:15

Кроме того, что использовать нужно EXTRACT, автор ещё и с входным параметром облажался. Переданный сервером TIBDateTime пытается
обработать как дельфёвый TDateTime.

Solo
Сообщения: 108
Зарегистрирован: 18 апр 2005, 04:05

Сообщение Solo » 26 дек 2006, 17:36

WildSery писал(а):Кроме того, что использовать нужно EXTRACT, автор ещё и с входным параметром облажался. Переданный сервером
TIBDateTime пытается обработать как дельфёвый TDateTime.
Ну вот, отбили охоту связываться с UDF :(
Сделал так:
v_year = extract(year from :in_doc_begin);
v_yeartwo = substring(:v_year from 3 for 4);
И все заработало...

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

Сообщение kdv » 26 дек 2006, 17:49

Ну вот, отбили охоту связываться с UDF
а ты не пиши ерунду, а читай статьи на ibase.ru и используй в качестве
болванок для своих функций ПРИМЕРЫ udf, коих на ibase.ru достаточно.

Solo
Сообщения: 108
Зарегистрирован: 18 апр 2005, 04:05

Сообщение Solo » 27 дек 2006, 09:19

kdv писал(а):
Ну вот, отбили охоту связываться с UDF
а ты не пиши ерунду, а читай статьи на ibase.ru и используй в качестве
болванок для своих функций ПРИМЕРЫ udf, коих на ibase.ru достаточно.
Вчера даже книгу сходил купил мир InterBase к новому году. Вот начитаюсь, и буду вопросы не задавать, а отвечать еще вперед вас
:D :D

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

Сообщение kdv » 27 дек 2006, 09:48

да без проблем :)

Ответить