![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с длинным целым [D7, FireBird 2]
Dik59 © (2007-07-19 00:42:00)Уважаемые Мастера!
Мне нужно слить сложный идентифинатор из двух целых в одно длинное целое и подать его на клиента. Для этого создал UDF-ку, содержащую след.код:
......
type
TordID = record
case integer of
0: (id:int64;);
1: (doc,num:integer);
end;
......
function IdAsBig(Doc,Num:Integer):Int64;cdecl;export;
var id:TordID;
begin
id.doc := Doc;
id.num := Num;
Result := id.id;
end;
......
exports
......
IdAsBig name 'idasbig',
......
Странслировал, библиотечку положил куда надо.
Написал простую тестовую процедурку:
CREATE PROCEDURE TESTID
RETURNS (
ID BIGINT)
AS
declare variable dc integer;
declare variable nm integer;
begin
/* Procedure Text */
dc = 23234; nm = 9389348;
id = idasbig(dc,nm);
suspend;
end
и проверил работу IdAsBig в IBExpert запросом:
Select * from TestId
Запрос вернул число 23234
Вопрос: Где ошибка? у меня? в FireBird? в IBExpert?
Dik59 (2007-07-19 22:27:00) [1]
> Johnmen © (19.07.07 21:57) [10]
> 1. Входные параметры передаются по ссылке, поэтому IdAsBig(var
> Doc,Num:Integer)
> 2. Выходной пар. в данном случае - по значению, поэтому
> RETURNS BIGINT BY VALUE
Огромное спасибо, полегчало!!!
Johnmen (2007-07-19 21:57:00) [2]>Dik59
1. Входные параметры передаются по ссылке, поэтому IdAsBig(var Doc,Num:Integer)
2. Выходной пар. в данном случае - по значению, поэтому RETURNS BIGINT BY VALUE
sniknik (2007-07-19 20:51:00) [3]да, и зря ты проигнорировал про packed record ответ.
sniknik (2007-07-19 20:49:00) [4]> Вопрос - почему?
может FireBird не может работать с BIGINT? в смысле в функциях, так то должен раз тип есть ... или почемуто воспринимает твое описание как интеджер.
попробуй кстати еще входные параметры тоже int64 сделать (??? а хто его знает...).
есть не твои(!!!) функции которые возвращают int64? и главное чтобы работали проверь (выяснить до конца, кто виноват и что делать).
Dik59 (2007-07-19 19:55:00) [5]
> Desdechado © (19.07.07 10:39) [6]
> Не вижу объявления UDF.
Сергей М. © (19.07.07 10:38) [5]
Показывай, как ты декларировал эту UDF в скрипте базы
Я показал только кусочки кода из библиотеки, имеющие отношение к вопросу, объявление, естественно есть, в базе процедура прописана:
DECLARE EXTERNAL FUNCTION IDASBIG
INTEGER,
INTEGER
RETURNS BIGINT
ENTRY_POINT 'idasbig' MODULE_NAME 'ordudflib'
> Johnmen © (19.07.07 09:12) [4]
> Что такое у тебя "слить", я не знаю.
> Но чтобы получить уникальный int64 из двух int (01,02) надо
> int6401:=int01;
> int64:=(int6401 shl 32) + int02;
"Слить" Вами понято правильно, не мог подобрать другого глагола, извините.
То же самое делает тип TordID без shl и плюсов, прстым присваиванием, в других местах программы это работает прекрасно .
> sniknik © (19.07.07 08:48) [3]
> кстати попробуй через строку результат функции вернуть.
> что будет?
Через строку получается то же самое, теряется старшее слово в int64. Т.е. в результате возвращается не BIGINT, а INTEGER. Вопрос - почему?
Desdechado (2007-07-19 10:39:00) [6]Не вижу объявления UDF.
Сергей М. (2007-07-19 10:38:00) [7]
> Dik59
Показывай, как ты декларировал эту UDF в скрипте базы ..
Johnmen (2007-07-19 09:12:00) [8]
> Мне нужно слить сложный идентифинатор из двух целых в одно
> длинное целое
Что такое у тебя "слить", я не знаю.
Но чтобы получить уникальный int64 из двух int (01,02) надо
int6401:=int01;
int64:=(int6401 shl 32) + int02;
sniknik (2007-07-19 08:48:00) [9]а вообще как компоненты Int64 передают? в ADO например были (есть еще?) проблемы при передаче, передавался с конвертацией через integer, естественно с потерями в точности. приходилось в обход компонент из обьектов ADO "выковыривать" или в строку передавать.
кстати попробуй через строку результат функции вернуть. что будет?
Dik59 (2007-07-19 07:01:00) [10]
> > TordID = record
>
> TordID = packed record
Не помогло, результат тот же.
DrPass (2007-07-19 01:32:00) [11]
> TordID = record
TordID = packed record
Кстати, директива export в объявлении процедуры не нужна. Она игнорируется 32-битными компиляторами