Ir para conteúdo
  • Cadastre-se

dev botao

Tradutor de mensagem que volta do Schema


AlexandreADC
  • Este tópico foi criado há 4662 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Gente, fiz uma rotina para deixar ao usuário + fácil a visualização da causa da não validação.

seguem as fontes da rotina:

Mas antes coloque um componente do tipo TXMLDocument com nome de XMLDoc, e selecione o FileName colocando o shema cteTiposBasico_v1.03.xsd!!!

function TForm5.TraduzMensagem(MensagemOriginal: String): String;

var

vMensagemTraduzida, vMensagemOriginal:TStrings;

vString:String;

I, vPosicao1, vPosicao2: Integer;

begin

vMensagemTraduzida := TStringList.Create;

vMensagemOriginal := TStringList.Create;

while Trim(MensagemOriginal) <> '' do

begin

if Pos(#$D#$A, MensagemOriginal) <> 0 then

vMensagemOriginal.Add(Copy(MensagemOriginal, 1,Pos(#$D#$A, MensagemOriginal) +1))

else

vMensagemOriginal.Add(Copy(MensagemOriginal, 1, Length(MensagemOriginal)));

if Pos(#$D#$A, MensagemOriginal) <> 0 then

MensagemOriginal := Copy(MensagemOriginal, Pos(#$D#$A, MensagemOriginal) +2, Length(MensagemOriginal))

else

MensagemOriginal := '';

end;

try

if pos('Falha na validação dos dados do Conhecimento',vMensagemOriginal.Strings[0]) <> 0 then

begin

vMensagemTraduzida.Add(vMensagemOriginal[0]);

end;

for I := 0 to vMensagemOriginal.Count - 1 do

begin

if pos('TAG:',vMensagemOriginal) <> 0 then

begin

vPosicao1 := (Pos(#$D, vMensagemOriginal)- Pos('/', vMensagemOriginal)+1);

vMensagemTraduzida.Add('TAG: '+Copy(vMensagemOriginal,Pos('/', vMensagemOriginal)+1, vPosicao1-1));

end

else if pos('element', vMensagemOriginal) <> 0 then

begin

vString := Copy(vMensagemOriginal, Pos('}', vMensagemOriginal)+1,

Pos('''', Copy(vMensagemOriginal, Pos('}', vMensagemOriginal)+1, Length(vMensagemOriginal)))-1);

vString := 'TAG: '+ vString +'('+TagToNameTag(XMLDoc.DocumentElement, vString) + ') ';

if pos('with value', vMensagemOriginal) <> 0 then

begin

vPosicao1 := pos(' with value ', vMensagemOriginal) +12;

vPosicao2:= Pos('''',Copy(vMensagemOriginal, vPosicao1+1, Length(vMensagemOriginal)))+1;

vString := vString + ' com preenchimento inválido de acordo com o Schema. Contendo o valor:' +Copy(vMensagemOriginal, vPosicao1,vPosicao2);

end

else if pos('is incomplete according to the DTD/Schema', vMensagemOriginal) <> 0 then

begin

vString := vString + ' está incompleto de acordo com o Schema.'

end;

vMensagemTraduzida.Add(vString);

end

else if pos('Expecting:', vMensagemOriginal) <> 0 then

begin

vPosicao1 := Pos('}', vMensagemOriginal)+1;

vString := Copy(vMensagemOriginal, vPosicao1,

Pos(',', Copy(vMensagemOriginal, vPosicao1, Length(vMensagemOriginal)))-1);

vString := 'Esperando-se o preenchimento de: '+ vString +'('+TagToNameTag(XMLDoc.DocumentElement, vString) + ') ';

while Length(vMensagemOriginal) > 0 do

begin

vPosicao2 := Pos(',', vMensagemOriginal);

if (vPosicao2 =0) and (vPosicao1 > 0) then

begin

vMensagemOriginal := '';

Break;

end;

vMensagemOriginal := Copy(vMensagemOriginal, vPosicao2+1, Length(vMensagemOriginal));

vPosicao1 := Pos('}', vMensagemOriginal);

if (vPosicao1 = 0) and (Pos('{', vMensagemOriginal) >0) then

begin

vString := vString + '...';

Break;

end

else

begin

vPosicao2 := Pos(',', vMensagemOriginal);

if (vPosicao2 =0) and (vPosicao1 > 0) then

begin

vString := vString+' e/ou '+ Copy(vMensagemOriginal, vPosicao1+1, Length(vMensagemOriginal));

end

else

vString := vString+' e/ou '+ Copy(vMensagemOriginal, vPosicao1+1, (vPosicao2 -1)-vPosicao1)+

'('+TagToNameTag(XMLDoc.DocumentElement, Copy(vMensagemOriginal, vPosicao1+1, (vPosicao2-1)-vPosicao1)) + ') ';

end;

end;

vMensagemTraduzida.Add(vString);

end;

end;

Result := vMensagemTraduzida.Text;

finally

FreeAndNil(vMensagemTraduzida);

FreeAndNil(vMensagemOriginal);

end;

end;

function TForm5.TagToNameTag(ChildNode:IXMLNode; NomeTag:String):String;

var

I: Integer;

begin

Result := '';

ChildNode.ChildNodes.First;

if (ChildNode.NodeName = 'xs:element') then

begin

if ChildNode.GetAttributeNS('name','') = NomeTag then

begin

if (ChildNode.ChildNodes.FindNode('xs:annotation') <> nil) then

begin

Result := ChildNode.ChildNodes.FindNode('xs:annotation').ChildNodes.FindNode('xs:documentation').Text;

Exit;

end;

end;

end;

for I := 0 to ChildNode.ChildNodes.Count - 1 do

begin

Result := TagToNameTag(ChildNode.ChildNodes.Nodes, NomeTag);

if Result <> '' then

Exit;

end;

end;

Quem estiver disposto a melhorar esta função seria muito bem vindo. E se possível compartilhar com os demais!

A função TagToNameTag retorna a descrição, da Tag dentro do Schema...

Alexandre De Carli,
Gerente de Projetos na empresa Econtabil Software.


email: [email protected]
site: http://www.extremeprogramming.wordpress.com
Pato Branco - PR

Link para o comentário
Compartilhar em outros sites

Bem... Deixo explicar melhor, ontem eu estava com pressa e não deu...

Essa rotina foi feita para traduzir a mensagem de excessão que retorna após ser executado CTe.Conhecimentos.Valida.

É manipulação de String pura, vai ser difícil de entender o código, até pra mim... Porque exige muitos "Copy" e "Pos".

Espero que seja útil para vocês! Obrigado!

Alexandre De Carli,
Gerente de Projetos na empresa Econtabil Software.


email: [email protected]
site: http://www.extremeprogramming.wordpress.com
Pato Branco - PR

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...
  • Este tópico foi criado há 4662 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.