Ir para conteúdo
  • Cadastre-se

dev botao

Gerar arquivo com ACBrSpedFiscal para o PAF-ECF


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

Recommended Posts

Boa tarde!

Estou com uma rotina de teste para gerar o arquivo SPED para o item "Vendas do Período", do PAF-ECF. Mas a estrutura deste sequer passa pelo validador. O validador emite a seguinte mensagem:

Mensagem: Registro encontrado é diferente do registro esperado.

Campo: 1 - REG

Valor Calculado: G001

Conteúdo do Campo: H001

Registro: H001

e pelo exemplo do ACBr eu consigo ter a estrutura do arquivo validada, no entanto, tenho problemas com a UNIDADE. A minha rotina é essa:

procedure TfrmMenuFiscal.GerarDadosBloco(pBloco: String);

var Int1, Int2, Notas : Integer;

    aTotalICMS : Double;

begin

  aTotalICMS := 0;

  if pBloco = '0' then

  begin

    with ACBrSpedFiscal.Bloco_0 do

    begin

      // informações da Empresa

      with Registro0000New do

      begin

        DT_INI:= edtDe.Date;

        DT_FIN:= edtAte.Date;


         COD_VER    := vlVersao103;

         COD_FIN    := raOriginal;

         NOME       := 'RAZAO SOCIAL DO INFORMANTE';

         CNPJ       := '';

         CPF        := '12345678901'; // Deve ser uma informação valida

         UF         := 'RJ';

         IE         := '0000000000';

         COD_MUN    := 12345678;

         IM         := '';

         SUFRAMA    := '';

         IND_PERFIL := pfPerfilA;

         IND_ATIV   := atOutros;


         ACBrSpedFiscal.IniciaGeracao;


      end;

      with Registro0001New do

      begin

         IND_MOV := imComDados;

         // informações complementares da Empresa

         with Registro0005New do

         begin

            FANTASIA   := 'NOME FANTASSIA DA EMPRESA';

            CEP        := '21000000';

            ENDERECO   := 'RUA PRINCIPAL';

            NUM        := 'S/N';

            COMPL      := '';

            BAIRRO     := 'CENTRO';

            FONE       := '';

            FAX        := '';

            EMAIL      := '[email protected]';

         end;

         // informações da contabilidade.

         with Registro0100New do

         begin

            NOME       := 'NOME DO CONTADOR';

            CPF        := '12345678900'; // Deve ser uma informação valida

            CRC        := '123456';

            CNPJ       := '';

            CEP        := '';

            ENDERECO   := '';

            NUM        := '';

            COMPL      := '';

            BAIRRO     := '';

            FONE       := '';

            FAX        := '';

            EMAIL      := '';

            COD_MUN    := 3200607;

         end;

         // Clientes

         with Registro0150New do

         begin

           COD_PART := '000001';

           NOME     := 'RAZAO SOCIAL DO CLIENTE';

           COD_PAIS := '001';

           CNPJ     := '12345678000123';

           CPF      := '';

           IE       := '';

           COD_MUN  := 1;

           SUFRAMA  := '';

           ENDERECO := 'ENDERECO';

           NUM      := '';

           COMPL    := 'COMPL';

           BAIRRO   := 'BAIRRO';

         end;

         with Registro0190New do

         begin

           UNID  := 'UN';

           DESCR := 'Descricao unidade';

         end;


         for Int1 := 1 to 6 do

         begin

            if not Registro0200.LocalizaRegistro(IntToStrZero(Int1,6)) then

            begin

              with Registro0200New do

              begin

                 COD_ITEM     := IntToStrZero(Int1,6);

                 DESCR_ITEM   := 'DESCRIÇÃO DO ITEM '+IntToStrZero(Int1,6);

                 COD_BARRA    := IntToStrZero(Int1,13);

                 COD_ANT_ITEM := '';

                 UNID_INV     := 'UN';

                 TIPO_ITEM    := tiMercadoriaRevenda;

                 COD_NCM      := '';

                 EX_IPI       := '';

                 COD_GEN      := '';

                 COD_LST      := '';

                 ALIQ_ICMS    := 18;

              end;

            end;

         end;

      end;

    end;

  end

  else if pBloco = 'C' then

  begin

    Notas := StrToInt64Def('123',1);

    with ACBrSpedFiscal.Bloco_C do

    begin

      with RegistroC001New do

      begin

         IND_MOV := imComDados;

         //

         for Int1 := 1 to Notas do

         begin

           with RegistroC100New do

           begin

             COD_PART      := '000001';

             IND_EMIT      := edEmissaoPropria;

             IND_OPER      := tpEntradaAquisicao;

             COD_MOD       := '01';

             COD_SIT       := sdRegular;

             SER           := '';

             NUM_DOC       := IntToStrZero(Int1,6);

             CHV_NFE       := '';

             DT_DOC        := Date();

             DT_E_S        := Date();

             VL_DOC        := 0;

             IND_PGTO      := tpSemPagamento;

             VL_DESC       := 0;

             VL_ABAT_NT    := 0;

             VL_MERC       := 0;

             IND_FRT       := tfSemCobrancaFrete;

             VL_SEG        := 0;

             VL_OUT_DA     := 0;

             VL_BC_ICMS    := 0;

             VL_ICMS       := 0;

             VL_BC_ICMS_ST := 0;

             VL_ICMS_ST    := 0;

             VL_IPI        := 0;

             VL_PIS        := 0;

             VL_COFINS     := 0;

             VL_PIS_ST     := 0;

             VL_COFINS_ST  := 0;

             //c170

             for Int2 := 1 to 6 do

             begin

               with RegistroC170New do   //Inicio Adicionar os Itens:

               begin

                  NUM_ITEM    := IntToStrZero(Int2,3);

                  COD_ITEM    := IntToStrZero(Int2,6);

                  DESCR_COMPL := 'Descricao do item '+IntToStrZero(Int2,6);

                  QTD         := 1;

                  UNID        := 'UN';

                  VL_ITEM     := 10;

                  VL_DESC     := 0;

                  IND_MOV     := mfNao;

                  CST_ICMS    := '000';

                  CFOP        := '5102';

                  COD_NAT     := '';

                  VL_BC_ICMS  := 10;

                  ALIQ_ICMS   := 18;

                  VL_ICMS     := 1.8;

                  VL_BC_ICMS_ST := 0;

                  ALIQ_ST       := 0;

                  VL_ICMS_ST    := 0;

                  IND_APUR      := iaMensal;

                  CST_IPI       := ipiEntradaIsenta;

                  COD_ENQ       := '';

                  VL_BC_IPI     := 0;

                  ALIQ_IPI      := 0;

                  VL_IPI        := 0;

                  CST_PIS       := pisOutrasOperacoes;

                  VL_BC_PIS     := 0;

                  ALIQ_PIS_PERC := 0;

                  QUANT_BC_PIS  := 0;

                  ALIQ_PIS_R    := 0;

                  VL_PIS        := 0;

                  CST_COFINS    := cofinsOutrasOperacoes;

                  VL_BC_COFINS  := 0;

                  ALIQ_COFINS_PERC := 0;

                  QUANT_BC_COFINS  := 0;

                  ALIQ_COFINS_R    := 0;

                  VL_COFINS        := 0;

                  COD_CTA          := '000';

                end;

             end;

             //c190

             with RegistroC190New do

             begin

                CST_ICMS    := '000';

                CFOP        := '5102';

                ALIQ_ICMS   := 18;

                VL_OPR      := 60;

                VL_BC_ICMS  := 60;

                VL_ICMS     := 10.8;

                VL_BC_ICMS_ST := 0;

                VL_ICMS_ST    := 0;

                VL_RED_BC     := 0;

                VL_IPI        := 0;

                COD_OBS       := '';

             end;

             aTotalICMS := aTotalICMS + 10.8;

           end;

         end;

      end;

    end;

  end

  else if pBloco = 'D' then

  begin

    with ACBrSpedFiscal.Bloco_D do

    begin

       with RegistroD001New do

       begin

         IND_MOV := imSemDados;

       end;

    end;

  end

  else if pBloco = 'E' then

  begin

    with ACBrSpedFiscal.Bloco_E do

    begin

      with RegistroE001New do

      begin

         IND_MOV := imComDados;

         with RegistroE100New do

         begin

           DT_INI := edtDe.Date;

           DT_FIN := edtAte.Date;

           AcbrSpedFiscal.IniciaGeracao;

         end;


         with RegistroE110New do

         begin

            VL_TOT_DEBITOS := aTotalICMS;

            VL_AJ_DEBITOS := 0;

            VL_TOT_AJ_DEBITOS := 0;

            VL_ESTORNOS_CRED := 0;

            VL_TOT_CREDITOS := 0;

            VL_AJ_CREDITOS := 0;

            VL_TOT_AJ_CREDITOS := 0;

            VL_ESTORNOS_DEB := 0;

            VL_SLD_CREDOR_ANT := 0;

            VL_SLD_APURADO := aTotalICMS;

            VL_TOT_DED := 0;

            VL_ICMS_RECOLHER := aTotalICMS;

            VL_SLD_CREDOR_TRANSPORTAR := 0;

            DEB_ESP := 0;

         end;

      end;

    end;

  end

  else if pBloco = 'H' then

  begin

    with ACBrSpedFiscal.Bloco_H do

    begin

      with RegistroH001New do

      begin

         IND_MOV := imComDados;

         //

         with RegistroH005New do

         begin

            DT_INV := Date;

            VL_INV := 1000;

            // FILHO

            for Int1 := 1 to 6 do

            begin

               with RegistroH010New do

               begin

                  COD_ITEM := IntToStrZero(Int1,6);

                  UNID := 'UN';

                  QTD  := 1;

                  VL_UNIT := 100;

                  VL_ITEM := 100;

                  IND_PROP := piInformante;

                  COD_PART := '';

                  TXT_COMPL := '';

                  COD_CTA := '123';

               end;

            end;

         end;

      end;

    end;

  end

  else if pBloco = '1' then

  begin

    with ACBrSpedFiscal.Bloco_1 do

    begin

      with Registro1001New do

      begin

        IND_MOV := imSemDados;

      end;

    end;

  end

  else if pBloco = '9' then

  begin

    ACBrSPEDFiscal.WriteBloco_9;

  end

