powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / UDF Error !!!
16 сообщений из 16, страница 1 из 1
UDF Error !!!
    #32634170
OJIEI'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хелп !!
Парюсь уже целый день, не знаю в чем дело !!

есть таблица

Код: plaintext
1.
2.
3.
4.
5.
create table ORDERS 
(
    ID3_ORD  integer not null,
    ID3_CLT  integer not null,
    ORDNUM3  varchar( 7 )
);

в ORDNUM3 записи типа
001FW03
003FS04
111FS04
и тд.. 3 цифры+2 буквы+ 2 цифры

для того чтоб вытащить из ORDNUM3 первые 3 цыфры
(задача нийти максимальное число по выборке)
пишу (Delphi7) UDF

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
unit fnstr;

interface

function SelOrdNum(ANum: PChar): smallint; cdecl;

implementation

uses SysUtils;

function SelOrdNum(ANum: PChar): smallint; cdecl;
begin
 try
  Result := StrToInt(Copy(string(ANum),  1 , Length(string(ANum)) -  4 ));
 except
  on Exception do  Result:=- 1 ;
 end;
end;

end.

регистрирую

Код: plaintext
1.
2.
3.
declare external function SEL_ORD_NUM
    cstring( 7 )
    returns smallint free_it
    entry_point 'SelOrdNum' module_name 'mtg_udf';

и вызываю из StoredProcedure

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE PROCEDURE MAX_ORD (
    PID3_CLT INTEGER)
RETURNS (
    PNEW_ORDNUM SMALLINT)
AS
begin
 select max(SEL_ORD_NUM(ORDERS.ORDNUM3)) from ORDERS
 where ORDERS.ID3_CLT=:PID3_CLT into :PNEW_ORDNUM;
end

----------------до этого момента всё ОК------------------

делаю проверку по SELECTу

Код: plaintext
1.
 select max(SEL_ORD_NUM(ORDERS.ORDNUM3)) from ORDERS
 where ORDERS.ID3_CLT= 4 ;

и после всего этого меня IBExpert посылает *$#@% со словами
"Connection was lost to database:"
сил моих больше нет, Хелп плз!!
...
Рейтинг: 0 / 0
UDF Error !!!
    #32634227
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
убери free_it и попробуй снова.
...
Рейтинг: 0 / 0
UDF Error !!!
    #32634302
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если у тебя FB 1.5 то UDF не нужен:
Код: plaintext
1.
select max(cast (substring (ORDERS.ORDNUM3 from  1  for  3 ) as integer)) from ORDERS
 where ORDERS.ID3_CLT= 4 
Удачи.
...
Рейтинг: 0 / 0
UDF Error !!!
    #32634801
OJIEI'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Zmeisheубери free_it и попробуй снова.
тот же результат :(
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
connection lost to database.

ЛентяйЕсли у тебя FB 1.5 то UDF не нужен.
да, у меня именно FB1.5, твой запрос работает, но просто принципиально интерестно почему UDF не хочет работать., может я с типами чего напутал?

Можна ли как-то отследить выполнение UDF ? чего он там получает, как обрабатывает, что выдает. Debug в общем.

Всем спасибо за участие :)
...
Рейтинг: 0 / 0
UDF Error !!!
    #32634947
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отследить можно.
Предполагаю:
1 - перед тем как делать
Result := StrToInt(Copy(string(ANum), 1, Length(string(ANum)) - 4));
следует проверить фактическую длину строки и выполнять этот кусок при условии, что строка больше или равна 3 символам. Во всяком случае не пустая.
2 - Result := StrToInt(Copy(string(ANum), 1, Length(string(ANum)) - 4 )); тут у меня большие сомнения.

если:
anum = 0123456789;
length = 10;
10 - 4 = 7; т.е. с 1-го символа по 7-ой??? Но тебе только 3 надо.
...
Рейтинг: 0 / 0
UDF Error !!!
    #32634953
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, у меня именно FB1.5, твой запрос работает, но просто принципиально интерестно почему UDF не хочет работать., может я с типами чего напутал?

