[firebase-br] TRIGUER BUG C/constantes Funciona com SELECT MSg_txt where codigo=:wcodigo into my var dá sempre 1 erro

Mário Reis secretariadogeral em acra.pt
Sex Dez 1 16:58:33 -03 2006


Será que alguém já teve o mm problema?

Inicialmente comecei por criar uma Procedure que me fizesse o mesmo que fazo FORMAT  do Pascal. Recebe 2 parametros de input
S1 (mensagem a formatar) , S2 (pedaços a insereir em % de S1) e retorna S3 ou seja o S1 Formatado. Funciona catita.Exemplo abaixo:

 IF (NEW.NIB_LIN IS NOT NULL) THEN
   begin
    -- Teste com Pesos especifico MOD.11
      Execute Procedure nib_is_valid NEW.NIB_LIN Returning_values nib_ok;
      IF (nib_ok<>'T') then
       begin
          s1 = 'O Nº. Interbancário %  é inválido';
          s2 = new.nib_lin||'";"';
       -- Simulando o Format( String, [array of const do Pascal])
       Execute Procedure MSG_ERROR (S1,S2) returning_values s3;
       EXCEPTION STOP S3;  -- Funciona Perfeitamente Bem
       -- Em vez de fazer assim :
       -- EXCEPTION STOP 'N.º Interbancário ('||new.nib_lin||') é invalido. P/favor corrija o NIB';
      end
   end

SOFISTICANDO UM POUCO MAIS:

 ** Codifiquei as mensagens tipo num ficheiro com codigo + texto C/ % S para intercalar assim:
        

 IF (NEW.NIB_LIN IS NOT NULL) THEN
   begin
    -- Teste com Pesos especifico MOD.11
      Execute Procedure nib_is_valid NEW.NIB_LIN Returning_values nib_ok;
      IF (nib_ok<>'T') then
       begin
 
        --Assim
                 Execute Procedure MS_NO('APL011') Returning_values S1;
         -- ou Assim
       
           Select MSG_TXT  From MSG where (MSG_NO='APL011') INTO S1
          S2=new.nib_lin||'";"';


       -- NÃO consigo simular o Format( String, [array of const do Pascal])
     Sempre o mm erro:
     " Arithmetic overflow or divisio by zero has occurred. Arithmetic exception, numeric overflow, or string truncation."
     
      NO ENTANTO- interactivamente(passando os parametors no debugger EMS-IBMAnagerLITE) faz muito bem o que é suposto fazer...
     não percebo. 
    Já matei o ficheiro de mensagens e voltei a criár com a mesma Character Set win1252 + Collate PXW_INTL850 e continuo sempre com a mesma   mensagem de erro.     Fogo é       de   loucos. 


       Execute Procedure MSG_ERROR (S1,S2) returning_values S3; -- Já não Funciona
       EXCEPTION STOP S3;  
      end
   end


A ideia era até fazer o SELECT do MS_TEXTO do Erro e a Exception tudo na mm procedure. Mas assim não vai dar!!!

Ver abaixo:

CREATE PROCEDURE MSG_ERROR(
  STR_INICIAL VARCHAR(254) CHARACTER SET WIN1252,
  STR_REPLACE VARCHAR(254) CHARACTER SET WIN1252)
RETURNS(
  MY_RESULT VARCHAR(254) CHARACTER SET WIN1252)
AS
DECLARE VARIABLE STR1 VARCHAR(254) CHARACTER SET WIN1252;
DECLARE VARIABLE STR2 VARCHAR(252) CHARACTER SET WIN1252;
DECLARE VARIABLE STR3 VARCHAR(254) CHARACTER SET WIN1252;
DECLARE VARIABLE I INTEGER;
DECLARE VARIABLE N INTEGER;
DECLARE VARIABLE NLEN INTEGER;
DECLARE VARIABLE NPOS INTEGER;
DECLARE VARIABLE POS1 INTEGER;
DECLARE VARIABLE STR_AUX VARCHAR(254) CHARACTER SET WIN1252;
BEGIN
/*  S_Inicio='Oh % DosReyx! Isto é % teste'
    Intercalar com S_Substituição='Mário;Um;'
    Chamada: Msg_Error(S_Inicio, S_Substituição )
*/
 --Select msg_txt from MSG Where Msg_No=:Str_Inicial into Str_Aux ;
 str_aux=Ltrim(Rtrim(Str_Inicial));
 STR1 = '';
 STR2 = '';
 STR3 = '';
 nLen =  1;
 pos1=udf_pos(';',Str_Replace);
 if (pos1=0) then
  begin
    npos = udf_pos('%', Str_Aux );
    if (npos>0) Then
     my_result=udf_stuff(Str_Aux,npos,nlen,Rtrim(Str_Replace) );
    else
     my_result=Str_Aux||'-'||Str_Replace;
  end
 else
  begin
    str3=rtrim(ltrim(Str_Replace));
    i=1;
    n=Strlen(Rtrim(lTrim(Str_Replace)));
    While ((i < n) and (pos1>0)) DO
     begin
       str1 = udf_copy(str3,1,pos1-1);
       str2 = udf_copy(str3,pos1+1,(strlen(ltrim(rtrim(str3)))-strlen(ltrim(rtrim(str1)))));
       npos = udf_pos('%', Str_Aux );
       my_result=udf_stuff(Str_Aux,npos,nlen,Rtrim(str1) );
       -- Não é o Format(' Strng....%S',['my_string']
       -- mas dá pró gasto...
       -- Vai matando as '%' a cada volta do ciclo
       -- inserindo as strings de susbstituição
       -- agora melhorar c/ fiche de erros aplicacionais
       -- e passar o "Código d' Erro" em vez da 1.ª String
       -- ou fazer duas 1.º o Select MSG(sErro)
       Str_Aux=my_result;
       str3 = rtrim(ltrim(str2));
       pos1 = udf_pos(';',str3);
     end
   end
   

 --If (my_result is not null) Then
 --  EXCEPTION STOP 'Atenção: '||current_user||'-'||my_result;

  SUSPEND;
END; 

Alguem pode ajudar?
Obrigado
Mário


Mais detalhes sobre a lista de discussão lista