end;

Alguém, por favor, poderia me ajudar a concluir esse requisito?

Obrigado,

André Rosa.

[]'s

Link para o comentário
Compartilhar em outros sites

  • Consultores

Parece que ele está esperando os registros do bloco G. Não é isso?

Acho que mesmo que não tenha nenhum dado você precisa gerar o G001 e o G990.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

Parece que ele está esperando os registros do bloco G. Não é isso?

Acho que mesmo que não tenha nenhum dado você precisa gerar o G001 e o G990.

Elton,

Adicionei o registro G na rotina:

  else if pBloco = 'G' then

  begin

    with ACBrSpedFiscal.Bloco_G do

    begin

      with RegistroG001New do

      begin

        IND_MOV:= imSemDados;

      end;


      with RegistroG990 do

        QTD_LIN_G:= 0;


      AcbrSpedFiscal.WriteBloco_G;


    end;

  end

E o chamei na hora de gerar, conforme estou fazendo com os outros blocos, no entanto, exatamente

o mesmo erro persiste.

Obrigado.

Link para o comentário
Compartilhar em outros sites

  • Consultores

Favor postar o código que chama a geração do arquivo.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

Seu código está assim

begin

with ACBrSpedFiscal.Bloco_0 do

begin

// informações da Empresa

with Registro0000New do

