Форум: "Базы";
Текущий архив: 2007.12.02;
Скачать: [xml.tar.bz2];
ВнизРабота с длинным целым Найти похожие ветки
← →
Dik59 (2007-07-19 00:42) [0]Уважаемые Мастера!
Мне нужно слить сложный идентифинатор из двух целых в одно длинное целое и подать его на клиента. Для этого создал 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?
← →
DrPass © (2007-07-19 01:32) [1]
> TordID = record
TordID = packed record
Кстати, директива export в объявлении процедуры не нужна. Она игнорируется 32-битными компиляторами
← →
Dik59 (2007-07-19 07:01) [2]
> > TordID = record
>
> TordID = packed record
Не помогло, результат тот же.
← →
sniknik © (2007-07-19 08:48) [3]а вообще как компоненты Int64 передают? в ADO например были (есть еще?) проблемы при передаче, передавался с конвертацией через integer, естественно с потерями в точности. приходилось в обход компонент из обьектов ADO "выковыривать" или в строку передавать.
кстати попробуй через строку результат функции вернуть. что будет?
← →
Johnmen © (2007-07-19 09:12) [4]
> Мне нужно слить сложный идентифинатор из двух целых в одно
> длинное целое
Что такое у тебя "слить", я не знаю.
Но чтобы получить уникальный int64 из двух int (01,02) надоint6401:=int01;
int64:=(int6401 shl 32) + int02;
← →
Сергей М. © (2007-07-19 10:38) [5]
> Dik59
Показывай, как ты декларировал эту UDF в скрипте базы ..
← →
Desdechado © (2007-07-19 10:39) [6]Не вижу объявления UDF.
← →
Dik59 (2007-07-19 19:55) [7]
> 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. Вопрос - почему?
← →
sniknik © (2007-07-19 20:49) [8]> Вопрос - почему?
может FireBird не может работать с BIGINT? в смысле в функциях, так то должен раз тип есть ... или почемуто воспринимает твое описание как интеджер.
попробуй кстати еще входные параметры тоже int64 сделать (??? а хто его знает...).
есть не твои(!!!) функции которые возвращают int64? и главное чтобы работали проверь (выяснить до конца, кто виноват и что делать).
← →
sniknik © (2007-07-19 20:51) [9]да, и зря ты проигнорировал про packed record ответ.
← →
Johnmen © (2007-07-19 21:57) [10]>Dik59
1. Входные параметры передаются по ссылке, поэтому IdAsBig(var Doc,Num:Integer)
2. Выходной пар. в данном случае - по значению, поэтому RETURNS BIGINT BY VALUE
← →
Dik59 (2007-07-19 22:27) [11]
> Johnmen © (19.07.07 21:57) [10]
> 1. Входные параметры передаются по ссылке, поэтому IdAsBig(var
> Doc,Num:Integer)
> 2. Выходной пар. в данном случае - по значению, поэтому
> RETURNS BIGINT BY VALUE
Огромное спасибо, полегчало!!!
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2007.12.02;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.044 c