[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