begin

DT_INI:= edtDe.Date;

DT_FIN:= edtAte.Date;

COD_VER := vlVersao103;

COD_FIN := raOriginal;

NOME := 'RAZAO SOCIAL DO INFORMANTE';

CNPJ := '';

CPF := '12345678901'; // Deve ser uma informação valida

UF := 'RJ';

IE := '0000000000';

COD_MUN := 12345678;

IM := '';

SUFRAMA := '';

IND_PERFIL := pfPerfilA;

IND_ATIV := atOutros;

ACBrSpedFiscal.IniciaGeracao;

end;

Faça isso:

begin

with ACBrSpedFiscal.Bloco_0 do begin

AcbrSpedFiscal.DT_INI:= edtDe.Date;

AcbrSpedFiscal.DT_FIN:= edtAte.Date;

// informações da Empresa

with Registro0000New do

begin

DT_INI:= edtDe.Date;

DT_FIN:= edtAte.Date;

COD_VER := vlVersao103;

COD_FIN := raOriginal;

NOME := 'RAZAO SOCIAL DO INFORMANTE';

CNPJ := '';

CPF := '12345678901'; // Deve ser uma informação valida

UF := 'RJ';

IE := '0000000000';

COD_MUN := 12345678;

IM := '';

SUFRAMA := '';

IND_PERFIL := pfPerfilA;

