Форум: "Базы";
Текущий архив: 2005.09.04;
Скачать: [xml.tar.bz2];
ВнизЧто неверно в UDF? Найти похожие ветки
← →
Андрей Жук © (2005-07-26 16:14) [0]
library UnixToWinDate;
uses DateUtils, consts, ibutil,SysUtils;
procedure UnixDateToWinDate(var Ret: TIBTimeStamp;UnixDate: double);cdecl;export;
var
vDate: TDateTime;
YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,MSEC: WORD;
begin
vDate := DateUtils.UnixToDateTime(Round(UnixDate));
DecodeDate(vDate,YEAR,MONTH,DAY);
DecodeTime(vDate,HOUR,MINUTE,SECOND,MSEC);
Ret.Date := IBEncodeDate(YEAR,MONTH,DAY);
Ret.Time := IBEncodeTime(HOUR,MINUTE,SECOND);
end;
exports UnixDateToWinDate;
end.
результат - всегда 01.01.1970
← →
Lexer © (2005-07-26 16:29) [1]>> Андрей Жук, а почему выбрана реализация процедурой, имхо здесь нужна фунция.
function UnixDateToWinDate(var Ret: TIBTimeStamp; UnixDate: double): PIBDateTime; cdecl; export;
← →
Digitman © (2005-07-26 16:31) [2]
> здесь нужна фунция
так точно, сэр !
> Андрей Жук © (26.07.05 16:14)
думай ... над сказанным ...
← →
Digitman © (2005-07-26 16:36) [3]function UnixDateToWinDate(var UnixDate: double): PIBTimeStamp; cdecl;
var
vDate: TDateTime;
YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,MSEC: WORD;
begin
vDate := DateUtils.UnixToDateTime(Round(UnixDate));
DecodeDate(vDate,YEAR,MONTH,DAY);
DecodeTime(vDate,HOUR,MINUTE,SECOND,MSEC);
Result := @Unixdate;
Result.Date := IBEncodeDate(YEAR,MONTH,DAY);
Result.Time := IBEncodeTime(HOUR,MINUTE,SECOND);
end;
← →
Андрей Жук © (2005-07-26 16:40) [4]ну и что?
function UnixDateToWinDate(var Ret: TIBTimeStamp;UnixDate: double):PIBTimeStamp;cdecl;export;
var
vDate: TDateTime;
YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,MSEC: WORD;
begin
vDate := DateUtils.UnixToDateTime(Round(UnixDate));
DecodeDate(vDate,YEAR,MONTH,DAY);
DecodeTime(vDate,HOUR,MINUTE,SECOND,MSEC);
Ret.Date := IBEncodeDate(YEAR,MONTH,DAY);
Ret.Time := IBEncodeTime(HOUR,MINUTE,SECOND);
Result := @Ret;
end;
объявляю какDECLARE EXTERNAL FUNCTION UNIXDATETOWINDATE
TIMESTAMP,
DOUBLE PRECISION
RETURNS TIMESTAMP
ENTRY_POINT "UnixDateToWinDate" MODULE_NAME "unixdate"
← →
Андрей Жук © (2005-07-26 16:40) [5]ну и что?
function UnixDateToWinDate(var Ret: TIBTimeStamp;UnixDate: double):PIBTimeStamp;cdecl;export;
var
vDate: TDateTime;
YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,MSEC: WORD;
begin
vDate := DateUtils.UnixToDateTime(Round(UnixDate));
DecodeDate(vDate,YEAR,MONTH,DAY);
DecodeTime(vDate,HOUR,MINUTE,SECOND,MSEC);
Ret.Date := IBEncodeDate(YEAR,MONTH,DAY);
Ret.Time := IBEncodeTime(HOUR,MINUTE,SECOND);
Result := @Ret;
end;
объявляю какDECLARE EXTERNAL FUNCTION UNIXDATETOWINDATE
TIMESTAMP,
DOUBLE PRECISION
RETURNS TIMESTAMP
ENTRY_POINT "UnixDateToWinDate" MODULE_NAME "unixdate"
результат тот же
← →
Андрей Жук © (2005-07-26 16:41) [6]ну и что?
function UnixDateToWinDate(var Ret: TIBTimeStamp;UnixDate: double):PIBTimeStamp;cdecl;export;
var
vDate: TDateTime;
YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,MSEC: WORD;
begin
vDate := DateUtils.UnixToDateTime(Round(UnixDate));
DecodeDate(vDate,YEAR,MONTH,DAY);
DecodeTime(vDate,HOUR,MINUTE,SECOND,MSEC);
Ret.Date := IBEncodeDate(YEAR,MONTH,DAY);
Ret.Time := IBEncodeTime(HOUR,MINUTE,SECOND);
Result := @Ret;
end;
объявляю какDECLARE EXTERNAL FUNCTION UNIXDATETOWINDATE
TIMESTAMP,
DOUBLE PRECISION
RETURNS TIMESTAMP
ENTRY_POINT "UnixDateToWinDate" MODULE_NAME "unixdate"
результат тот же
← →
Digitman © (2005-07-26 16:44) [7]
> ну и что?
нуичтокай побольше - думать меньше придется
> RETURNS TIMESTAMP
это - возврат по значению.
в моем же примере - возврат по ссылке на 1-й параметр.
← →
Андрей Жук © (2005-07-26 16:46) [8]ну и что?
function UnixDateToWinDate(var Ret: TIBTimeStamp;UnixDate: double):PIBTimeStamp;cdecl;export;
var
vDate: TDateTime;
YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,MSEC: WORD;
begin
vDate := DateUtils.UnixToDateTime(Round(UnixDate));
DecodeDate(vDate,YEAR,MONTH,DAY);
DecodeTime(vDate,HOUR,MINUTE,SECOND,MSEC);
Ret.Date := IBEncodeDate(YEAR,MONTH,DAY);
Ret.Time := IBEncodeTime(HOUR,MINUTE,SECOND);
Result := @Ret;
end;
объявляю какDECLARE EXTERNAL FUNCTION UNIXDATETOWINDATE
TIMESTAMP,
DOUBLE PRECISION
RETURNS TIMESTAMP
ENTRY_POINT "UnixDateToWinDate" MODULE_NAME "unixdate"
результат тот же
← →
Андрей Жук © (2005-07-26 16:46) [9]ну и что?
function UnixDateToWinDate(var Ret: TIBTimeStamp;UnixDate: double):PIBTimeStamp;cdecl;export;
var
vDate: TDateTime;
YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,MSEC: WORD;
begin
vDate := DateUtils.UnixToDateTime(Round(UnixDate));
DecodeDate(vDate,YEAR,MONTH,DAY);
DecodeTime(vDate,HOUR,MINUTE,SECOND,MSEC);
Ret.Date := IBEncodeDate(YEAR,MONTH,DAY);
Ret.Time := IBEncodeTime(HOUR,MINUTE,SECOND);
Result := @Ret;
end;
объявляю какDECLARE EXTERNAL FUNCTION UNIXDATETOWINDATE
TIMESTAMP,
DOUBLE PRECISION
RETURNS TIMESTAMP
ENTRY_POINT "UnixDateToWinDate" MODULE_NAME "unixdate"
результат тот же
← →
Андрей Жук © (2005-07-26 16:46) [10]ну и что?
function UnixDateToWinDate(var Ret: TIBTimeStamp;UnixDate: double):PIBTimeStamp;cdecl;export;
var
vDate: TDateTime;
YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,MSEC: WORD;
begin
vDate := DateUtils.UnixToDateTime(Round(UnixDate));
DecodeDate(vDate,YEAR,MONTH,DAY);
DecodeTime(vDate,HOUR,MINUTE,SECOND,MSEC);
Ret.Date := IBEncodeDate(YEAR,MONTH,DAY);
Ret.Time := IBEncodeTime(HOUR,MINUTE,SECOND);
Result := @Ret;
end;
объявляю какDECLARE EXTERNAL FUNCTION UNIXDATETOWINDATE
TIMESTAMP,
DOUBLE PRECISION
RETURNS TIMESTAMP
ENTRY_POINT "UnixDateToWinDate" MODULE_NAME "unixdate"
результат тот же
← →
dolmat (2005-07-26 16:47) [11]35.2.2. Совместимость типов параметров
При описании параметров в БД (оператор DECLARE EXTERNAL FUNC¬TION) и параметров функций в DLL следует помнить о совместимости типов Object Pascal и InterBase:
Тип InterBase Тип Object Pascal
INTEGER Integer
DOUBLE PRECISION Double
CSTRING PChar
DATE IBDateTime = record
// нужно дополнительное
//преобразование значений
Days : Integer;
Msec: Cardinal; end;
Данное соответствие типов верно для случая, когда результат функции передается в базу данных по значению. Для того чтобы результат передавался по значению, необходимо в операторе DECLARE EXTERNAL FUNCTION после слова RETURNS указать слово BY VALUE. В следующем примере объявляется функция DEN типа DATE, содержащаяся в DLL с именем UDFJDLL:
DECLARE EXTERNAL FUNCTION DEN DATE RETURNS INTEGER BY VALUE ENTRY_POINT "Den" MODULE_NAME "udf^dll";
В том случае, если результат работы UDF передается в БД по ссылке, необходимо использовать указатели на соответствующие типы:
InterBase Object Pascal
INTEGER integer
DOUBLE PRECISION ADouble
DATE AIBDateTime
Тип PChar всегда передается по ссылке.
Будем использовать только параметры, передаваемые по значении: поскольку вызовы UDF предполагается осуществлять в SQL-операторах тип SELECT, INSERT, UPDATE, DELETE, а эти операторы не будут изменят содержимое параметров.
35.2.4. Особенности использования в UDF параметров типа даты и времени
Значения InterBase типа DATE в Object Pascal интерпретируются как запись, j состоящая из двух полей - целочисленного знакового и беззнакового.
IBDateTime = record
Days : Integer;
Msec : Cardinal; end;
Для того чтобы перевести значение из формата IBDateTime в формат даты и времени Delphi TDateTime, необходимо произвести следующее преобразование:
flarmDelphi =flamaInterBase.Days -15018 +flamaInterBase.MSec/(MSecsPerDay*10); где константа MSecsPerDay определена в Delphi как число миллисекунд в сутках.
← →
Digitman © (2005-07-26 16:48) [12]
> Андрей Жук © (26.07.05 16:46) [10]
кто-то изрядно туп - то ли прокси твой, то ли ..
еще раз - в своем примере я возвращаю рез-т по ссылке на 1-й параметр
← →
Digitman © (2005-07-26 16:49) [13]
> dolmat (26.07.05 16:47) [11]
из другой оперы.
хотя и имеет некоторое отношение к "делу"
← →
Johnmen © (2005-07-26 16:50) [14]>Digitman © (26.07.05 16:48) [12]
Он заспамить решил, в отместку за то, что ты не разжевал...:)
← →
Lexer © (2005-07-26 16:51) [15]ну и что? (с)
=)
да, к концу дня заметно у всех башка слетает...
← →
Digitman © (2005-07-26 16:51) [16]
> Андрей Жук
АБСОЛЮТНО ВСЕ UDF-параметры передаются по ссылке на копию оригинала.
← →
Digitman © (2005-07-26 16:53) [17]
> Johnmen © (26.07.05 16:50) [14]
Беззубый я уже, Жень)
Мне кажется, только БоняПарт ноне не знает, что в IB UDF-параметры передаются по ссылке на копию оригинала
← →
Digitman © (2005-07-26 16:56) [18]
> Андрей Жук
для тех кто на бронепоезде - форматы "дата+время", будь то юниксовые, будь то дельфийские, будь то интербезовы, все они занимают 8 байт, а значит совместимы по размеру с ИБ-типами timestamp, double precision
далее думаем головой ...
← →
Андрей Жук © (2005-07-26 17:03) [19]сори, клиент заглючил
← →
Fay © (2005-07-26 17:36) [20]2 Digitman © (26.07.05 16:56) [18]
А какой вывод из этого нужно сделать головой?
← →
Digitman © (2005-07-26 17:40) [21]
> Fay © (26.07.05 17:36) [20]
да тот самый)
если ИБ выделил 8 байт , записал туда черт-те что и передал тебе адрес этих 8-ми байт, то ты волен прочитать/записать оттуда/туда все что угодно
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.09.04;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.01 c