[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