FB 2.0 -> FB 2.1

Совместимость InterBase, Firebird, Yaffil между собой и по версиям

Модераторы: kdv, Alexey Kovyazin

Ответить
K.Nick
Сообщения: 11
Зарегистрирован: 16 янв 2007, 19:10

FB 2.0 -> FB 2.1

Сообщение K.Nick » 04 фев 2010, 13:19

При переходе от версии FireBird
2.0.4.13130 на 2.1.3.18185 перестала работать UDF
-----------------------------------------------------------------------------------
PAS -----------------------------------------------------------------------------

Код: Выделить всё

function ib_util_malloc(Size: Integer): PChar; cdecl; external 'ib_util.dll';
function AddRecordToHistorySvr2( var History : TBLOb;
                                 var Istoc : Integer;
                                 var Date: TIBDateTime;
                                 var Price,
                                     PriceM : Double;
                                 Var TimePr,
                                     TimePrM : Integer;
                                 Valuta : Integer;
                                 var LengRec : Integer
                                 ):PChar ; cdecl; export;
var

   Steps             : String;
   GotLength         : Integer;
begin
  with History do
  begin
    if (not Assigned(Handle)) or
       (TotalLength = 0)
     then Result := ib_util_malloc(LengRec+2)
     else
     begin
        GotLength := 0;
        Result := ib_util_malloc(TotalLength+LengRec+2);
        GetSegment(Handle, Result+2, TotalLength, GotLength);
     end;
     GotLength     := TotalLength;
     PSmallInt(Result)^ := LengRec+TotalLength;
  end;


  PInteger(Result+2+GotLength+0)^ := Istoc;
  PInteger(Result+2+GotLength+4)^ := Integer(Date.Days-15018);
  PDouble (Result+2+GotLength+8)^ := Price;
  if(LengRec>16) then
  begin
    PInteger(Result+2+GotLength+16)^ := Round(PriceM);
    Result[2+GotLength+20]           := Chr(TimePr and $ff);
    Result[2+GotLength+21]           := Chr(TimePrM and $ff);
    Result[2+GotLength+22]           := Chr(Valuta and $ff);
    Result[2+GotLength+23]           := #0;
  end;
end;
---------------------------------------------------------------------------
DDL ----------------------------------------------------------------------

Код: Выделить всё

DECLARE EXTERNAL FUNCTION ADDRECORDTOHISTORYSVR2
    BLOB,
    INTEGER,
    DATE,
    DOUBLE PRECISION,
    DOUBLE PRECISION,
    INTEGER,
    INTEGER,
    INTEGER,
    INTEGER
RETURNS VARCHAR(32000) FREE_IT
ENTRY_POINT 'AddRecordToHistorySvr2' MODULE_NAME 'REALTOUDF';
--------------------------------------------------------------------------------
Ошибка ----------------------------------------------------------------------
04.02.2010; 13:16:58 EFIBInterBaseError: DMOD.qrTemp:
Overflow occurred during data type conversion.Filter not found to convert type 1 to type 2.
At procedure 'PRODAJA_INSERT_GUID1_ALLFIELDS' line: 473, col: 1
At procedure 'MOVETOARCHIV2' line: 203, col: 7.
; SQLText="select opstep from movetoarchiv2(:ipbase, :ipDate1, :ipDate2, :ipDate3, :ipStep)
"

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

Re: FB 2.0 -> FB 2.1

Сообщение hvlad » 04 фев 2010, 14:38

Не думаю, что проблема в UDF.
Читайте внимательно сообщение об ошибке

Overflow occurred during data type conversion.Filter not found to convert type 1 to type 2.

Вы сохраняете блоб типа 1 (TEXT) в блоб типа 2 (BLR). Зачем ?

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

Re: FB 2.0 -> FB 2.1

Сообщение kdv » 04 фев 2010, 15:11

кстати, на всякий случай - надеюсь, TBlob взят из исправленного мной FreeUdfLib - http://www.ibase.ru/download/freeudflib.zip
или отсюда - http://www.ibase.ru/download/blobsaveload.zip

K.Nick
Сообщения: 11
Зарегистрирован: 16 янв 2007, 19:10

Re: FB 2.0 -> FB 2.1

Сообщение K.Nick » 04 фев 2010, 17:34

hvlad писал(а):Не думаю, что проблема в UDF.
Читайте внимательно сообщение об ошибке

Overflow occurred during data type conversion.Filter not found to convert type 1 to type 2.

Вы сохраняете блоб типа 1 (TEXT) в блоб типа 2 (BLR). Зачем ?
Нужно было добавить к блобу информацию
Не нашел как вернуть из UDF блоб, поэтому вернул VarChar(32000)

Далее идет
много обработок с этим же VarChar(32000)
и
Update
Blob = Varchar(32000) - раньше (в FB 2.0) это работало

ошибка пропадает только если убрать в ХП вызов этой UDF функции.

K.Nick
Сообщения: 11
Зарегистрирован: 16 янв 2007, 19:10

Re: FB 2.0 -> FB 2.1

Сообщение K.Nick » 04 фев 2010, 18:19

Убрал Update
Blob = varchar(32000)
ошибки нет...

Теперь другая тема
как в UDF писать в блоб


TBLob действительно был немного не тот
переделка не повлияла на результат.

K.Nick
Сообщения: 11
Зарегистрирован: 16 янв 2007, 19:10

Re: FB 2.0 -> FB 2.1

Сообщение K.Nick » 04 фев 2010, 18:43

K.Nick писал(а):Убрал Update
Blob = varchar(32000)

Теперь другая тема
как в UDF писать в блоб
Т.е. как вернуть из UDF поле типа Blob с результатом ?

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

Re: FB 2.0 -> FB 2.1

Сообщение hvlad » 04 фев 2010, 19:40

K.Nick писал(а):Убрал Update
Blob = varchar(32000)
ошибки нет...
Блоб как объявлен в таблице ?
K.Nick писал(а):Теперь другая тема
как в UDF писать в блоб
На этом же сайте есть туча примеров

K.Nick
Сообщения: 11
Зарегистрирован: 16 янв 2007, 19:10

Re: FB 2.0 -> FB 2.1

Сообщение K.Nick » 05 фев 2010, 10:36

hvlad писал(а):
K.Nick писал(а):Убрал Update
Blob = varchar(32000)
ошибки нет...
Блоб как объявлен в таблице ?
K.Nick писал(а):Теперь другая тема
как в UDF писать в блоб
На этом же сайте есть туча примеров
Поставил SUBTYPE 0
Заработало

с UDF и Blob решу позже
самое неприятное в ТУЧЕ примеров
то что это туча
в прошлый раз ничего ненашел...

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

Re: FB 2.0 -> FB 2.1

Сообщение kdv » 08 фев 2010, 02:35

то что это туча
в прошлый раз ничего ненашел...
1. не туча
2. достаточно спросить. только вопрос желательно максимально конкретизировать.
основы есть в www.ibase.ru/devinfo/udf_ok.htm

Ответить