Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с длинным целым [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-битными компиляторами


Наверх

Титульная страница Поиск, карта сайта Написать письмо