[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