Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.078 c
1-1183585378
АлександрМ
2007-07-05 01:42
2007.12.02
Как подавить реакцию TTreeView на двойной клик?


4-1177050445
vann
2007-04-20 10:27
2007.12.02
Как программно заменить выделенный текст в окне другого приложени


2-1194614879
Denis__
2007-11-09 16:27
2007.12.02
Цвет рабочего стола


6-1175429195
wolchonok29
2007-04-01 16:06
2007.12.02
Загрузка из потока


6-1175008173
paradox01
2007-03-27 19:09
2007.12.02
Сокеты, сообщение об ошибке





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский