[firebase-br] De loucos...

Mário Reis secretariadogeral em acra.pt
Dom Dez 3 13:32:34 -03 2006


Caríssimos,

Uma decepção!!! A UDF funciona mas quanto ao exemplo da Procedure 
MS_NO('APL034', New.Var) já não. E, o pior é que não percebo
porque razão recebo sempre a mensagem: "Arithemetic overflow or division by 
zero has occured. Arithmetic exception, numeric oferflow or string 
truncation.", isto sempre que a String a formatar vem do meu fichero de 
mensagens.

No entanto se passar a mensagem HardCoded tipo:
S1=Udf_Format('O Cliente %S indicado, não se encontra registado', 
NEW.My_NCLI) seguido de: EXCEPTION STOP S1, funciona, sempre e na perfeição. 
Tenho as Variáveis de ficheiro MSG.MSG_TXT (varchar(130) CHARACTER SET 
WIN1252 NOT NULL COLLATE PXW_INTL850 ) quer as da Procedure(Varchar(254) 
CHARACTER SET WIN1252 ) ou seja, ambas do mesmo tipo.

Serei eu que não percebo nada disto ou estaremos perante um bug do 
FireBird1.5 ou 2.0. É que tenho o mesmo problema com ambos.

Haverá alguém capaz de dar ajuda para perceber que raio se está a passar.
Obrigado
Mário Reis


Antes havia escrito assim, e, p/qq razão não ficou registado no grupo nem 
sei a onde foi parar:

Olhem acabei resolvendo assim.  É uma adaptação de um exemplo desse que há 
aos montes na NET Que pena não lembro o autor.
Mas é assim: como não consigo passar um array of const do Firebird para esta 
função resolvi assim e creio, deve dar para todas as necessidades
só temos de fazer Cast( ??? AS CHAR/VARCHAR) que de resto funciona sempre. É 
o meu modesto contributo mas, acredito que pode ser util a todos.

Cumprimentos de um novato do Firebird.

Mário Reis

PS-Desculpem qq coisa.

function udf_format(Str, Str_Rpl: PChar): PChar; cdecl; export;
Var Str1,Str2,Str3:String;
    nlen, npos, pos1:Integer;
begin

       nPos:=0;
       nLen:=2;
       str1 := ''; str2 := ''; str3 := '';
       pos1 := pos(';',Str_Rpl); // Isolar os pedaços separados por 
Ponto&Vírgula
       if pos1 = 0 then
        begin
         npos := pos('%S', Str);
         if nPos>0 Then
           Str := Pchar(StuffString(Str, npos, nLen, Str_Rpl));
        end
       else
        begin
         str3 := Str_Rpl;
          repeat
            str1 := copy(str3,1,pos1-1);
            str2 := copy(str3,pos1+1,(length(str3)-length(str1)));
            npos := pos('%S', Str);
            Str  := PChar(StuffString(Str, npos, nLen,Str1));
            str3 := str2;
            pos1 := pos(';',str3);
           until pos1 = 0;
          end;

    Result := Str;
    StrPCopy(Str, Copy(Str,1,254));

end;

Exemplo:

CREATE PROCEDURE MS_NO(
  S_IN CHAR(6) CHARACTER SET WIN1252,
  S_RPL VARCHAR(254) CHARACTER SET WIN1252)
RETURNS(
  S_OUT VARCHAR(254) CHARACTER SET WIN1252)
AS
BEGIN
  /* Procedure body */
  Select msg_txt from MSG Where Msg_No=:s_IN into S_OUT ;
  if (s_out=' ') then
    Exception Stop 'Erro campo «Código Erro» vazio: ';
  ELSE
    S_OUT=udf_format(s_out, s_rpl);

  SUSPEND;
END;

// Registo no FireBird:

DECLARE EXTERNAL FUNCTION UDF_FORMAT
  CSTRING(254) CHARACTER SET WIN1252,
  CSTRING(254) CHARACTER SET WIN1252
RETURNS CSTRING(254) CHARACTER SET WIN1252
ENTRY_POINT 'udf_format' MODULE_NAME 'tbudf'; 







Mais detalhes sobre a lista de discussão lista