[firebase-br] Mensagens de Erro (falta aprefei?oar)
Mário Reis
secretariadogeral em acra.pt
Qua Abr 18 16:24:20 -03 2007
Olá Pessoal,
Faz algum tempo que não aparecia por aqui e como entretanto resolvi (creio
eu) o problema da tradução de mensagens para Português "On -Fly" ecomo
entendo que eram um quebra-cabeças e que todas as soluções que encontrei na
Net, não obstante a sua qualidade, não satisfaziam(satisfazem) resolvi
partilhar convosco a ideia ainda que um pouco embrionária.
Tb tenho uma questão a colocar de modo que talvez possamos com diferente
contributos torná-la mais flexilvel - optimizá-la! Aqui vai:
Comocei por apanhar todos os códigos MDOErrrCode e carregalos numa tabela
com o intuito de os traduzir. Mas, continuei a achar que as mensagens são
super estranhas e dizem pouco ao utilizador final. Veja por exemplo mm
traduzida (MDOERRORCODE):
Ingles: 335544665-Violation of PRIMARY or UNIQUE KEY constraint
"<string>" on table "<string>"
Portugues:335544665-Violação da Chave Primária ou Única ! Validação
"PK_BANCOS_ID" na tabela "BANCOS".
Salvo melhor opinião mm depois de traduzida a mensagem não é
suficientemente clara. Todavia, foi é possível ter uma mensagem mais
consentânea com as necessidades, do tipo:
335544665- Já existe esse Código %S, na tabela %S Verifique a referencia de
integridade "PK_BANCOS_ID" na Tabela "BANCOS" ou,
// Até aqui já cheguei...
Já existe esse Código (ID_BANCO(0012)), na tabela
"BANCOS" Verifique a referencia de integridade "PK_BANCOS_ID"(%S=Campos????
da chave) na Tabela "BANCOS"
if Screen.ActiveControl <> NIL Then
begin
If Screen.ActiveControl.ClassName='TDBEdit' Then
sDBEditValue:= (Screen.ActiveControl as TDBEdit).Field.AsString ;
sSysControl := (Screen.ActiveControl as
TDBEdit).DataField+'('+wDBEditValue+')'; (*** Campo???? -- não satisfaz
preciso dos Campos da Chave e respectivos Valores***)
sDataSet := (Screen.ActiveControl as
TDBEdit).DataSource.DataSet.Name;
end;
If E.ClassName='EMDOFirebirdError' Then
begin
sErrorCode:=IntToStr(EMDOFirebirdError(E).MDOErrorCode);
MSG(sErrorCode, sUser, sSysMsg,[sSysControl,sDataSet,
xDebug1.UnitName,xDebug1.LineNo,xDebug1.PublicName],
MainForm.oStatusBar,FormLog.RichEdit1);
end;
Entretanto a descodificação da para da Mensagem original do FB é fewita
deste modo
e depois a Function MSG...
sSysMsg:=E.Message;
i:=0;n:=0; aux:='';
While i <= Length(sSysMsg) Do
Begin
inc(i);
If sSysMsg[i]='*' Then
begin
inc(i,3);
n:=LastDelimiter('*" ',sSysMsg)-5;
If n>0 Then
n:=n-i;
aux := Copy(sSysMsg,i,n+1);
i:=i+Length(aux);
end;
While (sSysMsg[i]=UpperCase(sSysMsg[i])) AND Not(sSysMsg[i]
IN[' ',',',';','.','!','?',':','-','^','~','/','\','<','>',
'%','=','}','{','»','«','"','@','#','$','&','(',')',
'*',chr(0),'+','´','`']) DO
Begin
as1:=sSysMsg[i];
aux := aux+as1;
inc(i);
End ;
// Valida "PRIMARY" "KEY" "UNIQUE" "FOREIGN" ETC...
If Palavra_Nao Reservada_(aux) Then
begin
aux:=TraduzirAux(aux); // descodifica ID_BANCO para "Código do Banco"
por exemplo!!!
// Falta optimizar qdo for <number> ou ambos...
MyMsg:=StringReplace(MyMsg,'<string>',aux,[rfIgnoreCase]);
aux:='';
end
Else
aux:='';
End;
If Locate....sErrorCode=335544665 Then
MyMsg:= DateTimeToStr(Now)+' < '+Format( MyMsg ,aMsg );
e obtenho: ==>>(Já existe esse Código (ID_BANCO(0012)), na tabela "BANCOS"
Verifique a referencia de integridade "PK_BANCOS_ID"(%S=Campos???? da chave)
na Tabela "BANCOS" Etc..). Funciona e é bem flexível, parece-me mas, agora
falta resolver uma questão relativa aos Campos que compõem a CHAVE e estou
sem saber como faze-lo! Por exemplo, uma chave com 2 campos PK_PRODUTO_SP
(ID_SERVP;ID_PERP). Como descodificá-los tb "ON-FLY"
Alguém pode ajudar?
Obrigado
Mário
Mais detalhes sobre a lista de discussão lista