UDF и BOOLEAN в IB7.5
Модератор: kdv
UDF и BOOLEAN в IB7.5
Что я делаю не так в UDF? Имею следующую функцию:
function IsCompoundName(AValue: PChar): Boolean; cdecl; export;
begin
if ((Pos('-', string(AValue)
) > 0) or
(Pos(string(AValue),
' ') > 0)) then
Result := True
else
Result := False;
end;
декларирую в базе:
DECLARE EXTERNAL FUNCTION ISCOMPOUNDNAME
CSTRING(40) RETURNS BOOLEAN BY VALUE
ENTRY_POINT 'IsCompoundName' MODULE_NAME 'DT_UDF.DLL'
но при вызове срабатывает только
... WHERE ISCOMPOUNDNAME(SomeTable.SomeField) = FALSE ...
или
... WHERE ISCOMPOUNDNAME(SomeTable.SomeField) <> FALSE ...
Попытка указать
... WHERE ISCOMPOUNDNAME(SomeTable.SomeField) = TRUE ...
результатов не дает 8(
P.S. Вариант той же функции, то с Integer вместо Boolean, работает также, в случае, если TRUE = 1, а FALSE = 0 (Release Notes IB 7.5).
function IsCompoundName(AValue: PChar): Boolean; cdecl; export;
begin
if ((Pos('-', string(AValue)
) > 0) or
(Pos(string(AValue),
' ') > 0)) then
Result := True
else
Result := False;
end;
декларирую в базе:
DECLARE EXTERNAL FUNCTION ISCOMPOUNDNAME
CSTRING(40) RETURNS BOOLEAN BY VALUE
ENTRY_POINT 'IsCompoundName' MODULE_NAME 'DT_UDF.DLL'
но при вызове срабатывает только
... WHERE ISCOMPOUNDNAME(SomeTable.SomeField) = FALSE ...
или
... WHERE ISCOMPOUNDNAME(SomeTable.SomeField) <> FALSE ...
Попытка указать
... WHERE ISCOMPOUNDNAME(SomeTable.SomeField) = TRUE ...
результатов не дает 8(
P.S. Вариант той же функции, то с Integer вместо Boolean, работает также, в случае, если TRUE = 1, а FALSE = 0 (Release Notes IB 7.5).
предлагаю два варианта:
1. забить на boolean как на совершенно бесполезный тип данных во всех смыслах
2. прочитать все таки документацию по ib7.5, и с ужасом увидеть, что там boolean - четырехбайтовый тип. то есть, в качестве возвращаемого значения можно использовать integer, писать туда 0 или 1, а функцию в БД задекларировать как возвращающую boolean.
1. забить на boolean как на совершенно бесполезный тип данных во всех смыслах
2. прочитать все таки документацию по ib7.5, и с ужасом увидеть, что там boolean - четырехбайтовый тип. то есть, в качестве возвращаемого значения можно использовать integer, писать туда 0 или 1, а функцию в БД задекларировать как возвращающую boolean.
Не ожидал увидеть НИКАКОЙ ответ от уважаемого kdv...
Бесполезность Boolean - тема довольно спорная.kdv писал(а):1. забить на boolean как на совершенно бесполезный тип данных во всех смыслах
Вопрос был задан именно после выполнения предложенного Вами пункта 2. (см. выше).kdv писал(а):2. прочитать все таки документацию по ib7.5, и с ужасом увидеть, что там boolean - четырехбайтовый тип. то есть, в качестве возвращаемого значения можно использовать integer, писать туда 0 или 1, а функцию в БД задекларировать как возвращающую boolean.
не понял, мне надо было написать героический ответ? эстетический? волшебный? В письменном виде, по факсу, за подписью и печатью?Не ожидал увидеть НИКАКОЙ ответ от уважаемого kdv...

давай поспорим. как ты выводишь этот тип? Прямо как True/False, русскоязычному пользователю? И пишешь where field = True? чем это отличается от типа integer? Как бы, IB 7.0 не вчера появился. И я в курсе, что все, кто алкал boolean, сразу увяли как только получили его. Ибо толку от него - ноль. Контраргументы?Бесполезность Boolean - тема довольно спорная.
так после предложенного Нами пункта я не вижу ответа, какие попытки делались исправить исходный код.Вопрос был задан именно после выполнения предложенного Вами пункта 2. (см. выше).
"также" это как же? работает или не работает? Допустим, я должен догадаться, что проблема здесь может быть в интерпретации TRUE в значении boolean или integer. Однако, не составляет проблемы создать функцию, принимающую boolean, и посмотреть, что же там передается при TRUE. Если проблема действительно есть, то это баг, и о нем надо сообщать в Borland.Вариант той же функции, то с Integer вместо Boolean, работает также, в случае
p.s. кроме того, все входные переменные должны быть объявлены как var.
Задал этот же вопрос на news://newsgroups.borland.com/borland.public.interbase.general. И понял, что мне не хватает познаний в английском, для того, чтобы извинится там же за собственную тупость. Видеть ошибку, и продолжать считать ее за ошибку IB... (всему виной "Нескафе"... и глаза, цвета фирменной кружки 8)).kdv писал(а):"также" это как же? работает или не работает? Допустим, я должен догадаться, что проблема здесь может быть в интерпретации TRUE в значении boolean или integer. Однако, не составляет проблемы создать функцию, принимающую boolean, и посмотреть, что же там передается при TRUE. Если проблема действительно есть, то это баг, и о нем надо сообщать в Borland.Вариант той же функции, то с Integer вместо Boolean, работает также, в случае
Из функции при использовании LongBool, WordBool - возвращается "-1", при Boolean - "-5631". Стало быть в IB этого бага нет... А жаль :).
Придется в UDF использовать Integer.
Вот с этого места можно поподробнее?kdv писал(а):[p.s. кроме того, все входные переменные должны быть объявлены как var.
вишь как. спасибо тебе, будем знать. а то я и не догадывался. (без шуток) странно тут у них как то реализовано...Из функции при использовании LongBool, WordBool - возвращается "-1"
слушай, я уж не знаю, сейчас начну тыкать в азы (статью Кукарцева), а ты опять возмутишься.Вот с этого места можно поподробнее?
ВСЕ ВХОДНЫЕ ПЕРЕМЕННЫЕ UDF ДОЛЖНЫ ПЕРЕДАВАТЬСЯ КАК VAR.
так понятно?
кстати, только я про eua статью написал, как ты на том форуме спрашиваешь. Там никто про это знать не знает, и в доке этого нет.
а откуда я знаю - не скажу.
www.ibase.ru/devinfo/ib75eua.htm
и про временные таблицы
www.ibase.ru/devinfo/ib75temptables.htm
Почти... Возмущение бывает только тогда, когда нет конкретной информации (хотя, чтобы её получить, надо правильно и точно сформулировать вопрос, а с этим зачастую напряг...)kdv писал(а):вишь как. спасибо тебе, будем знать. а то я и не догадывался. (без шуток) странно тут у них как то реализовано...Из функции при использовании LongBool, WordBool - возвращается "-1"
слушай, я уж не знаю, сейчас начну тыкать в азы (статью Кукарцева), а ты опять возмутишься.Вот с этого места можно поподробнее?
ВСЕ ВХОДНЫЕ ПЕРЕМЕННЫЕ UDF ДОЛЖНЫ ПЕРЕДАВАТЬСЯ КАК VAR.
так понятно?
Статью на тот момент не видел, ну а вопрос интересный, вот я и задал его. Обязательно прочитаю и осмыслю за чашечкой чаю, дабы задавать поменьше "кофейных" вопросов.kdv писал(а):кстати, только я про eua статью написал, как ты на том форуме спрашиваешь. Там никто про это знать не знает, и в доке этого нет.
а откуда я знаю - не скажу.
www.ibase.ru/devinfo/ib75eua.htm
и про временные таблицы
www.ibase.ru/devinfo/ib75temptables.htm