UDF и BOOLEAN в IB7.5

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
December
Сообщения: 26
Зарегистрирован: 29 окт 2004, 20:13

UDF и BOOLEAN в IB7.5

Сообщение December » 08 май 2005, 00:07

Что я делаю не так в 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).

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 15 май 2005, 22:22

предлагаю два варианта:

1. забить на boolean как на совершенно бесполезный тип данных во всех смыслах

2. прочитать все таки документацию по ib7.5, и с ужасом увидеть, что там boolean - четырехбайтовый тип. то есть, в качестве возвращаемого значения можно использовать integer, писать туда 0 или 1, а функцию в БД задекларировать как возвращающую boolean.

December
Сообщения: 26
Зарегистрирован: 29 окт 2004, 20:13

Сообщение December » 19 май 2005, 22:35

Не ожидал увидеть НИКАКОЙ ответ от уважаемого kdv...
kdv писал(а):1. забить на boolean как на совершенно бесполезный тип данных во всех смыслах
Бесполезность Boolean - тема довольно спорная.
kdv писал(а):2. прочитать все таки документацию по ib7.5, и с ужасом увидеть, что там boolean - четырехбайтовый тип. то есть, в качестве возвращаемого значения можно использовать integer, писать туда 0 или 1, а функцию в БД задекларировать как возвращающую boolean.
Вопрос был задан именно после выполнения предложенного Вами пункта 2. (см. выше).

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 19 май 2005, 23:37

Не ожидал увидеть НИКАКОЙ ответ от уважаемого kdv...
не понял, мне надо было написать героический ответ? эстетический? волшебный? В письменном виде, по факсу, за подписью и печатью? :)
Бесполезность Boolean - тема довольно спорная.
давай поспорим. как ты выводишь этот тип? Прямо как True/False, русскоязычному пользователю? И пишешь where field = True? чем это отличается от типа integer? Как бы, IB 7.0 не вчера появился. И я в курсе, что все, кто алкал boolean, сразу увяли как только получили его. Ибо толку от него - ноль. Контраргументы?
Вопрос был задан именно после выполнения предложенного Вами пункта 2. (см. выше).
так после предложенного Нами пункта я не вижу ответа, какие попытки делались исправить исходный код.
Вариант той же функции, то с Integer вместо Boolean, работает также, в случае
"также" это как же? работает или не работает? Допустим, я должен догадаться, что проблема здесь может быть в интерпретации TRUE в значении boolean или integer. Однако, не составляет проблемы создать функцию, принимающую boolean, и посмотреть, что же там передается при TRUE. Если проблема действительно есть, то это баг, и о нем надо сообщать в Borland.

p.s. кроме того, все входные переменные должны быть объявлены как var.

December
Сообщения: 26
Зарегистрирован: 29 окт 2004, 20:13

Сообщение December » 20 май 2005, 01:54

kdv писал(а):
Вариант той же функции, то с Integer вместо Boolean, работает также, в случае
"также" это как же? работает или не работает? Допустим, я должен догадаться, что проблема здесь может быть в интерпретации TRUE в значении boolean или integer. Однако, не составляет проблемы создать функцию, принимающую boolean, и посмотреть, что же там передается при TRUE. Если проблема действительно есть, то это баг, и о нем надо сообщать в Borland.
Задал этот же вопрос на news://newsgroups.borland.com/borland.public.interbase.general. И понял, что мне не хватает познаний в английском, для того, чтобы извинится там же за собственную тупость. Видеть ошибку, и продолжать считать ее за ошибку IB... (всему виной "Нескафе"... и глаза, цвета фирменной кружки 8)).

Из функции при использовании LongBool, WordBool - возвращается "-1", при Boolean - "-5631". Стало быть в IB этого бага нет... А жаль :).
Придется в UDF использовать Integer.
kdv писал(а):[p.s. кроме того, все входные переменные должны быть объявлены как var.
Вот с этого места можно поподробнее?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 20 май 2005, 09:51

Из функции при использовании LongBool, WordBool - возвращается "-1"
вишь как. спасибо тебе, будем знать. а то я и не догадывался. (без шуток) странно тут у них как то реализовано...
Вот с этого места можно поподробнее?
слушай, я уж не знаю, сейчас начну тыкать в азы (статью Кукарцева), а ты опять возмутишься.

ВСЕ ВХОДНЫЕ ПЕРЕМЕННЫЕ UDF ДОЛЖНЫ ПЕРЕДАВАТЬСЯ КАК VAR.
так понятно?

кстати, только я про eua статью написал, как ты на том форуме спрашиваешь. Там никто про это знать не знает, и в доке этого нет.
а откуда я знаю - не скажу.

www.ibase.ru/devinfo/ib75eua.htm
и про временные таблицы
www.ibase.ru/devinfo/ib75temptables.htm

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 20 май 2005, 10:47

kdv писал(а):
Из функции при использовании LongBool, WordBool - возвращается "-1"
вишь как. спасибо тебе, будем знать. а то я и не догадывался. (без шуток) странно тут у них как то реализовано...
Они сервер на VB переписали :lol: :lol: :lol:

December
Сообщения: 26
Зарегистрирован: 29 окт 2004, 20:13

Сообщение December » 20 май 2005, 12:09

kdv писал(а):
Из функции при использовании LongBool, WordBool - возвращается "-1"
вишь как. спасибо тебе, будем знать. а то я и не догадывался. (без шуток) странно тут у них как то реализовано...
Вот с этого места можно поподробнее?
слушай, я уж не знаю, сейчас начну тыкать в азы (статью Кукарцева), а ты опять возмутишься.

ВСЕ ВХОДНЫЕ ПЕРЕМЕННЫЕ UDF ДОЛЖНЫ ПЕРЕДАВАТЬСЯ КАК VAR.
так понятно?
Почти... Возмущение бывает только тогда, когда нет конкретной информации (хотя, чтобы её получить, надо правильно и точно сформулировать вопрос, а с этим зачастую напряг...)
kdv писал(а):кстати, только я про eua статью написал, как ты на том форуме спрашиваешь. Там никто про это знать не знает, и в доке этого нет.
а откуда я знаю - не скажу.

www.ibase.ru/devinfo/ib75eua.htm
и про временные таблицы
www.ibase.ru/devinfo/ib75temptables.htm
Статью на тот момент не видел, ну а вопрос интересный, вот я и задал его. Обязательно прочитаю и осмыслю за чашечкой чаю, дабы задавать поменьше "кофейных" вопросов.

December
Сообщения: 26
Зарегистрирован: 29 окт 2004, 20:13

Сообщение December » 20 май 2005, 12:50

Статью про EUA посмотрел. Крупная жемчужина, требует вдумчивого изучения :). Вот ежели так носом тыкать, то совсем другое дело ;))

Ответить