Ir para conteúdo
  • Cadastre-se

Rodrigo - Digibyte

Membros Pro
  • Total de ítens

    354
  • Registro em

  • Última visita

  • Days Won

    1

Posts postados por Rodrigo - Digibyte

  1. Seguem units alteradas:

    Está gerando o bloco 0, já testei importação pelo ecf e deu tudo certo

    Alterei alguns parâmetros de inteiro para string, seguindo o padrão do sped contribuições (cep por exemplo)

    Implementei várias partes de código faltando ou incorretas

     

    O que vi que está faltando: limpar memória após gerar o arquivo (TStringList's)

     

    Acho que agora está mais fácil para todos que puderem contribuir pois temos um início.

    ACBrECFBloco_0_Class.pas

    ACBrECFBloco_0.pas

    ACBrSpedEcf.pas

    Vou anexar a unit do delphi que tenho e que gerou e validou o arquivo. Quem quiser usar como referência é só baixar e pegar a parte do código que gera o sped, é bem simples, tem alguns lugares que pego informações do banco de dados mas é só tirar e inserir os dados diretamente para testar.

    UFrmSpedEcf.pas

    • Curtir 1
  2. Boa tarde, a procedure como está gera um erro AV, para corrigir voltei ao que era anteriormente, seguem os dois blocos para análise:

    Com erro:

       Bloco.NomeArquivo  := FACBrTXT.NomeArquivo;
       Bloco.LinhasBuffer := FACBrTXT.LinhasBuffer;
       Bloco.Gravado      := False ;
       Bloco.Conteudo.Clear;  <<---- erro AV

    Sem erro:

       Bloco.NomeArquivo  := FACBrTXT.NomeArquivo;
       Bloco.LinhasBuffer := FACBrTXT.LinhasBuffer;
       Bloco.Gravado      := False ;
       if not Assigned(Bloco.Conteudo) then
         Bloco.Conteudo := TStringList.Create;
       Bloco.Conteudo.Clear;

    Obs: repositório trunk

  3. Os mantenedores do acbr poderiam dar uma força e incluir o ecf na instalação do acbr? Assim ficaria mais fácil para usarmos e principalmente implementarmos as correções, que estariam disponíveis no svn para todos.

    Se não for possível posso tentar por aqui mas tenho medo de estar fazendo em desacordo com o padrão que utilizam ou outro usuários estar fazendo a mesma coisa/correçoes em paralelo.

  4. Os totalizadores desses registros estavam sendo gerados de forma incorreta, o do I155 estava fora de ordem (mas validava no pva), o do I310 não totalizava e acusava erro. Constatei s seguinte trecho de código, mesma coisa ocorria no WriteRegistroI150:

     

    procedure TACBrSPEDContabil.WriteRegistroI300;
    begin
       if Bloco_I.RegistroI300.Count > 0 then
       begin
          with Bloco_9.Registro9900.New do
          begin
             REG_BLC := 'I300';
             QTD_REG_BLC := Bloco_I.RegistroI300.Count;
          end;
       end;
       if Bloco_I.RegistroI310Count > 0 then
       begin
          with Bloco_9.Registro9900.New do
          begin
             REG_BLC := 'I310';
             QTD_REG_BLC := Bloco_I.RegistroI310Count;
          end;
       end;

       Bloco_I.WriteRegistroI300;
    end;

     

    Correção:

     

    procedure TACBrSPEDContabil.WriteRegistroI300;
    begin

       Bloco_I.WriteRegistroI300;

       if Bloco_I.RegistroI300.Count > 0 then
       begin
          with Bloco_9.Registro9900.New do
          begin
             REG_BLC := 'I300';
             QTD_REG_BLC := Bloco_I.RegistroI300.Count;
          end;
       end;
       if Bloco_I.RegistroI310Count > 0 then
       begin
          with Bloco_9.Registro9900.New do
          begin
             REG_BLC := 'I310';
             QTD_REG_BLC := Bloco_I.RegistroI310Count;
          end;
       end;

    end;

     

    Outro erro que acabava gerando os totais mas fora de ordem e do padrão:

     

    procedure TACBrSPEDContabil.WriteRegistroI990;
    begin
       with Bloco_9.Registro9900.New do
       begin
          REG_BLC := 'I990';
          QTD_REG_BLC := 1;
       end;
       Bloco_I.WriteRegistroI990;

        with Bloco_9.Registro9900 do
        begin
           if Bloco_I.RegistroI155Count > 0 then
           begin
             with New do
             begin
               REG_BLC := 'I155';
               QTD_REG_BLC := Bloco_I.RegistroI155Count;
             end;
           end;

           if Bloco_I.RegistroI250Count > 0 then
           begin
             with New do
             begin
               REG_BLC := 'I250';
               QTD_REG_BLC := Bloco_I.RegistroI250Count;
             end;
           end;
        end;

    end;

     

     

    O trecho em vermelho foi retirado pois agora os totais estão sendo gerados no local correto.

     

    Validei aqui e funcionou tudo certo mas é sempre bom alguém com mais experiência no ACBR dar uma olhada se as alterações estão corretas.

     

     

     

    ACBrSpedContabil.pas

    • Curtir 1
  5. Existiam duas mensagens de erro/aviso que estavam sendo tratadas incorretamente, segue correção em anexo

     

     

    1) (0-0000) O indicador "%s" de situação especial, deve ser informado o número 1 ou 2 ou 3 ou 4 ou 5!

     

    Estava duplicado no código

    Não respeitava os valores possíveis de acordo com o layout/ano

    Dava mensagem de erro ao ser informado em branco, qué é a situação mais comum e possível

     

    2) (0-0000) A inscrição estadual "%s" digitada é inválida!

     

    Algumas empresas não tem IE, não estava sendo tratada essa possibilidade

  6. Boa tarde, gostaria de saber o que significa "orgão gerador" na nfse. Ocorre que na importação de algumas notas o código do município está vindo (aparentemente) errado dentro da tag <orgaogerador><codigomunicipio>, com isso o acbr não localiza o provedor e não é feita a importação pois esta é a primeira tag que é verificada para determinar o provedor:

     

    unit pnfsNFSeR;

     

     if FProvedor = proNenhum then
     begin
       if (Leitor.rExtrai(1, 'OrgaoGerador') <> '') then
       begin
         CM := Leitor.rCampo(tcStr, 'CodigoMunicipio');
         FProvedor := StrToProvedor(Ok, CodCidadeToProvedor(StrToIntDef(CM, 0)));
       end;


       if (CM = '') or (CM = '0') then
       begin
         if (Leitor.rExtrai(1, 'Servico') <> '') then
         begin
           CM := Leitor.rCampo(tcStr, 'CodigoMunicipio');
           FProvedor := StrToProvedor(Ok, CodCidadeToProvedor(StrToIntDef(CM, 0)));
         end;
       end;

       if (CM = '') or (CM = '0') then
       begin
         if (Leitor.rExtrai(1, 'PrestadorServico') <> '') then
         begin
           CM := OnlyNumber(Leitor.rCampo(tcStr, 'CodigoMunicipio'));
           if CM = '' then
             CM := Leitor.rCampo(tcStr, 'Cidade');
           FProvedor := StrToProvedor(Ok, CodCidadeToProvedor(StrToIntDef(CM, 0)));
         end
         else
           FProvedor := proNenhum;
       end;
       { Alterado Por Cleiver em - 22-08-2014 }
       if (FProvedor = proNenhum) and (Pos('https://nfse.goiania.go.gov.br/ws/'Leitor.Arquivo) > 0)  then
         FProvedor := proGoiania;
     end;

  7. Estava fazendo alguns testes de importação de lote nfse com um arquivo contendo cerca de 650 notas. Ao tentar fazer a importação notei que o sistema travava no método LoadFromFile, debugando a unit notei que o problema eram nas funções StringReplace de Delphi que são muito lentas ao menipular uma quantidade maior de caracteres.

    Essas 650 notas quando chegou em 5 minutos desisti de esperar ... se pesquisarem por "faster delphi stringreplace" no google irão ver que essa lentidão é bastante discutida

     

    Pesquisando um pouco achei alguns substitutos otimizados para o StringReplace, um deles foi o StrReplace, da biblioteca Jedi (unit JclStrings).

     

    Fiz as alterações no código para testar e agora demora cerca de 20 segundos a importação.

     

    Gostaria de saber a posição dos demais programadores a respeito de uma possível alteração, incorporando a função StrReplace do Jedi dentro do ACBR.

     

     

    A dica peguei neste link http://conferences.embarcadero.com/article/32120 no final do artigo (Alternative String Routines (FastStrings and other Libraries))

     

     

    Abaixo os trechos de código alterado:

     

    Unit AcbrNfseNotasFiscais

     

     try
      {$IFDEF DELPHI2009_UP}
        Encoding := NotaUtil.LoadXML(CaminhoArquivo);
      {$ENDIF}
      ArquivoXML := TStringList.Create;
      ArquivoXML.LoadFromFile(CaminhoArquivo {$IFDEF DELPHI2009_UP},Encoding{$ENDIF});
      Result := True;

      aux := ArquivoXML.Text;
      StrReplace(aux, '&lt;', '<', [rfReplaceAll]);
      StrReplace(aux, '&gt;', '>', [rfReplaceAll]);

    //  ArquivoXML.Text := StrReplace(StringReplace( ArquivoXML.Text, '&lt;', '<', [rfReplaceAll]), '&gt;', '>', [rfReplaceAll]);
      ArquivoXML.Text := NotaUtil.RetirarPrefixos(aux);

     

    Unit AcbrNfseUtil

     

    class function NotaUtil.RetirarPrefixos(const AXML: String): String;
    var
     XML: string;
    begin
     XML := AXML;
     StrReplace( XML, 'ns1:', '', [rfReplaceAll] );
     StrReplace( XML, 'ns2:', '', [rfReplaceAll] );
     StrReplace( XML, 'ns3:', '', [rfReplaceAll] );
     StrReplace( XML, 'ns4:', '', [rfReplaceAll] );
     StrReplace( XML, 'ns5:', '', [rfReplaceAll] );
     StrReplace( XML, 'tc:', '', [rfReplaceAll] );
     StrReplace( XML, 'ii:', '', [rfReplaceAll] );
     StrReplace( XML, 'p1:', '', [rfReplaceAll] );
     StrReplace( XML, 'nfse:', '', [rfReplaceAll] );
     StrReplace( XML, 'soap:', '', [rfReplaceAll] );
     StrReplace( XML, 'soap12:', '', [rfReplaceAll] );
     StrReplace( XML, 'SOAP-ENV:', '', [rfReplaceAll] );

     result := XML;
    end;

  8. Boa tarde, ao tentar compilar meu projeto (após uma atualização hoje) está retornando erro nas linhas abaixo destacadas. Verifiquei rapidamente e aparentemente está errado mesmo.

     

    Erro: "[DCC Error] pcnRetEnvEventoNFe.pas(274): E2018 Record, object or class type required"

     

     

             while  Leitor.rExtrai(3, 'chNFePend', '', j + 1) <> '' do
              begin
                FretEvento.Items.FRetInfEvento.chNFePend.Add;

                FretEvento.Items.FRetInfEvento.chNFePend[j].ChavePend := Leitor.rCampo(tcStr, 'chNFePend');

                inc(j);
              end;

             inc(i);
           end;

  9. Pessoal, estou anexando o que tenho do projeto. Estão sendo gerados os eventos iniciais e mais as duas primeiras tabelas. A situação é a seguinte: o programador que estava na empresa saiu (talvez dê continuidade como free) então não sei exatamente a situação do componente. Ele foi feito baseado no ACBRNfe, seguindo o mesmo padrão, gostaria de seguir esse caminho.

    Precisamos acertar as arestas, o ponto inicial para então darmos continuidade.

    Por favor, qualquer duvida me perguntem ou passem mensagem, inclusive se faltou alguma coisa ....

     

     

    AcbrEsocial.zip

×
×
  • 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.