IND_ATIV := atOutros;

ACBrSpedFiscal.IniciaGeracao;

end;

Sem esse trecho que coloquei, o Acbr não gera o Bloco G, você chamando ele ou não.

Ass. Vially Israel

Link para o comentário
Compartilhar em outros sites

Seu código está assim

Sem esse trecho que coloquei, o Acbr não gera o Bloco G, você chamando ele ou não.

Basta

AcbrSpedFiscal.DT_INI:= edtDe.Date;

AcbrSpedFiscal.DT_FIN:= edtAte.Date;

internamente o componente atribui o valor a todos os blocos



FDT_INI := Value;

FBloco_0.DT_INI := Value;
FBloco_1.DT_INI := Value;
FBloco_9.DT_INI := Value;
FBloco_C.DT_INI := Value;
FBloco_D.DT_INI := Value;
FBloco_E.DT_INI := Value;
FBloco_G.DT_INI := Value;
FBloco_H.DT_INI := Value;

if Assigned(FBloco_0) then
begin
FBloco_0.Registro0000.DT_INI := Value;
end;
[/code]

--
Isaque Pinheiro
Aracruz/ES - Brasil
___________________________________________________________________________
Site Oficial: www.isaquepinheiro.com.br 
Youtube: youtube.com/isaquepinheirooficialbr
Facebook: facebook.com.br/isaquepinheirooficialbr
Instagram: instagram.com/isaquepinheirooficialbr
Linkdin: https://www.linkedin.com/in/isaquepinheirooficialbr

Conheça o Projeto ORMBr Framework for Delphi - https://www.ormbr.com.br

 

Link para o comentário
Compartilhar em outros sites

Seu código está assim

Sem esse trecho que coloquei, o Acbr não gera o Bloco G, você chamando ele ou não.

Bastava:

AcbrSpedFiscal.DT_INI:= edtDe.Date;

AcbrSpedFiscal.DT_FIN:= edtAte.Date;

internamente o componente atribui o valor a todos os blocos, inclusive ao Registro0000.


procedure TACBrSPEDFiscal.SetDT_INI(const Value: TDateTime);
begin
FDT_INI := Value;

FBloco_0.DT_INI := Value;
FBloco_1.DT_INI := Value;
FBloco_9.DT_INI := Value;
FBloco_C.DT_INI := Value;
FBloco_D.DT_INI := Value;
FBloco_E.DT_INI := Value;
FBloco_G.DT_INI := Value;
FBloco_H.DT_INI := Value;

if Assigned(FBloco_0) then
begin
FBloco_0.Registro0000.DT_INI := Value;
end;
end;
[/code]

--
Isaque Pinheiro
Aracruz/ES - Brasil
___________________________________________________________________________
Site Oficial: www.isaquepinheiro.com.br 
Youtube: youtube.com/isaquepinheirooficialbr
Facebook: facebook.com.br/isaquepinheirooficialbr
Instagram: instagram.com/isaquepinheirooficialbr
Linkdin: https://www.linkedin.com/in/isaquepinheirooficialbr

Conheça o Projeto ORMBr Framework for Delphi - https://www.ormbr.com.br

 

Link para o comentário
Compartilhar em outros sites

Isaque explicou melhor.

Uma pergunta, o bloco G é pra depender realmente dessa data?

Digo isso por que assim se eu não colocar essa data e colocar

AcbrSpedFiscal.WriteBloco_9,

Ele vai gerar todos os blocos anteriores (0 e 1) até o bloco 9.

Se eu colocar

AcbrSpedFiscal.WriteBloco_D,

ele vai gerar todos os blocos (0, 1, 9, C) até o D.

Mas, se eu colocar AcbrSpedFiscal.WriteBloco_G,

ele gera até o Bloco E e não gera o bloco G.

Aí, se eu colocar o AcbrSpedFiscal.DT_INI e DT_FIN ele vai gerar

Ass. Vially Israel

Link para o comentário
Compartilhar em outros sites

Isaque explicou melhor.

Uma pergunta, o bloco G é pra depender realmente dessa data?

Digo isso por que assim se eu não colocar essa data e colocar

AcbrSpedFiscal.WriteBloco_9,

Ele vai gerar todos os blocos anteriores (0 e 1) até o bloco 9.

Se eu colocar

AcbrSpedFiscal.WriteBloco_D,

