RibaSoft Postado 31 Março Compartilhar Postado 31 Março Olá à todos, depois de muito tentar não consegui achar uma solução, ao importar um xml de nfe pelo componente acbrnfe, da access violation em um xml de TPAG = 3 "Cartão de Crédito" que não possui a tag TBand. Tentei usar o if assigned(auxNF.NotasFiscais.Items[0].NFe.pag.Items[I].tBand)then antes de tentar acessar o valor de tBand mas ele não aceita, tem alguma forma correta de verificar se essa tag existe antes de tentar acessá-la? Link para o comentário Compartilhar em outros sites More sharing options...
Fabrício G. Araújo Postado 1 Abril Compartilhar Postado 1 Abril Não teria porque dar erro de access violation em tBand, até porque não é uma classe e sim apenas um tipo. Verifica se realmente suas variáveis estão corretas como o seu índice "I" em ...Items[I]. 1 Link para o comentário Compartilhar em outros sites More sharing options...
RibaSoft Postado 1 Abril Autor Compartilhar Postado 1 Abril Ta bom, muito obrigado por responder, achei mesmo estranho, vou revisar novamente pra tentar descobrir e aviso aq, DEUS abençoe Link para o comentário Compartilhar em outros sites More sharing options...
RibaSoft Postado 1 Abril Autor Compartilhar Postado 1 Abril (editado) Então.. Logo após esse meu codigo esta exatamente assim dentro de um for ou seja o mesmo "I" que passa no ...Items[I].tPag da violation no ...Items[I].tBand e só dá esse problema quando no xml o tband esta ausente. case auxNF.NotasFiscais.Items[0].NFe.pag.Items[I].tPag of fpDinheiro: Pag[I].TPAG := 1; fpCheque: Pag[I].TPAG := 2; fpCartaoCredito: Pag[I].TPAG := 3; fpCartaoDebito: Pag[I].TPAG := 4; fpCreditoLoja: Pag[I].TPAG := 5; fpValeAlimentacao: Pag[I].TPAG := 10; fpValeRefeicao: Pag[I].TPAG := 11; fpValePresente: Pag[I].TPAG := 12; fpValeCombustivel: Pag[I].TPAG := 13; fpBoletoBancario: Pag[I].TPAG := 15; fpDepositoBancario: Pag[I].TPAG := 16; fpPagamentoInstantaneo: Pag[I].TPAG := 17; fpTransfBancario: Pag[I].TPAG := 18; fpProgramaFidelidade: Pag[I].TPAG := 19; fpSemPagamento: Pag[I].TPAG := 90; else Pag[I].TPAG := 0; end; if (Pag[I].TPAG = 3) or (Pag[I].TPAG = 4) then case auxNF.NotasFiscais.Items[0].NFe.pag.Items[I].tBand of bcVisa: Pag[I].TBAND := 1; bcMasterCard: Pag[I].TBAND := 2; bcAmericanExpress: Pag[I].TBAND := 3; bcSorocred: Pag[I].TBAND := 4; bcDinersClub: Pag[I].TBAND := 5; bcElo: Pag[I].TBAND := 6; bcHipercard: Pag[I].TBAND := 7; bcAura: Pag[I].TBAND := 8; bcCabal: Pag[I].TBAND := 9; bcAlelo: Pag[I].TBAND := 10; bcBanesCard: Pag[I].TBAND := 11; bcCalCard: Pag[I].TBAND := 12; bcCredz: Pag[I].TBAND := 13; bcDiscover: Pag[I].TBAND := 14; bcGoodCard: Pag[I].TBAND := 15; bcGreenCard: Pag[I].TBAND := 16; bcHiper: Pag[I].TBAND := 17; bcJcB: Pag[I].TBAND := 18; bcMais: Pag[I].TBAND := 19; bcMaxVan: Pag[I].TBAND := 20; bcPolicard: Pag[I].TBAND := 21; bcRedeCompras: Pag[I].TBAND := 22; bcSodexo: Pag[I].TBAND := 23; bcValeCard: Pag[I].TBAND := 24; bcVerocheque: Pag[I].TBAND := 25; bcVR: Pag[I].TBAND := 26; bcTicket: Pag[I].TBAND := 27; bcOutros: Pag[I].TBAND := 99; end; Editado 1 Abril por RibaSoft Link para o comentário Compartilhar em outros sites More sharing options...
Moderadores Juliomar Marchetti Postado 1 Abril Moderadores Compartilhar Postado 1 Abril mas tu te que testar se tem Pag.count para dai fazer loop 1 Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br Link para o comentário Compartilhar em outros sites More sharing options...
RibaSoft Postado 1 Abril Autor Compartilhar Postado 1 Abril Sim, tem o Pag.count por isso no "Items[I].tPag" não da erro pois o pagamento existe, o problema é que mesmo sendo cartão de crédito e existindo o pagamento, a tag TBand não existe nesse pagamento nesses xmls dessa cliente. Link para o comentário Compartilhar em outros sites More sharing options...
Moderadores Juliomar Marchetti Postado 1 Abril Moderadores Compartilhar Postado 1 Abril sim, se faz necessário validar se veio a tag! 1 Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br Link para o comentário Compartilhar em outros sites More sharing options...
Fabrício G. Araújo Postado 2 Abril Compartilhar Postado 2 Abril @RibaSoft teria que entender o que está fazendo... se você já tem o componente que você chamou de "auxNF" com todos os atributos lidos da nota (provavelmente com loadfromfile), você está atribuindo em outro componente ou variável? O que seria isso (destacado em vermelho)?: if (Pag[I].TPAG = 3) or (Pag[I].TPAG = 4) then case auxNF.NotasFiscais.Items[0].NFe.pag.Items[I].tBand of bcVisa: Pag[I].TBAND := 1; Se é uma variável ou componente tem que garantir que você criou a instância dessa classe, senão vai dar o acess violation. 1 Link para o comentário Compartilhar em outros sites More sharing options...
RibaSoft Postado 2 Abril Autor Compartilhar Postado 2 Abril @Fabrício G. AraújoMuito obrigado pela sua boa vontade em me ajudar, esse Pag[I].TPAG é um "Pag: array of TPagamentos;" e T pagamentos é "TPagamentos = record TPAG: integer; TBAND: integer; VPAG: currency; CAUT: string; end;" onde armazeno os dados extraidos do xml para depois inseri-los no banco de dados. Eu Determino o tamanho do array assim: C := auxNF.NotasFiscais.Items[0].NFe.pag.Count; {$Hints off} SetLength(Pag, C); {$Hints on} o auxNF é "auxNF: TACBrNFe;" eu gosto de criar todos os componentes em tempo de execução. esse codigo funcionar normalmente quando a tag "TBand" existe dentro da tag "Tpag", só dá problema quando a tag "TBAnd" não existe. E o erro e "access" é exatamente na linha "case auxNF.NotasFiscais.Items[0].NFe.pag.Items[I].tBand of" ou seja quando tento ler a informação tBand, não chega a ir na linha onde meu array está. Fico muito grato pela atenção, eu estava em um grupo de Lazarus tentando ajudar o máximo de gente possivel, mas o pessoal começou a abusar muito, tipo querendo se aproveitar da minha boa vontade, eu só peço ajuda depois de muito tentar e realmente não conseguir. e entendo pq as vezes o pessoal não quer ajudar ou dá uns "coice" por aq. Link para o comentário Compartilhar em outros sites More sharing options...
Moderadores Juliomar Marchetti Postado 2 Abril Moderadores Compartilhar Postado 2 Abril 3 minutos atrás, RibaSoft disse: @Fabrício G. AraújoMuito obrigado pela sua boa vontade em me ajudar, esse Pag[I].TPAG é um "Pag: array of TPagamentos;" e T pagamentos é "TPagamentos = record TPAG: integer; TBAND: integer; VPAG: currency; CAUT: string; end;" onde armazeno os dados extraidos do xml para depois inseri-los no banco de dados. Eu Determino o tamanho do array assim: C := auxNF.NotasFiscais.Items[0].NFe.pag.Count; {$Hints off} SetLength(Pag, C); {$Hints on} o auxNF é "auxNF: TACBrNFe;" eu gosto de criar todos os componentes em tempo de execução. esse codigo funcionar normalmente quando a tag "TBand" existe dentro da tag "Tpag", só dá problema quando a tag "TBAnd" não existe. E o erro e "access" é exatamente na linha "case auxNF.NotasFiscais.Items[0].NFe.pag.Items[I].tBand of" ou seja quando tento ler a informação tBand, não chega a ir na linha onde meu array está. Fico muito grato pela atenção, eu estava em um grupo de Lazarus tentando ajudar o máximo de gente possivel, mas o pessoal começou a abusar muito, tipo querendo se aproveitar da minha boa vontade, eu só peço ajuda depois de muito tentar e realmente não conseguir. e entendo pq as vezes o pessoal não quer ajudar ou dá uns "coice" por aq. Hum tu tem uma copia da estrutura que já existe no TNFe do ACBr para seu sistema com record? não seria necessário replicar ela. tente usar já o TNFe que vem os dados. quando a validar no caso é preciso saber se essa tag tá ali if assigned(valor, campo, array) dai sim faz algo 1 Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br Link para o comentário Compartilhar em outros sites More sharing options...
Fabrício G. Araújo Postado 2 Abril Compartilhar Postado 2 Abril (editado) @RibaSoft não estou sabendo como te ajudar, mas nunca tive problemas para ler esse atributo tBand sem estar preenchido. Fiz um exemplo bem simples que você pode testar em seu ambiente, cria um botão em um form e coloca esse código: procedure TForm1.Button1Click(Sender: TObject); var vACBrNFe: TACBrNFe; vNFe: TNFe; i: Integer; strAux: string; begin try vACBrNFe := TACBrNFe.Create(nil); vACBrNFe.NotasFiscais.Clear; vACBrNFe.NotasFiscais.LoadFromFile('C:\teste\nf.xml'); vNFe := vACBrNFe.NotasFiscais.Items[0].NFe; for i:=0 to vNFe.pag.Count-1 do begin strAux := 'Dados pagto indice ' + IntToStr(i) + '): ' + #13#10 + ' tPag: ' + FormaPagamentoToStr(vNFe.pag[i].tPag) + #13#10 + ' vPag: ' + FloatToStr(vNFe.pag[i].vPag) + #13#10 + ' tpIntegra: ' + tpIntegraToStr(vNFe.pag[i].tpIntegra) + #13#10 + ' CNPJ: ' + vNFe.pag[i].CNPJ + #13#10 + ' tBand: ' + BandeiraCartaoToStr(vNFe.pag[i].tBand) + #13#10 + ' cAut: ' + vNFe.pag[i].cAut; ShowMessage(strAux); end; finally FreeAndNil(vACBrNFe); end; end; Dá uses em ACBrNFe, pcnNFe, pcnConversao e no loadfromfile aponta para o seu arquivo xml. Neste exemplo, aqui li um xml sem o tBand também, assim: E funciona normal, sem dar acess violation. Valida aí no seu ambiente e vê no que dá. Editado 2 Abril por Fabrício G. Araújo 1 Link para o comentário Compartilhar em outros sites More sharing options...
RibaSoft Postado 2 Abril Autor Compartilhar Postado 2 Abril Muito obrigado pela ajuda, vou testar as duas dicar e reporto aq o resultado de cada uma, DEUS abençoe a todos. Link para o comentário Compartilhar em outros sites More sharing options...
Solution RibaSoft Postado 2 Abril Autor Solution Compartilhar Postado 2 Abril Boa noite, graças a DEUS descobri, não sei exatamente o porque mas deu certo. Agradeço a explicação de ambos, não conhecia o "TNFe" da "pcnNFE", fico grato pelo conhecimento, mas como o "Record" já estava pronto deixei com ele mesmo, nas proximas vezes usarei o "TNFe". Então... usando o exemplo do @Fabrício G. Araújo, rodou normal e o meu dava erro, dai de pois de varios testes descobri que tirando o "bcOutros: Pag[I].TBAND := 99;" do case o erro parou. Dai ficou assim e funciona perfeitamente... if (Pag[I].TPAG = 3) or (Pag[I].TPAG = 4) then case auxNF.NotasFiscais.Items[0].NFe.pag[I].tBand of bcVisa: Pag[I].TBAND := 1; bcMasterCard: Pag[I].TBAND := 2; bcAmericanExpress: Pag[I].TBAND := 3; bcSorocred: Pag[I].TBAND := 4; bcDinersClub: Pag[I].TBAND := 5; bcElo: Pag[I].TBAND := 6; bcHipercard: Pag[I].TBAND := 7; bcAura: Pag[I].TBAND := 8; bcCabal: Pag[I].TBAND := 9; bcAlelo: Pag[I].TBAND := 10; bcBanesCard: Pag[I].TBAND := 11; bcCalCard: Pag[I].TBAND := 12; bcCredz: Pag[I].TBAND := 13; bcDiscover: Pag[I].TBAND := 14; bcGoodCard: Pag[I].TBAND := 15; bcGreenCard: Pag[I].TBAND := 16; bcHiper: Pag[I].TBAND := 17; bcJcB: Pag[I].TBAND := 18; bcMais: Pag[I].TBAND := 19; bcMaxVan: Pag[I].TBAND := 20; bcPolicard: Pag[I].TBAND := 21; bcRedeCompras: Pag[I].TBAND := 22; bcSodexo: Pag[I].TBAND := 23; bcValeCard: Pag[I].TBAND := 24; bcVerocheque: Pag[I].TBAND := 25; bcVR: Pag[I].TBAND := 26; bcTicket: Pag[I].TBAND := 27; else Pag[I].TBAND := 99; end; Se alguem puder explicar pq esse "bcOutros" deu problema nesse contexto fico muito feliz pois gosto de aprender td nos minimos detalhes, mas o problema já está resolvido e da minha porte pode fechar o tópico se necessário, muito obrigado mesmo pela dedicação de vcs. DEUS abençoe. Link para o comentário Compartilhar em outros sites More sharing options...
Fabrício G. Araújo Postado 3 Abril Compartilhar Postado 3 Abril Que bom que deu certo @RibaSoft, mas realmente continuei sem entender o porquê do acess violation. Mas você chegou a perceber que nem sequer você precisa da longa codificação dos seus "case"? No exemplo que passei tem as funções de conversão. Todo o seu "case" para atribuir em seu array ( Pag[I].TBAND ) pode reduzir em uma linha de código, por exemplo: Pag[I].TBAND := StrToIntDef( BandeiraCartaoToStr(auxNF.NotasFiscais.Items[0].NFe.pag[I].tBand), 99 ); Pode fazer o mesmo para o outro "case" também, o que atribui o seu Pag[I].TPAG 1 Link para o comentário Compartilhar em outros sites More sharing options...
RibaSoft Postado 3 Abril Autor Compartilhar Postado 3 Abril @Fabrício G. Araújo A sim, vou dar uma olhada e refatorar o código, obrigado pela dica, fico muito contente com novos conhecimentos e melhores praticas de programação, DEUS abençoe 1 Link para o comentário Compartilhar em outros sites More sharing options...
Consultores Renato Rubinho Postado 3 Abril Consultores Compartilhar Postado 3 Abril Obrigado por reportar. Fechando. Para novas dúvidas, criar um novo tópico. Link para o comentário Compartilhar em outros sites More sharing options...
Recommended Posts