Ну наверное где-то чего-то не так. Если сильно приперло - могу посмотреть повнимательней, но поближе к вечеру.

Можна ли как-то отследить выполнение UDF ? чего он там получает, как обрабатывает, что выдает. Debug в общем.

Можно. Я в Delphi 5 в меню Run/Parameters указываю путь к exe-шнику FB с параметром -a и дальше в отладчике смотрю, чего я там наваял такого...
...
Рейтинг: 0 / 0
UDF Error !!!
    #32634954
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон, 10-4=6
...
Рейтинг: 0 / 0
UDF Error !!!
    #32634982
OJIEI'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Zmeisheесли:
anum = 0123456789;
length = 10;
10 - 4 = 6; т.е. с 1-го символа по 7-ой??? Но тебе только 3 надо.

ORDNUM3 varchar( 7 )

тоесть 10-4 никак быть не может,
только 7 -4 =3
...
Рейтинг: 0 / 0
UDF Error !!!
    #32634998
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит на пустоту проверяй
Код: plaintext
1.
2.
3.
4.
5.
create table ORDERS 
(
    ID3_ORD  integer not null,
    ID3_CLT  integer not null,
    ORDNUM3  varchar( 7 )
);
твой ORDNUM3 может принимать значения null
...
Рейтинг: 0 / 0
UDF Error !!!
    #32635056
OJIEI'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Zmeishe
твой ORDNUM3 может принимать значения null

ну судя из CREATE может, но значений null там нет , +не работает ни одна выборка по разным параметрам
...
Рейтинг: 0 / 0
UDF Error !!!
    #32635363
Valery Shiskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте, убрать free_it и поставить вместо него by value
...
Рейтинг: 0 / 0
UDF Error !!!
    #32635517
Valery Shiskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS
А вообще-то не очень похож текст udf на dll библиотеку. Если только библиотека не определена отдельно, а в ней вызов функции из приведенного Вами модуля.
...
Рейтинг: 0 / 0
UDF Error !!!
    #32637049
OJIEI'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valery ShiskinПопробуйте, убрать free_it и поставить вместо него by value

Уряяяяяя!!!!!

Уважаемый Валерий Шишкин! большое тебе спасибо !
Я уже забил на эту УДФ, потом решил проверить by value вариант, все начало работать без сучка и задоринки !!
...
Рейтинг: 0 / 0
UDF Error !!!
    #32639298
OJIEI'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЛентяйЕсли у тебя FB 1.5 то UDF не нужен:
Код: plaintext
1.
select max(cast (substring (ORDERS.ORDNUM3 from  1  for  3 ) as integer)) from ORDERS
 where ORDERS.ID3_CLT= 4 
Удачи.

Что будет быстрее работать, UDF (см.начало) или сия ХП ?
...
Рейтинг: 0 / 0
UDF Error !!!
    #32639305
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OJIEI' ЛентяйЕсли у тебя FB 1.5 то UDF не нужен:
Код: plaintext
1.
select max(cast (substring (ORDERS.ORDNUM3 from  1  for  3 ) as integer)) from ORDERS
 where ORDERS.ID3_CLT= 4 

Что будет быстрее работать, UDF (см.начало) или сия ХП ?А где здесь ХП?
...
Рейтинг: 0 / 0
UDF Error !!!
    #32639306
OJIEI'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
здесь:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE PROCEDURE MAX_ORD (
    PID3_CLT INTEGER)
RETURNS (
    PNEW_ORDNUM SMALLINT)
AS
begin
 select max(cast (substring (ORDERS.ORDNUM3 from  1  for  3 ) as integer)) from ORDERS
 where ORDERS.ID3_CLT=:PID3_CLT into :PNEW_ORDNUM;
end
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / UDF Error !!!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]