ele vai gerar todos os blocos (0, 1, 9, C) até o D.

Mas, se eu colocar AcbrSpedFiscal.WriteBloco_G,

ele gera até o Bloco E e não gera o bloco G.

Aí, se eu colocar o AcbrSpedFiscal.DT_INI e DT_FIN ele vai gerar

Vc não precisa sair chamando método a método "WriteBloco_?", bas ta chamar o método "SaveFileTXT", ele internamente chama todos os métodos de escrita de todos os blocos.

Bom o Bloco G realmente tem um data limite para sua geração segundo o manual, que é a partir de 01/01/2011, então o que deve ser feito é parecido com isso:


with ACBrSPED do
begin
OnError := ShowErrosSPED;

// Data Inicial e Final
DT_INI := edtDateI.Date;
DT_FIN := edtDateF.Date;

**** Aqui chama a rotina para alimentar todos [b]blocos necessários[/b], com suas informações ****

// Gera o arquivo.
Arquivo := 'Arquivo.txt';
Path := 'C:\';

// Salva os registros em TXT.
SaveFileTXT;
end;
[/code]

--
Isaque Pinheiro
Aracruz/ES - Brasil
___________________________________________________________________________
Site Oficial: www.isaquepinheiro.com.br 
Youtube: youtube.com/isaquepinheirooficialbr
Facebook: facebook.com.br/isaquepinheirooficialbr
Instagram: instagram.com/isaquepinheirooficialbr
Linkdin: https://www.linkedin.com/in/isaquepinheirooficialbr

Conheça o Projeto ORMBr Framework for Delphi - https://www.ormbr.com.br

 

Link para o comentário
Compartilhar em outros sites

Isaque explicou melhor.

Uma pergunta, o bloco G é pra depender realmente dessa data?

Digo isso por que assim se eu não colocar essa data e colocar

AcbrSpedFiscal.WriteBloco_9,

Ele vai gerar todos os blocos anteriores (0 e 1) até o bloco 9.

Se eu colocar

AcbrSpedFiscal.WriteBloco_D,

ele vai gerar todos os blocos (0, 1, 9, C) até o D.

Mas, se eu colocar AcbrSpedFiscal.WriteBloco_G,

ele gera até o Bloco E e não gera o bloco G.

Aí, se eu colocar o AcbrSpedFiscal.DT_INI e DT_FIN ele vai gerar

Vc não precisa sair chamando método a método "WriteBloco_?", bas ta chamar o método "SaveFileTXT", ele internamente chama todos os métodos de escrita de todos os blocos.

Bom o Bloco G realmente tem um data limite para sua geração segundo o manual, que é a partir de 01/01/2011, então o que deve ser feito é parecido com isso:


with ACBrSPED do
begin
OnError := ShowErrosSPED;

// Data Inicial e Final
DT_INI := edtDateI.Date;
DT_FIN := edtDateF.Date;

**** Aqui chama a rotina para alimentar todos [b]blocos necessários[/b], com suas informações ****

// Gera o arquivo.
Arquivo := 'Arquivo.txt';
Path := 'C:\';

// Salva os registros em TXT.
SaveFileTXT;
end;
[/code]

Esses componentes tb usam DLLs, "libeay32.dll" e "libseppemv.dll", nas pastas do projeto tem um demo de como gerar sua chave e usar a assinatura pelo ACBrEAD, de uma estudada no demo.

--
Isaque Pinheiro
Aracruz/ES - Brasil
___________________________________________________________________________
Site Oficial: www.isaquepinheiro.com.br 
Youtube: youtube.com/isaquepinheirooficialbr
Facebook: facebook.com.br/isaquepinheirooficialbr
Instagram: instagram.com/isaquepinheirooficialbr
Linkdin: https://www.linkedin.com/in/isaquepinheirooficialbr

Conheça o Projeto ORMBr Framework for Delphi - https://www.ormbr.com.br

 

Link para o comentário
Compartilhar em outros sites

Vou dar uma olhada sim. Eu estava assinando perfeitamente com a DLL da Bematech (sign_bema.dll), e, inclusive, passava no validador da própria DLL. Ontem, realizando os testes, não consegui validar através do eECFc. Segui todos os procedimentos documentados neste, mas mesmo assim nada. Tentei também pelo ACBr, no entanto, também não valida. Será que o problema é com minhas chaves privada e publica?

Obg.

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 4591 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.