Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.04;
Скачать: CL | DM;

Вниз

Что неверно в 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.043 c
3-1121766548
msguns
2005-07-19 13:49
2005.09.04
Координаты текущей ячейки грида


9-1115537093
grouzd[E]v
2005-05-08 11:24
2005.09.04
OpenGL - LOD feat. Renderable


14-1123165300
Jeer
2005-08-04 18:21
2005.09.04
Satana


3-1122038677
Juice
2005-07-22 17:24
2005.09.04
Потокобезопасность IBX


8-1114267883
COOLer
2005-04-23 18:51
2005.09.04
Ох уж этот TImage 2