Ir para conteúdo
  • Cadastre-se

Painel de líderes

Conteúdo popular

Showing content with the highest reputation on 05-02-2019 em todas as áreas

  1. Olá pessoal, Para quem ainda não conhece, o Lazarus/FPC é uma poderosa IDE e compilador da Linguagem Object Pascal, muito semelhante ao Delphi, e desenvolvido totalmente em Código Aberto... ( Saiba mais em: https://www.lazarus-ide.org/index.php?page=about ) Hoje ocorreu o lançamento da versão 2.0.0 do Lazarus... O anúncio oficial, pode ser lido no fórum do Lazarus: http://forum.lazarus-ide.org/index.php/topic,44161.0.html Essa versão ainda usa o FPC (Free Pascal Compiler), na versão 3.0.4, então não devemos ter mudanças brusca na compilação dos projetos existentes... Você pode baixar o Lazarus 2.0, na página oficial do Projeto: https://www.lazarus-ide.org/ (Observe porém, que o Download sugerido, provavelmente será de um Compilador para Windows 64... O que muitas vezes não é o desejado, para manter a compatibilidade com as diferentes versões de Windows e as DLLs existentes) Portanto, recomendo selecionar a versão 32 Bits, conforme destacado, na imagem abaixo... Se você quer realmente gerar aplicações 64 bits, ainda poderá fazer um Cross-compiling , baixando um instalador complementar em: https://sourceforge.net/projects/lazarus/files/Lazarus Windows 32 bits/Lazarus 2.0.0/ O ACBr tem um ótimo suporte ao Lazarus/FPC, isso porque a maioria dos Consultores do Projeto ACBr, usam Lazarus/FPC como principal IDE para Desenvolvimento, e todos os nosso projetos, como: ACBrMonitorPLUS, e ACBrLib, são desenvolvidos em Lazarus/FPC. Abaixo segue um Screen Shot da minha IDE de trabalho (clique para aumentar) Quer conhecer mais aplicações desenvolvidas em Lazarus ? Veja esse Link: http://wiki.freepascal.org/Lazarus_Application_Gallery
    8 pontos
  2. Instalando o FixInsight para utilizar no seu projeto Para utilizar o TMS FixInsight no seu projeto, primeiro faça o download da versão trial no site oficial. O FixInsight está disponível para todas as versões do Delphi a partir do Delphi 2006. A versão pro possui linha de comando, permitindo você executar a ferramenta mesmo quando o Delphi não está aberto. Isso permite você integrar com seu sistema de Build ou sistema de integração contínua. A instalação é muito simples, bastando escolher em qual versão do Delphi você quer instalar. Após a instalação as seguintes entradas vão aparecer no menu Project: E também no "Project Manager" (clique com botão direito no projeto): A entrada "FixInsight Settings..." configura a ferramenta e pode habilitar ou desabilitar as mensagens geradas. Ela abre uma tela como essa: Na imagem acima você pode observar que a mensagem "C101 Method '%s' is too long (%d lines)" está selecionada e permite a configuração de quantas linhas para você um método, function ou procedure não deve exceder. Dá pra ver também que as mensagens C102 e C103 estão desabilitadas e assim não geram avisos. A entrada "Run FixInsight for unit1.pas" executa a ferramenta para a unit aberta atualmente (neste caso Unit1.pas). A entrada "Run FixInsight" executa a ferramenta no projeto atual inteiro. Rodando o FixInsight no seu projeto Como mencionado, é por meio da entrada 'Run FixInsight" que você executa a ferramenta no seu projeto. Então basta abrir o seu projeto e executar por meio do menu Project -> Run FixInsight. Ele vai ser executado e abrir uma aba na janela de mensagens como na imagem abaixo. Dois cliques te jogam na unit e linha relacionada a mensagem: Agora é com você. Você analisa a mensagem o código e verifica se algo pode ser feito.
    6 pontos
  3. Foto por David Siglin em Unsplash. Olá pessoal, É bom quando encontramos uma ferramenta que facilita ou melhora nosso trabalho, não? Todos devem ter notado que ultimamente temos enviado vários commits ao SVN de remoção de warnings e hints, muitas vezes mencionando a ferramenta FixInsight. Para quem não conhece, essa ferramenta faz uma análise do seu código e aponta possíveis erros e sugere otimizações. Ela é uma ferramenta muito boa, tanto que foi comprada pela TMS e se tornou TMS FixInsight. Já tem um tempo que conheço a ferramenta e sempre tive o desejo de rodá-la em todo o código do ACBr. Mas devido ao tempo não tinha sido possível. Depois de um incentivo (valeu @Waldir Paim), eu resolvi baixar a versão trial e fazer isso. E que bom que fiz. Gostaríamos de compartilhar com vocês algumas coisas que encontramos no nosso código com a ajuda dessa ferramenta. Encontrando pequenos problemas num código gigante Vamos começar por um código que estava no ACBrValidador. Vejam esse código, onde a função ValidarCEP de baixo chama a função ValidarCEP de cima, e tente encontrar um problema: function ValidarCEP(const ACEP, AUF: String): String; begin Result := ValidarDocumento( docCEP, ACEP, AUF); end; function ValidarCEP(const ACEP: Integer; AUF: String): String; begin ValidarCEP( FormatarCEP(ACEP), AUF ); end; Conseguiu ver o problema? Essa função nunca retornaria que um CEP é inválido se você passasse o CEP como inteiro. Precisava de um “Result := ” no início. Simples? Nem tanto quando lembramos do tamanho do projeto ACBr. Temos mais de 200 componentes e mais de 779 mil linhas de código, contribuídos por dezenas ou talvez centenas de programadores, embora a nossa equipe de commiters seja realmente pequena. Só a unit ACBrValidador.pas em questão tem atualmente cerca de 2070 linhas. Não fica muito mais fácil quando uma ferramenta aponta pra você? [FixInsight Warning] ACBrValidador.pas(294): W521 Return value of function 'ValidarCEP' might be undefined Vamos a outro exemplo no pacote ACBrSerial, componente ACBrECF: [FixInsight Warning] ACBrECFDaruma.pas(4638): W503 Assignment right hand side is equal to its left hand side Veja o código (só a parte interessante): else if StrToIntDef(fsNumVersao, -1) >= 345 then begin RetCmd := EnviaComando( ESC + #240 ); RetCmd := Copy(RetCmd, 92, Length(RetCmd)); RetCmd := RetCmd; //<--- Viu aqui??? for A := 0 to fpAliquotas.Count-1 do begin fpAliquotas[A].Total := RoundTo( StrToFloatDef(Copy(RetCmd,(A*14)+1,14),0) / 100, -2 ); end; end; end; Uma linha que não faz absolutamente nada a não ser gastar espaço, memória e CPU. Uma linha desnecessária a menos no código. E você consegue encontrar um no seu aplicativo código que nunca será executado? Ainda no mesmo pacote, veja esse exemplo:  [FixInsight Warning] ACBrECFDataRegis.pas(1838): W509 Unreachable code Nesse código: if (fsArqPrgBcoTXT <> '') and (not FileExists( fsArqPrgBcoTXT )) then begin Msg := ACBrStr( 'Arquivo '+fsArqPrgBcoTXT+' não encontrado. '+ 'Valores padrões serão utilizados.' ) ; raise EACBrECFErro.Create( Msg ); fsArqPrgBcoTXT := '' ; //Essa linha nunca vai ser executada porque tem um raise acima. end ; Mais uma vez, tente imaginar procurar esse problema num projeto tão grande. Não é facilmente percebido se você não tiver olhos treinados e estiver procurando problemas. Vamos a outro exemplo ainda no componente ACBrECF:  [FixInsight Warning] ACBrECFEscECF.pas(1222): W517 Variable 'CHK' hides a class field, method or property Veja esse código: procedure TACBrECFEscECFResposta.SetResposta(const AValue: AnsiString); Var Soma, I, F, LenCmd : Integer ; CHK : Byte ; begin O problema desse código é que ele confunde uma variável local (CHK) com uma propriedade da classe (TACBrECFEscECFResposta.CHK). É preciso analisar todo código em cada lugar que isso acontece para ter certeza quando você está se referindo a propriedade e quando é a variável. Imagine se você confunde uma com a outra. Uma hora você pensa que sua variável está recebendo valores estranhos. Outra hora você pensa que sua propriedade não está sendo atualizada. Nesse caso específico, a variável foi renomeada para vCHK evitando a confusão com a propriedade CHK. O importante é que quando você for ler o código, não precise ficar pensando “Isso aqui é uma variável ou uma propriedade?”. Veja outro exemplo, agora no ACBrSMS: [FixInsight Warning] ACBrSMSClass.pas(192): W511 Object 'ListaSMS' created in TRY block begin try Self.Clear; if not FileExists(APath) then raise EACBrSMSException.CreateFmt('Arquivo "%s" não encontrado.', [APath]); ListaSMS := TStringList.Create; ListaSMS.LoadFromFile(APath); if ListaSMS.Count = 0 then Exit; //(bla bla bla...) finally FreeAndNil(ListaSMS); end; Não é apropriado esse código. O correto é mover a criação do objeto para fora do try..finally. Pense bem, se o objeto não for construído, você não quer que ele seja destruído. A mensagem ajudou a perceber também que esse bloco poderia ser escrito de outra maneira. Aquele raise não precisava estar dentro do try..finally. Evitando problemas futuros Rodando no pacote ACBrOpenSSL tivemos a seguinte mensagem no componente ACBrEAD: [FixInsight Optimization] ACBrEAD.pas(268): O804 Method parameter 'AChavePublicaOpenSSL' is declared but never used Quer dizer, parâmetro ‘AchavePublicaOpenSSL’ declarado mas não utilizado. Veja abaixo a a parte importante da função: function TACBrEAD.ConverteChavePublicaParaOpenSSH( const AChavePublicaOpenSSL: String): String; Var Buffer, Modulo, Expoente: AnsiString; {...} begin // https://www.netmeister.org/blog/ssh2pkcs8.html CalcularModuloeExpoente(Modulo, Expoente); Buffer := EncodeBufferSSH('ssh-rsa') + EncodeHexaSSH(Expoente) + EncodeHexaSSH('00'+Modulo); Result := 'ssh-rsa '+ EncodeBase64(Buffer); end; É estranho esse método ConverteChavePublicaParaOpenSSH não utilizar o parâmetro da chavePública. Qualquer pessoa que visse o método e tentasse chamar passando a chave pública não teria o resultado desejado. Analisando o código melhor vemos que o componente lê a chave pública por meio do método “LerChavePublica”. Nesse caso o correto seria remover o parâmetro para que não haja nenhuma confusão. E essa mensagem no TACBrBALToledo2090: [FixInsight Warning] ACBrBALToledo2090.pas(107): W508 Variable is assigned twice successively if (Length(wStrListDados[1]) = 16) then wDecimais := 1000; {APENAS BLOCO PROCESSADO} wResposta := wStrListDados[1]; //<---- sobreposto pela linha seguinte wResposta := Copy(wStrListDados[1], 5, 7); if (Length(wResposta) <= 0) then Exit; Veja que os dados de uma linha é sobreposta pela outra. O compilador nunca daria um aviso sobre isso. Mais dois exemplos de mensagens e o código a seguir: [FixInsight Warning] ACBrEscEpsonP2.pas(97): W514 Loop iterator could be out of range (missing -1?) [FixInsight Warning] ACBrEscEpsonP2.pas(100): W514 Loop iterator could be out of range (missing -1?) For I := 0 to Length(cTAGS_BARRAS) do TagsNaoSuportadas.Add( cTAGS_BARRAS[I] ); For I := 0 to Length(cTAGS_ALINHAMENTO) do TagsNaoSuportadas.Add( cTAGS_ALINHAMENTO[I] ); Essa eu não sei como não foi detectada antes. Por algum motivo não está sendo emitida a mensagem estouro quando o valor de I chega a 16 no primeiro caso e 3 no segundo. Encontrando erros gerados por Ctrl+C..Ctrl+V No pacote ACBrPAF veja a mensagem gerada: [FixInsight Optimization] ACBrPAF_T_Class.pas(137): O804 Method parameter 'ACampo2' is declared but never used function OrdenarT2(const ACampo1, ACampo2: Pointer): Integer; var Campo1, Campo2: String; begin Campo1 := FormatDateTime('YYYYMMDD', TRegistroT2(ACampo1).DT_MOV) + TRegistroT2(ACampo1).TP_DOCTO + TRegistroT2(ACampo1).SERIE + TRegistroT2(ACampo1).NUM_ECF; Campo2 := FormatDateTime('YYYYMMDD', TRegistroT2(ACampo1).DT_MOV) + TRegistroT2(ACampo1).TP_DOCTO + TRegistroT2(ACampo1).SERIE + TRegistroT2(ACampo1).NUM_ECF; Result := AnsiCompareText(Campo1, Campo2); end; Essa função é utilizada para ordenar os registros T2 do PAF. Mas veja que ela compara o registro “ACampo1” com ele mesmo. Suspeita: Ctrl+C e Ctrl+V... Quem nunca??... Outra situação diferente, mas relacionada com ordenação apareceu no ACBrSintegra. Na verdade 4 situações no ACBrSintegra, semelhantes entre si. Vou mostrar apenas uma, mas dessa vez a mensagem do FixInsight fica pra depois. Vamos a um jogo dos sete erros entre os ifs e else no código abaixo: function Sort60A(Item1, Item2: Pointer): Integer; var witem1, witem2 : TRegistro60A; begin witem1 := TRegistro60A(Item1); witem2 := TRegistro60A(Item2); if witem1.Emissao>witem2.Emissao then begin if witem1.NumSerie>witem2.NumSerie then Result:=1 else if witem1.NumSerie=witem2.NumSerie then Result:=0 else Result:=-1; end else if witem1.Emissao = witem2.Emissao then begin if witem1.NumSerie>witem2.NumSerie then Result:=1 else if witem1.NumSerie=witem2.NumSerie then Result:=0 else Result:=-1; end else begin if witem1.NumSerie>witem2.NumSerie then Result:=1 else if witem1.NumSerie=witem2.NumSerie then Result:=0 else Result:=-1; end; end; Conseguiu encontrar os erros? Bem, se você procurou diferenças, não deve ter encontrado nada. E não existe mesmo. Veja a mensagem da ferramenta: [FixInsight Warning] ACBrSintegra.pas(3410): W507 THEN statement is equal to ELSE statement São dois if e um else pra fazer a mesma coisa... A correção foi remover o IFs e ELSE.  Agora vamos ao pacote ACBrSPED. Depois de remover muitos e muitos parâmetros desnecessários apontados pelo FixInsight, veja esse código: function CodAjToStr(const AValue: TACBrCodAj): string; begin if AValue = codAjAcaoJudicial then Result := '01' else if AValue = codAjAcaoJudicial then Result := '02' else if AValue = codAjLegTributaria then Result := '03' else if AValue = codAjEspRTI then Result := '04' else if AValue = codAjOutrasSituacaoes then Result := '05' else if AValue = codAjEstorno then Result := '06'; end; A mensagem é a seguinte: [FixInsight Warning] ACBrEPCBlocos.pas(2071): W512 Odd ELSE-IF condition (review lines 2071 and 2073) Viu lá? Os dois primeiros ifs estão comparando AValue com o mesmo valor, "codAjAcaoJudicial". O segundo deveria ser "codAjProAdministrativo". Provavelmente mais um Ctrl+C..Ctrl+V. Mensagens para otimização de código Nem todas as mensagens geradas são de erros. Algumas são mensagens de otimização. Muitos dos commits que temos feito estão relacionados a uma mensagem como estas abaixo: [FixInsight Optimization] ACBrSATClass.pas(776): O801 CONST missing for unmodified string parameter 'CNPJvalue' [FixInsight Optimization] ACBrSATClass.pas(776): O801 CONST missing for unmodified string parameter 'assinaturaCNPJs' Ela pode ser gerada numa função como essa: function TACBrSATClass.AssociarAssinatura( CNPJvalue, assinaturaCNPJs : AnsiString) : String ; begin ...// um código que não altera nenhum dos parâmetros citados end; Essas mensagens estão dizendo que os parâmetros 'CNPJvalue' e ‘assinaturaCNPJs’ do tipo string não estão sendo alterados dentro da função a que eles pertencem. Nesse caso é bem provável que os parâmetros devessem ter um prefixo CONST na sua declaração, como abaixo: function TACBrSATClass.AssociarAssinatura(const CNPJvalue, assinaturaCNPJs : AnsiString) : String ; begin ...// um código que não altera nenhum dos parâmetros citados end; Não vou entrar em muitos detalhes sobre isso, mas usar CONST tem alguns benefícios, principalmente em caso de strings: A execução é mais rápida, porque o compilador pode otimizar o código. No caso de strings, não tem contagem de referências; O compilador garante que você não vai alterar os parâmetros passados gerando um efeito colateral indesejado em quem chamou as funções; O código fica mais legível, porque você pode ler que a intenção é não alterar o parâmetro passado; Como os parâmetros são imutáveis, pode tornar o código mais ThreadSafe; Se quer saber um pouco mais sobre isso, recomendo os seguintes links: All hail the “const” parameters! Is the use of ‘const’ dogmatic or rational? Concluindo... Bom pessoal, ainda temos bastante pra fazer. Contudo, queremos dizer que o FixInsight tem nos ajudado melhorar nosso código. Ficamos tão satisfeitos que entramos em contato com a TMS e eles generosamente nos cederam uma licença da versão Pro pra continuar nosso trabalho. Muito obrigado TMS. Agora, se você quer nossa opinião, essa é uma ferramenta altamente recomendada e está disponível pra toda versão do Delphi a partir do Delphi 2006. Se você tem alguma dúvida, baixe a versão trial e comece agora mesmo a usar no seu código. A versão trial limita as mensagens a 5 por units e funciona por 30 dias. Mas é o suficiente pra se perceber como é muito útil, como aconteceu com a gente. Quer um passo a passo em como utilizá-la? Veja o próximo post logo abaixo.
    3 pontos
  4. Atualização da homologação - Rev. 1: O ACBr é um projeto vivo que recebe atualizações diárias. Essas atualizações, normalmente, envolvem correções e novas funcionalidades. Para acompanhar esta realidade, adição de novos testes e revisão dos existentes são frequentes em novas homologações. Fica evidente também, que homologações antigas necessitam de revisões. Por conta disso, adicionamos nesta postagem, informações adicionais e novos testes comumente encontrado em homologações recentes. Quando houver novas funcionalidades nos componentes ocasionando a necessidade de novos testes, serão feitas novas postagem, no mesmo tópico, informando novos testes realizados com o acréscimo da revisão. Ex.: Rev. 2, Rev. 3 … Rev X. Ambiente: Computador Desktop Sistema Operacional Windows 10 64Bit atualizado (31/01/2019) Processador Intel Core 2 Duo E5400 2.20GHz Memória 2 GB USB 2.0 Testes usando os componentes e Demos do ACBr Utilizamos a versão 3.1.2 do PosPrinterTeste.exe, demo do ACBrPosPrinter, parte do projeto ACBr, para efetuar testes na impressora. A ultima versão do PosPrinterTestes.exe está disponível neste link: Durante os testes deixamos as configurações desta forma: Modelo: ppEscPosEpson; Porta: RAW:ELGIN RM22(USB); Colunas: 32; Espaços: 10; Linhas Pular: 2; Pag. codigo: pc860; KC1: 1; KC2: 0; FatorX: 1; FatorY: 1; Demais configurações não alteramos; Resultados: Logotipo: *Nota: Oficialmente, essa impressora não suporta armazenamento e impressão de logotipos. Contudo, ela suportou, com algumas limitações, os comandos enviados pelo componente ACBrPosPrinter. As limitações que encontramos são: - FatorX não pode ter valor 2. A impressora consegue imprimir, mas a imagem fica cortada. - O logotipo não imprime centralizado ou alinhado à direita. Apenas alinhado à esquerda é suportado. Page Mode: Funcionou, com pequenas limitações, de forma satisfatória. Contudo foi preciso adaptá-la ao tamanho do papel usado: Observações importantes: 1- Onde está escrito 4 posições, demonstra os espaço que sobrou para adicionar algum texto; 2- A propriedade Condensada(<c>) não funcionou para PageModes orientados Topo/Baixo (<mp_direcao>1</mp_direcao>) e Direita/Esquerda (<mp_direcao>2</mp_direcao>); Suporte a impressão de imagens e gravação de logotipos: Realizamos os testes de impressão de imagens e gravação de logotipo na impressora, através de comandos Esc/Pos. Maiores detalhes destas funcionalidades podem ser conferidos neste tópico: ok Impressão de imagem; ok Gravar logotipo na memória da impressora; ok Apagar logotipo na memória da impressora; ok Imprimir logotipo gravado na memória da impressora; Teste de acentuação: Atualizamos o teste de acentuação para demonstrar o suporte da impressora com fontes do Tipo B. Esta funcionalidade está presente na ultima versão do PosPrinterTeste.exe: Resultados: pc473: Alguns acentos circunflexos, crases e todos os til foram ignorados; pc850: Todos os acentos foram impressos corretamente; pc852: Alguns acentos circunflexos, todas as crases e os til foram ignorados; pc860: Todos os acentos foram impressos corretamente; pc1252: - Tipo A: Todos os acentos foram impressos corretamente; - Tipo B: Os caracteres com acentuação não foram interpretados corretamente pela impressora; Impressão de extrato do SAT com QRCode e Logotipo lateral: A impressora suportou os comandos enviados. Contudo, não imprimiu corretamente o cupom. Acreditamos que, o problema esteja na relação entre o tamanho do QRCode e a largura do papel, utilizada pela impressora. Os testes foram realizados com o uso do SATTeste na versão 2.1. Ele é um demo do ACBrSAT, parte do projeto ACBr. Ele está disponível neste link: https://www.projetoacbr.com.br/forum/files/file/316-sattesteexe/ Impressão de um extrato do SAT, com logotipo, usando o SATTeste: Graças a nova funcionalidade, do ACBrPosPrinter, de gravar logotipos na memória da impressora, através de comandos Esc/POS, realizamos a impressão de um extrato de SAT com o tal logotipo:
    3 pontos
  5. Para o CTe-OS você deve usar ACBrCTe.WebServices.EnviaOS. Ou ACBrCTe.Enviar que já executa os métodos de assinatura, validação, envio de acordo com o modelo e impressão do DACTE.
    3 pontos
  6. Bom dia, Ao fazer a segunda carta de correção para a mesma nota, você esta atribuindo novamente o valor UM ao campo nSeqEvento? Provavelmente sim, se tratando de carta de correção como o nome do campo diz, devemos informar o numero sequencial do evento. Para a primeira carta de correção da nota 1500 (por exemplo) o campo nSeqEvento recebe o valor 1. Para a segunda carta de correção para a mesma nota, o campo nSeqEvento recebe o valor 2. E assim por diante. Para a primeira carta de correção da nota 1550 (por exemplo) o campo nSeqEvento recebe o valor 1. Espero ter ajudado.
    3 pontos
  7. Boa tarde Suas sugestões foram disponibilizadas nos fontes do Projeto ACBr. Obrigado pela contribuição!
    2 pontos
  8. Boa tarde Waldir, Ajustes disponíveis no SVN, juntamente com outras correções deste banco. Favor atualizar os fontes... Obrigado!
    2 pontos
  9. conf manual qVol Quantidade de volumes transportados tem ocorrência 0-1 e tamanho de 1-15. A regra terá que ser a mesma para homologação e produção. Lembrando que qVol é uma informação requerida pelas transportadoras para emissão de CT-e e MDF-e.
    2 pontos
  10. Obrigado por reportar. Fechando. Para novas dúvidas, criar um novo tópico.
    2 pontos
  11. @Italo Jurisato Junior Enviei um e-mail para a prefeitura para verificar as questões do campos faltantes, provisoriamente estou informando manualmente no componente antes da impressão. Agradeço.
    2 pontos
  12. Boa tarde Italo, Após atualização dos fontes as notas puderam ser canceladas com sucesso.
    2 pontos
  13. Obrigado Felipe, vou seguir este tópico.
    2 pontos
  14. Boa tarde Henrique, Favor atualizar os fontes e refaça os testes. Me parece que configurando com o libCapicom o cancelamento funciona, já com o libWinCrypt não. O motivo é que com o libWinCrypt a assinatura e inserida no lugar errado.
    2 pontos
  15. Boa tarde, Conforme manual este campo é do tipo AlfaNumerico, por isso começa a contar posições a partir da esquerda: copy(Linha, 38, 11) Como está vindo sendo o arquivo de retorno? Se possível anexe aqui.
    2 pontos
  16. 2 pontos
  17. Ainda não tenho esse equipamento... nosso desenvolvimento se baseou no emulador A Gertec se prontificou de me enviar um...
    2 pontos
  18. O ACBr é Open Source... Já tentou debugar essa rotina ?
    2 pontos
  19. Boa noite, problemas resolvidos, obrigado.
    2 pontos
  20. Rejeição 222: Protocolo de Autorização de Uso difere do cadastrado - Como resolver? Rejeição 222 - Protocolo de Autorização de Uso difere do cadastrado Causa Quando for emitido um Evento de Cancelamento para um NF-e autorizada e o Número do Protocolo (Campo: detEvento / nProt - ID: HP20) de autorização da NF-e for diferente do informado no Evento de Cancelamento, será retornado a rejeição "222 - Protocolo de Autorização de Uso difere do cadastrado". Exemplo: Foi emitido um Evento de Cancelamento, para uma NF-e de Número do Protocolo "143150004507669", mas foi informado no evento o Número do Protocolo igual à "143130006510696". Nessa situação, a NF-e será rejeitada pelo motivo 222. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <evento versao="1.00"> <infEvento Id="ID1101114315109999999999999955110000000928166842136901"> <cOrgao>43</cOrgao> <tpAmb>2</tpAmb> <CNPJ>99999999999999</CNPJ> <chNFe>43151099999999999999551100000009281668421369</chNFe> <dhEvento>2015-10-29T10:22:24-02:00</dhEvento> <tpEvento>110111</tpEvento> <nSeqEvento>1</nSeqEvento> <verEvento>1.00</verEvento> <detEvento versao="1.00"> <descEvento>Cancelamento</descEvento> <nProt>143130006510696</nProt> <xJust>Teste para Evento de Cancelamento</xJust> </detEvento> </infEvento> </evento> Veja regra de validação da Sefaz: anexe o xml da NFC-e que está sendo cancelada e do evento
    1 ponto
  21. Boa tarde, jjw.roberto. A melhor maneira de você descobrir, é entrando em contato com a homologadora que você faz... Digo isso, porque já participei de várias homologações que cada certificadora solicitava uma coisa diferente. Mas na legislação informa que não pode ficar no mesmo lugar que possui ECF instalado.
    1 ponto
  22. Pode por favor, postar um Print da Tela do Demo ? Vou tentar reproduzir na minha L42
    1 ponto
  23. Suas sugestões foram disponibilizadas nos fontes do Projeto ACBr. Obrigado pela contribuição!
    1 ponto
  24. Boa tarde Suas sugestões foram disponibilizadas nos fontes do Projeto ACBr. Obrigado pela contribuição!
    1 ponto
  25. Boa tarde Suas sugestões foram disponibilizadas nos fontes do Projeto ACBr, juntamente com outras correções. Obrigado pela contribuição!
    1 ponto
  26. Boa tarde. Após realizar diversos testes, notamos que a única diferença entre o tipo EAN128C e Code128C é a inclusão do digito verificador...infelizmente a alteração proposta não poderá ser aplicada pois poderia causar a quebra as aplicações que utilizam a implementação atual. Tente verificar se não trata-se de algum problema relacionado a drivers. Att.
    1 ponto
  27. Deu certo. O meu problema era o cNf que estava sendo passado igual ao nNf. Obrigado. É uma pre-venda mesmo, mas já contém a chave da nota que será gerada (Tentando agilizar o processo). Isso também será utilizado no caso de uma contingência. Obrigado
    1 ponto
  28. Boa tarde Pessoal, creio que já existem 2 tópicos sobre este assunto, são eles: Creio que o pessoal está analisando a correção para ser submetida ao repositório de fontes do SVN
    1 ponto
  29. Obrigado Daniel, agora funcionou, eles só tinham copiado o dllsat.dll e não as outras dll´s.
    1 ponto
  30. Boa tarde Igor, Você tem que fazer esse tratamento na sua aplicação.
    1 ponto
  31. Boa tarde, Rafael Machado. Está faltando você informar o elemento 'pag', pois o mesmo está vazio
    1 ponto
  32. Este problema aparentemente tem relação com a versão do OpenSSL (estou usando OpenSSL 1.1.0i-fips 14 Aug 2018), acredito que o método da lib openssl que retorna a data de validade do certificado foi modificado e esta retornando nil, uma solução temporária que encontrei para bypass o problema foi o seguinte: Alterar o método ./Fontes/ACBrDFe/ACBrDFeOpenSSL.pas linha 136 function GetNotAfter( cert: pX509 ): TDateTime; var Validade: String; notAfter: PASN1_TIME; begin // *** remover as linhas comentadas abaixo: *** // notAfter := cert^.cert_info^.validity^.notAfter; // Validade := {$IFDEF DELPHIXE4_UP}AnsiStrings.{$ENDIF}StrPas( PAnsiChar(notAfter^.data) ); // SetLength(Validade, notAfter^.length); // Validade := OnlyNumber(Validade); // if notAfter^.asn1_type = V_ASN1_UTCTIME then // anos com 2 dígitos // Validade := LeftStr(IntToStrZero(YearOf(Now),4),2) + Validade; // Result := StoD(Validade);} // *** adicionar apenas o Result abaixo que equivale retornar como data de validade a data 22/02/2022 *** Result := StoD('20220222000000'); end; Após a alteração abrir ./Pacotes/Lazarus/ACBrDFe/ACBrDFeComum.lpk e compilar novamente
    1 ponto
  33. Faça novos testes com o demo. Escreva manualmente o texto ( não faça copiar e colar ).
    1 ponto
  34. Prazo para implementação das alterações para CTe/CTe-OS trazidas pela NT 2018.002 v1.01, conforme resumo a seguir: Permitir relacionar NF-e emitida por emitente pessoa física com inscrição na relação de documentos transportados; Inclusão do grupo de informações do responsável técnico pelo desenvolvimento do sistema de emissão do DF-e; Inclusão da data/hora da viagem e tipo de fretamento no CT-e OS de transporte de pessoas; Inclusão de validações para o tipo de Serviço e para preenchimento do TAF ou Registro Estadual no CT-e OS. Fonte: http://www.cte.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=6NPZPVLwFnw=
    1 ponto
  35. É um desconto um tanto agressivo... mas realmente parece ser um problema na regra de rateio... Vou solicitar apoio do Fabricante
    1 ponto
  36. Removi uma linha do código referente a logo que estava dando erro ao compilar ./Fontes/ACBrDFe/ACBrNFe/DANFE/NFe/Fortes ACBrNFeDANFeRLRetrato.dfm ACBrNFeDANFeRLRetrato.lfm ACBrNFeDANFeRLRetrato.pas
    1 ponto
  37. Bom dia Milton, Colocou nesse cliente que esta ocorrendo o problema os mesmos schemas de um cliente que não ocorre o problema? Esse cliente é da mesma UF dos demais? O tipo de certificado é o mesmo dos demais? As configurações do componente é a mesma dos demais?
    1 ponto
  38. 1 ponto
  39. Obrigado por reportar. Fechando. Para novas dúvidas, criar um novo tópico.
    1 ponto
  40. Bom dia Duarte, Muito obrigado pela colaboração, ainda hoje estarei enviando para o repositório.
    1 ponto
  41. Obrigado por reportar. Fechando. Para novas dúvidas, criar um novo tópico.
    1 ponto
  42. Também tive problemas no ambiente de homologação, conversei com o cliente e optei por emitir em produção algumas notas e cancelar. Funciona normalmente.
    1 ponto
  43. Essa foi uma sugestao que o pessoal da Linx me passou, mas creio que deva haver outras formas sim. Vou simular aqui. e pegar mais informacoes com eles.
    1 ponto
  44. - Atualize os fontes. - Use o componente ACBrNFeDANFCEFR.
    1 ponto
  45. Boa tarde. Recomendo que faça o processo em duas operações distintas, numa você realiza a geração dos PDFs e na segunda gera a remessa com todos os titulos. Att.
    1 ponto
  46. @Antonio Rufino , o problema está na versão 2.1.5 do firmware, o seja, o mais recente que se encontra no site da Control-iD. A Print-iD que temos estava na versão 1.2.5. Ela imprimiu os acentos corretamente. Foi fazer a atualização e o problema que você descreveu aconteceu exatamente comigo. Aos que não realizaram a atualização, recomendo não fazê-la se o firmware que se encontra no site for o 2.1.5. Aos que desejam saber qual a versão do firmware na impressora, basta imprimir um autoteste. No tópico citado pelo @Daniel Simoes (acima), ilustra como realizá-lo. Fiz um comparativo do antes(esquerda) e depois da atualização:
    1 ponto
  47. Sim... é um exception... Use o evento OnTransmitError
    1 ponto
  48. Exato... afinal não houve retorno algum do WebService ( houve erro entre o envio e a recepção da resposta) Você pegaria com um Try / Except.. Assim como todos os Exceptions... Mas também há o evento OnTransmiteError, apenas para esse caso
    1 ponto
  49. Quando estou de saco cheio, nada melhor do que o FreeCell e uma loira gelada.
    1 ponto
  50. Boa tarde dataol Segue a minha função para tratar as mensagens que correspondem ao cStart....claro que deve estar faltando alguns códigos rescentes, mas já te ajuda FuncaoMotivoNfe.txt
    1 ponto
×
×
  • 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.