Ir para conteúdo
  • Cadastre-se

dev botao

Erro - Out Of Memory


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

Recommended Posts

Boa tarde !


 

Estos tentando gerar o SpedFiscal para um arquivo de em média 300 mil linhas e esta dando o erro "Out of Memory" , ja pesquisei no forum mas nada resolveu , percebi que nos registros do bloco-0 o componente ja vai escrevendo no arquivo a cada 1000 linhas do buffer , ja no bloco-C isso não acontece , o componente vai ficando lento e espera gerar o arquivo do registro por completo para escrever no arquivo , então se no caso aquele registro tiver umas 80 mil linhas , é onde esta gerando este estouro de memória , nos registros C470  !

 


obrigado por enquanto !

Link para o comentário
Compartilhar em outros sites

Como vc mesmo observou, o componente escreve linha a linha, se no caso do bloco C não esteja, terá que ser debugando e verificar o porque, vou dar uma olhada, mas infelizmente não tenho como fazer isso rápido.

 

Se puder verificar o motivo, e conseguindo acertar me enviar eu subo para o SVN.

--
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

  • Fundadores

Você precisa usar a geração de arquivo com concomitância... nos fontes do Demo há um descritivo sobre isso...

 

Tente gerar mais de 10.000 notas no Demo que o problema ocorre... depois acione as opções de gravação com concomitância e veja como funciona

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

Daniel .

 

Estou debugando com o Ricardo "designerba" esse SpedFiscal e ta meio osso , o sped em questão tem umas 300 mil linhas aproximadamente , é grande , e o erro só ocorre quando muitas linhas mesmo !

 

Estamos Gerando os registros do bloco-0 e bloco-C...

 

Oque se percebe é que os Registros do bloco-0 e os registros C100 e C170 , são muito rapido para gerar , coisa de segundos para 30 mil registros , agora para os registros C400... de ECF , em especial o C460 e C470 é onde ocorre o problema , começa a demora , fica parecendo amarrado e quando estão na casa dos 70 mil registros o erro é apresentado "Out of Memory" .

1-Após o C100 e Filhos... dou um = ACBrSPEDFiscal1.WriteBloco_C(False) ; 

2-E a cada C400... dou um ACBrSPEDFiscal1.WriteBloco_C(False) ; 

3-E por final... dou um = ACBrSPEDFiscal1.WriteBloco_C(True) ;  // Fecho

Só que com este movimento grande não consigo chegar a realizar a condição 3 acima citada pois fica preso no except "Out of Memory" dentro dos registro C460 e C470 , agora não sei onde em que linha ao certo , estou estudando a estrutura do componente , Daniel por gentileza , caso encontre algo que possa ajudar , ficamos muito grato ! enquanto isso vou vendo aqui pra ver se vejo algo !

 

no inicio da geração estamos iniciando como no Demo , assim :

 

      with ACBrSpedFiscal1 do

           begin

           DT_INI       := DataInicial ;

           DT_FIN       := DataFinal ;

           Path         := '.\';

           Arquivo      := SaveDialog1.FileName ;

           LinhasBuffer := 1000 ; 

           IniciaGeracao ;

           end ;

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Vc tentou ajustar sua geração para usar a concomitância ?

 

Basta usar o Write a cada N registros do seu loop... Veja como foi feito no Demo...

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

Olhe , coloquei pra ser escrito a cada C460 após os filhos C470 anexados ele escrever , Só que o primeiro looping vai blz e no Segundo gera exceção "List index out of bounds" :

 

 

                                            // C460: DOCUMENTO FISCAL EMITIDO POR ECF (CÓDIGO 02 e 2D).

                                            if Bloco_0.Registro0000.IND_PERFIL <> pfPerfilB then

                                               begin

                                               QryRegistro_C460.Close ;

                                               QryRegistro_C460.SQL.Clear ;

                                               QryRegistro_C460.SQL.Text := 'SELECT   CF.COD_CUPOM_FISCAL ,                        '+

                                                                                     'CF.NUMERO_SERIE_ECF ,                        '+

                                                                                     'CF.NUMERO_ECF ,                              '+

                                                                                     'CF.COO ,                                     '+

                                                                                     'CF.DATA ,                                    '+

                                                                                     'CF.NUMERO_PDV ,                              '+

                                                                                     'CF.CNPJ_CPF_CLIENTE ,                        '+

                                                                                     'CF.VALOR ,                                   '+

                                                                                     'SUM(CF_ITENS.PIS_VALOR)AS VALOR_PIS ,        '+

                                                                                     'SUM(CF_ITENS.COFINS_VALOR)AS VALOR_COFINS    '+

                                                                                     'FROM                                         '+

                                                                                     'CADASTRO_CF_ITENS CF_ITENS                   '+

                                                                                     'INNER JOIN CADASTRO_CF_GERAL CF ON ( CF.COD_CUPOM_FISCAL = CF_ITENS.COD_CUPOM_FISCAL ) '+

                                                                                     'Where CF.NUMERO_SERIE_ECF=:NUMERO_SERIE_ECF and CF.DATA=:DATA '+

                                                                                     'GROUP BY                              '+

                                                                                     'CF.COD_CUPOM_FISCAL,                  '+

                                                                                     'CF.NUMERO_SERIE_ECF,                  '+

                                                                                     'CF.NUMERO_ECF,                        '+

                                                                                     'CF.COO ,                              '+

                                                                                     'CF.DATA ,                             '+

                                                                                     'CF.NUMERO_PDV ,                       '+

                                                                                     'CF.CNPJ_CPF_CLIENTE ,                 '+

                                                                                     'CF.VALOR                              '+

                                                                                     'Order By CF.COO asc'    ;                                                                                        

                                               QryRegistro_C460.ParamByName('NUMERO_SERIE_ECF').AsString := QryECFs.FieldByName('NUMERO_SERIE_ECF').AsString ;

                                               QryRegistro_C460.ParamByName('DATA').AsDate               := QryECFReducao_Z.FieldByName('DATA_FECHAMENTO').AsDateTime ;

                                               QryRegistro_C460.Prepare ;

                                               QryRegistro_C460.Open ;

                                               while not QryRegistro_C460.Eof do // Aqui da o erro - "List index out of bounds" no segundo looping após o ACBrSPEDFiscal1.WriteBloco_C(False) ;     

                                                     begin

                                                     with RegistroC460New do

                                                          begin  

                                                          COD_MOD   := QryECFReducao_Z.FieldByName('MODELO_DOC').AsString ;

                                                          COD_SIT   := sdRegular ;

                                                          NUM_DOC   := QryRegistro_C460.fieldbyname('COO').AsString ;

                                                          DT_DOC    := QryRegistro_C460.fieldbyname('DATA').AsDateTime ;

                                                          VL_DOC    := QryRegistro_C460.fieldbyname('VALOR').AsFloat ;

                                                          VL_PIS    := QryRegistro_C460.fieldbyname('VALOR_PIS').AsFloat ;

                                                          VL_COFINS := QryRegistro_C460.fieldbyname('VALOR_COFINS').AsFloat ;

                                                          if (Length(QryRegistro_C460.fieldbyname('CNPJ_CPF_CLIENTE').AsString) = 11) or

                                                             (Length(QryRegistro_C460.fieldbyname('CNPJ_CPF_CLIENTE').AsString) = 14) then

                                                             begin

                                                             CPF_CNPJ  := QryRegistro_C460.fieldbyname('CNPJ_CPF_CLIENTE').AsString ;

                                                             NOM_ADQ   := 'Cliente Cadastrado : '+ CPF_CNPJ ;

                                                             end ;

 

                                                          // C470: ITENS DO DOCUMENTO FISCAL EMITIDO POR ECF (CÓDIGO 02 e 2D).

                                                          QryRegistro_C470.Close ;

                                                          QryRegistro_C470.SQL.Clear ;

                                                          QryRegistro_C470.SQL.Text := 'Select * From CADASTRO_CF_ITENS ' +

                                                                                       'Where NUMERO_SERIE_ECF=:NUMERO_SERIE_ECF and COO=:COO '+

                                                                                       'Order By ITEM asc' ;

                                                          QryRegistro_C470.ParamByName('NUMERO_SERIE_ECF').AsString := QryRegistro_C460.fieldbyname('NUMERO_SERIE_ECF').AsString ;

                                                          QryRegistro_C470.ParamByName('COO').AsString              := QryRegistro_C460.fieldbyname('COO').AsString ;

                                                          QryRegistro_C470.Prepare ;

                                                          QryRegistro_C470.Open ;

                                                          while not QryRegistro_C470.Eof do

                                                                begin

                                                                with RegistroC470New do

                                                                     begin

                                                                     application.ProcessMessages ;

                                                                     COD_ITEM  := QryRegistro_C470.fieldbyname('CODIGO').AsString ;

                                                                     QTD       := QryRegistro_C470.fieldbyname('QUANTIDADE').AsFloat ;

                                                                     QTD_CANC  := 0 ;

                                                                     UNID      := QryRegistro_C470.fieldbyname('UNIDADE').AsString ;

                                                                     VL_ITEM   := QryRegistro_C470.fieldbyname('TOTAL').AsFloat ;

                                                                     CST_ICMS  := QryRegistro_C470.fieldbyname('ICMS_CST').AsString ;

                                                                     CFOP      := QryRegistro_C470.fieldbyname('CFOP').AsString ;

                                                                     ALIQ_ICMS := QryRegistro_C470.fieldbyname('ICMS_PERCENTUAL').AsFloat ;

                                                                     VL_PIS    := QryRegistro_C470.fieldbyname('PIS_VALOR').AsFloat ;

                                                                     VL_COFINS := QryRegistro_C470.fieldbyname('COFINS_VALOR').AsFloat ;

 

                                                                     // TAG's Adicionais para registro C470  Formato = ( Contimatic Phoenix G5 )

                                                                     if Radio_Contimatic_G5.Checked = True Then

                                                                        begin

                                                                        C470_CST_PIS            := QryRegistro_C470.FieldByName('PIS_CST').AsString ;

                                                                        C470_NAT_REC_PIS        := '' ;

                                                                        C470_VL_BC_PIS          := FormatFloat('0.00',QryRegistro_C470.FieldByName('PIS_BC').AsFloat) ;

                                                                        C470_ALIQ_PIS           := FormatFloat('0.00',QryRegistro_C470.FieldByName('PIS_PERCENTUAL').AsFloat) ;

                                                                        C470_QUANT_BC_PIS       := '' ;

                                                                        C470_ALIQ_PIS_QUANT     := '' ;

                                                                        C470_CST_COFINS         := QryRegistro_C470.FieldByName('COFINS_CST').AsString ;

                                                                        C470_NAT_REC_COFINS     := '' ;

                                                                        C470_VL_BC_COFINS       := FormatFloat('0.00',QryRegistro_C470.FieldByName('COFINS_BC').AsFloat) ;

                                                                        C470_ALIQ_COFINS        := FormatFloat('0.00',QryRegistro_C470.FieldByName('COFINS_PERCENTUAL').AsFloat) ;

                                                                        C470_QUANT_BC_COFINS    := '' ;

                                                                        C470_ALIQ_COFINS_QUANT  := '' ;

                                                                        C470_COD_CTA            := '' ;

                                                                        C470_IND_MOV            := '' ;

                                                                        Arquivo_Temp_C470.Add(   '|' + C470_CST_PIS            + '|' +

                                                                                                       C470_NAT_REC_PIS        + '|' +

                                                                                                       C470_VL_BC_PIS          + '|' +

                                                                                                       C470_ALIQ_PIS           + '|' +

                                                                                                       C470_QUANT_BC_PIS       + '|' +

                                                                                                       C470_ALIQ_PIS_QUANT     + '|' +

                                                                                                       C470_CST_COFINS         + '|' +

                                                                                                       C470_NAT_REC_COFINS     + '|' +

                                                                                                       C470_VL_BC_COFINS       + '|' +

                                                                                                       C470_ALIQ_COFINS        + '|' +

                                                                                                       C470_QUANT_BC_COFINS    + '|' +

                                                                                                       C470_ALIQ_COFINS_QUANT  + '|' +

                                                                                                       C470_COD_CTA            + '|' +

                                                                                                       C470_IND_MOV                );

                                                                        end ;

                                                                     // TAG's Adicionais para registro C470  Formato = ( Contimatic Phoenix G5 )

 

                                                                     end ;

                                                                QryRegistro_C470.Next ;

                                                                end ;

 

                                                          ACBrSPEDFiscal1.WriteBloco_C(False) ;                                         Application.ProcessMessages ;

                                                          end ; // with RegistroC460New do

 

                                                     QryRegistro_C460.Next ;

                                                     end ; //  while not QryRegistro_C460.Eof do

Link para o comentário
Compartilhar em outros sites

Não sei se eu estou fazendo coisa errada , me perdoem se for mas , vou resumir , acima ta meio zuado :

 

1º Nos registros C100 , C170 esta perfeito , sem nenhum erro .

 

Estou fazendo assim para os C460 e filho C470 :

 

while Cupons do // no segundo looping da o erro "List index out of bounds" , somente após quando ACBrSPEDFiscal1.WriteBloco_C(False) ;

begin

with RegistroC460New do

begin

...Item do C460

with RegistroC470New do

begin

...Itens do C470 , varios itens

end ;

end ;

 

 ACBrSPEDFiscal1.WriteBloco_C(False) ;

end ;

 

 

 

Nesta função da o erro :

 

function TBloco_C.RegistroC460New: TRegistroC460;

var

C400Count: integer;

C405Count: integer;

begin

   C400Count := FRegistroC001.RegistroC400.Count -1;

   C405Count := FRegistroC001.RegistroC400.Items[C400Count].RegistroC405.Count -1;  // Erro Aqui no segundo looping após Write...

   //

   Result := FRegistroC001.RegistroC400.Items[C400Count].RegistroC405.Items[C405Count].RegistroC460.New;

end;

Link para o comentário
Compartilhar em outros sites

Bom...

 

Tentei colocar concomitancia = ACBrSPEDFiscal1.WriteBloco_C(False) no looping entre os registros C400 , C405 , C460 , C470 ... sem sucesso , dando o erro acima citado , amanhã estarei fazendo mais um debug pra ver se encontro onde está gerando o bug , a principio fica novamente onde está o erro que ao dar o write entre os registros C400...etc , gera-se o erro abaixo :

 

 

function TBloco_C.RegistroC460New: TRegistroC460;

var

C400Count: integer;

C405Count: integer;

begin

   C400Count := FRegistroC001.RegistroC400.Count -1;

   C405Count := FRegistroC001.RegistroC400.Items[C400Count].RegistroC405.Count -1;  // Erro Aqui no segundo looping após Write...

   //

   Result := FRegistroC001.RegistroC400.Items[C400Count].RegistroC405.Items[C405Count].RegistroC460.New;

end;

 

 

 

 

 

até .

Link para o comentário
Compartilhar em outros sites

Estou sim Jeferson , a sequencia esta correta como no manual de integração e tbm Demo ; oque acontece com os registros C400 ... é que eu não consigo concomitar como nos Registros C170 com o comando ACBrSPEDFiscal1.WriteBloco_C(False)  , quando dou esse comando o erro "List index out of bounds" aparece ao proximo New de qualquer sequencia C405 , C460 C470 , ou seja ,  só consigo dar ACBrSPEDFiscal1.WriteBloco_C(False) ao iniciar o New do próximo looping do registro C400 with RegistroC400New do , isso se da porque o componente da um Clear na list inteira C400...  fiz oque o Daniel pediu Write , WriteBuffer mas não deu certo , no Demo tbm não posso efetuar o comando ACBrSPEDFiscal1.WriteBloco_C(False) antes de terminar o C400 completo !

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Acho que nesse caso não será possível usar o ACBrSpedFiscal... você teria que ter um componente que armazene as informações em um BD temporário, e não em memória...

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

Daniel , em uma das tentativas aqui efetuadas eu  comentei o RegC001.RegistroC400.Clear;   e o componente gerou mais de Dois milhões de linhas rapidinho sem nenhum erro e eu anexei o comando ACBrSPEDFiscal1.WriteBloco_C(False) ao termino do C470 onde eu quero o comando , rodou blz , é claro que duplicando registros , pois sem o clear o componente só agrega itens ao C400 e nunca limpa , mas acho que pode ser o caminho .

Link para o comentário
Compartilhar em outros sites

Daniel e demais colegas , estou dando o feed back aqui e comunicando que o problema acima reportado no inicio do tópico "Out Of Memory"  "Não foi gerado pelo Componente ACBRSpedFiscal" por coincidencia foi um erro semelhante que tbm era gerado no componente mas que vós tratou com a concomitancia .

Como estamos trabalhando tbm para geração de arquivos para Contimatic G5 , Folhamatic e Mastermaq , com alguns TStringList... dinamicos dentro da aplicação e algumas treeds... e tal , depois de inumeros testes verificamos que um desses componentes era alimentado e chegava ao resultado "Out Of Memory" .

 

Pedimos desculpas pelo transtorno e grato pela atenção dispensada .

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...

Boa tarde Marcelo.

Gostaria de saber como você resolveu esse "erro".

Estou com o mesmo problema quando executo o RegistroC460 concomitante: List index(-1)out of bounds.

Debuguei e cheguei ao mesmo que você, ele limpa.

function TBloco_C.RegistroC460New: TRegistroC460;

var

C400Count: integer;

C405Count: integer;

begin

   C400Count := FRegistroC001.RegistroC400.Count -1;

   C405Count := FRegistroC001.RegistroC400.Items[C400Count].RegistroC405.Count -1;  // Erro Aqui no segundo looping após Write...

   //

   Result := FRegistroC001.RegistroC400.Items[C400Count].RegistroC405.Items[C405Count].RegistroC460.New;

end;

      

Para facilitar o teste eu usei o exemplo do ACBr, e ocorre o mesmo erro.

Quando eu comento a linha //ACBrSPEDFiscal1.WriteBloco_C(False), ele faz o loop e gera todos.

Eu não faço integração como você.

"geração de arquivos para Contimatic G5 , Folhamatic e Mastermaq..."

Se isto só ocorreu com o seu desenvolvimento e o meu, tem alguma coisa em comum.

Desde já agradeço,

Tércio Lins.

|C400|2D|DARUMA FS600|21098765432123456789|001|

|C405|30112011|001|000001|000001|100,00|100,00|

|C410|0,00|0,00|

|C420|T1700|100,00|01|TOTALIZADOR T1700|

|C460|2D|00|000001|30112011|100,00|||33333333333|TESTE|

|C470|000001|1,000|0,000|UN|100,00|000|5102|17,00|0,00|0,00|

|C460|2D|00|000001|30112011|100,00|||33333333333|TESTE|

|C470|000001|1,000|0,000|UN|100,00|000|5102|17,00|0,00|0,00|

|C460|2D|00|000001|30112011|100,00|||33333333333|TESTE|

|C470|000001|1,000|0,000|UN|100,00|000|5102|17,00|0,00|0,00|

|C460|2D|00|000001|30112011|100,00|||33333333333|TESTE|

|C470|000001|1,000|0,000|UN|100,00|000|5102|17,00|0,00|0,00|

|C490|000|5102|17,00|100,00|100,00|17,00|000001|

|C990|59|

    

      //REGISTRO C400 - EQUIPAMENTO ECF (CÓDIGO 02 e 2D).

      With RegistroC400New do

      begin

        COD_MOD := '2D';

        ECF_MOD := 'DARUMA FS600';

        ECF_FAB := '21098765432123456789';

        ECF_CX := '001';

        With RegistroC405New do

        begin

          DT_DOC := DT_FIN; //StrToDate('30/11/2011');

          CRO := 1;

          CRZ := 1;

          NUM_COO_FIN := 1;

          GT_FIN := 100.00;

          VL_BRT := 100.00;

          With RegistroC410New do

          begin

            VL_PIS := 0.00;

            VL_COFINS := 0.00;

          end;

          With RegistroC420New do

          begin

            COD_TOT_PAR := 'T1700';

            VLR_ACUM_TOT := 100.00;

            NR_TOT := 1;

            DESCR_NR_TOT := 'TOTALIZADOR T1700';

            { Gera este registro somente para empresas do pergil B de apresentação }

            if Bloco_0.Registro0000.IND_PERFIL = pfPerfilB then

            begin

              With RegistroC425New do

              begin

                COD_ITEM := '000001';

                QTD := 1;

                UNID := 'PC';

                VL_ITEM := 100.00;

                VL_PIS := 0.00;

                VL_COFINS := 0.00;

              end;

            end;

          end;

          if Bloco_0.Registro0000.IND_PERFIL <> pfPerfilB then

          begin

            

            for at:=0 to 3 do   // loop para o teste //

            begin

              with REgistroC460New do

              begin

                COD_MOD := '2D';

                COD_SIT := sdRegular;

                NUM_DOC := '000001';

                DT_DOC := StrToDate('30/11/2011');

                VL_DOC := 100.00;

                VL_PIS := 0.00;

                VL_COFINS := 0.00;

                CPF_CNPJ := '33333333333';

                NOM_ADQ := 'TESTE';

                with RegistroC470New do

                begin

                  COD_ITEM := '000001';

                  QTD := 1;

                  QTD_CANC := 0;

                  UNID := 'UN';

                  VL_ITEM := 100.00;

                  CST_ICMS := '000';

                  CFOP := '5102';

                  ALIQ_ICMS := 17.00;

                  VL_PIS := 0.00;

                  VL_COFINS := 0.00;

                end;

              end;

              if cbConcomitante.Checked then

              begin

                // Grava registros na memoria para o TXT, e limpa memoria

                ACBrSPEDFiscal1.WriteBloco_C(False); // False, NAO fecha o Bloco

              end;

            end;

          end;

          with RegistroC490New do

          begin

            CST_ICMS := '000';

            CFOP := '5102';

            ALIQ_ICMS := 17.00;

            VL_OPR := 200.00;

            VL_BC_ICMS := 200.00;

            VL_ICMS := 32.00;

            COD_OBS := '000001'

          end;

          { Só envia este registro se o contribuinte for da BA }

          if Bloco_0.Registro0000.UF = 'BA' then

          begin

            with RegistroC495New do

            begin

              ALIQ_ICMS := 17.00;

              COD_ITEM := '000001';

              QTD := 1.00;

              QTD_CANC := 0.00;

              UNID := 'UN';

              VL_ITEM := 100.00;

              VL_DESC := 0.00;

              VL_CANC := 0.00;

              VL_ACMO := 0.00;

              VL_BC_ICMS := 100.00;

              VL_ICMS := 17.00;

              VL_ISEN := 0.00;

              VL_ICMS_ST := 0.00;

            end;

          end;

        end;

      end;

 

Editado por Tercio Lins
Link para o comentário
Compartilhar em outros sites

Boa tarde Marcelo.

Gostaria de saber como você resolveu esse "erro".

Estou com o mesmo problema quando executo o RegistroC460 concomitante: List index(-1)out of bounds.

Debuguei e cheguei ao mesmo que você, ele limpa.

function TBloco_C.RegistroC460New: TRegistroC460;

var

C400Count: integer;

C405Count: integer;

begin

   C400Count := FRegistroC001.RegistroC400.Count -1;

   C405Count := FRegistroC001.RegistroC400.Items[C400Count].RegistroC405.Count -1;  // Erro Aqui no segundo looping após Write...

   //

   Result := FRegistroC001.RegistroC400.Items[C400Count].RegistroC405.Items[C405Count].RegistroC460.New;

end;

      

Para facilitar o teste eu usei o exemplo do ACBr, e ocorre o mesmo erro.

Quando eu comento a linha //ACBrSPEDFiscal1.WriteBloco_C(False), ele faz o loop e gera todos.

Eu não faço integração como você.

"geração de arquivos para Contimatic G5 , Folhamatic e Mastermaq..."

Se isto só ocorreu com o seu desenvolvimento e o meu, tem alguma coisa em comum.

Desde já agradeço,

Tércio Lins.

|C400|2D|DARUMA FS600|21098765432123456789|001|

|C405|30112011|001|000001|000001|100,00|100,00|

|C410|0,00|0,00|

|C420|T1700|100,00|01|TOTALIZADOR T1700|

|C460|2D|00|000001|30112011|100,00|||33333333333|TESTE|

|C470|000001|1,000|0,000|UN|100,00|000|5102|17,00|0,00|0,00|

|C460|2D|00|000001|30112011|100,00|||33333333333|TESTE|

|C470|000001|1,000|0,000|UN|100,00|000|5102|17,00|0,00|0,00|

|C460|2D|00|000001|30112011|100,00|||33333333333|TESTE|

|C470|000001|1,000|0,000|UN|100,00|000|5102|17,00|0,00|0,00|

|C460|2D|00|000001|30112011|100,00|||33333333333|TESTE|

|C470|000001|1,000|0,000|UN|100,00|000|5102|17,00|0,00|0,00|

|C490|000|5102|17,00|100,00|100,00|17,00|000001|

|C990|59|

    

      //REGISTRO C400 - EQUIPAMENTO ECF (CÓDIGO 02 e 2D).

      With RegistroC400New do

      begin

        COD_MOD := '2D';

        ECF_MOD := 'DARUMA FS600';

        ECF_FAB := '21098765432123456789';

        ECF_CX := '001';

        With RegistroC405New do

        begin

          DT_DOC := DT_FIN; //StrToDate('30/11/2011');

          CRO := 1;

          CRZ := 1;

          NUM_COO_FIN := 1;

          GT_FIN := 100.00;

          VL_BRT := 100.00;

          With RegistroC410New do

          begin

            VL_PIS := 0.00;

            VL_COFINS := 0.00;

          end;

          With RegistroC420New do

          begin

            COD_TOT_PAR := 'T1700';

            VLR_ACUM_TOT := 100.00;

            NR_TOT := 1;

            DESCR_NR_TOT := 'TOTALIZADOR T1700';

            { Gera este registro somente para empresas do pergil B de apresentação }

            if Bloco_0.Registro0000.IND_PERFIL = pfPerfilB then

            begin

              With RegistroC425New do

              begin

                COD_ITEM := '000001';

                QTD := 1;

                UNID := 'PC';

                VL_ITEM := 100.00;

                VL_PIS := 0.00;

                VL_COFINS := 0.00;

              end;

            end;

          end;

          if Bloco_0.Registro0000.IND_PERFIL <> pfPerfilB then

          begin

            

            for at:=0 to 3 do   // loop para o teste //

            begin

              with REgistroC460New do

              begin

                COD_MOD := '2D';

                COD_SIT := sdRegular;

                NUM_DOC := '000001';

                DT_DOC := StrToDate('30/11/2011');

                VL_DOC := 100.00;

                VL_PIS := 0.00;

                VL_COFINS := 0.00;

                CPF_CNPJ := '33333333333';

                NOM_ADQ := 'TESTE';

                with RegistroC470New do

                begin

                  COD_ITEM := '000001';

                  QTD := 1;

                  QTD_CANC := 0;

                  UNID := 'UN';

                  VL_ITEM := 100.00;

                  CST_ICMS := '000';

                  CFOP := '5102';

                  ALIQ_ICMS := 17.00;

                  VL_PIS := 0.00;

                  VL_COFINS := 0.00;

                end;

              end;

              if cbConcomitante.Checked then

              begin

                // Grava registros na memoria para o TXT, e limpa memoria

                ACBrSPEDFiscal1.WriteBloco_C(False); // False, NAO fecha o Bloco

              end;

            end;

          end;

          with RegistroC490New do

          begin

            CST_ICMS := '000';

            CFOP := '5102';

            ALIQ_ICMS := 17.00;

            VL_OPR := 200.00;

            VL_BC_ICMS := 200.00;

            VL_ICMS := 32.00;

            COD_OBS := '000001'

          end;

          { Só envia este registro se o contribuinte for da BA }

          if Bloco_0.Registro0000.UF = 'BA' then

          begin

            with RegistroC495New do

            begin

              ALIQ_ICMS := 17.00;

              COD_ITEM := '000001';

              QTD := 1.00;

              QTD_CANC := 0.00;

              UNID := 'UN';

              VL_ITEM := 100.00;

              VL_DESC := 0.00;

              VL_CANC := 0.00;

              VL_ACMO := 0.00;

              VL_BC_ICMS := 100.00;

              VL_ICMS := 17.00;

              VL_ISEN := 0.00;

              VL_ICMS_ST := 0.00;

            end;

          end;

        end;

      end;

 

 

 

Tercio ,

 

Entres os registros de ECF que vai do C400 até o C490 ,

vc só pode escrever no arquivo = ACBrSPEDFiscal1.WriteBloco_C(False) , após o add do registro C490 de cada looping !

 

vc não pode implementar este comando entre os registros (C400 |  ...aqui... | C490) porque faz com que alem de escrever no arquivo da um Clear na Árvore , ai da o erro que vc viu .

 

Tem que ficar assim :

 

c400 .... c490 ACBrSPEDFiscal1.WriteBloco_C(False) ,  

c400 .... c490 ACBrSPEDFiscal1.WriteBloco_C(False) ... e assim vai ...

Link para o comentário
Compartilhar em outros sites

Só compartilhando!

Já tive esse erro gerando o sintegra de arquivos anuais, mas o problema estava no ClientDataSet, independente de fechar a conexão, continuava acumulando com os novos dados que trazia do banco, fiquei acompanhando a aplicação pelo gerenciador de tarefa e chegava a um valor "não lembro agora" e gerava o erro na aplicação.

 

Precisei fazer mes a mes e depois juntar, inclusive se alguem tiver alguma dica me avisa.

 

Obs.: Fechava a tela e a memoria não esvaziava, só fechando a aplicação.

 

Abs

Editado por Fenix
Link para o comentário
Compartilhar em outros sites

  • Consultores

Só compartilhando!

Já tive esse erro gerando o sintegra de arquivos anuais, mas o problema estava no ClientDataSet, independente de fechar a conexão, continuava acumulando com os novos dados que trazia do banco, fiquei acompanhando a aplicação pelo gerenciador de tarefa e chegava a um valor "não lembro agora" e gerava o erro na aplicação.

 

Precisei fazer mes a mes e depois juntar, inclusive se alguem tiver alguma dica me avisa.

Atualize seu Delphi para uma versão igual ou superior ao Delphi 2009 com update 3 ou utilize o MidasSpeedFix.

 

[]'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

Tercio ,

 

Entres os registros de ECF que vai do C400 até o C490 ,

vc só pode escrever no arquivo = ACBrSPEDFiscal1.WriteBloco_C(False) , após o add do registro C490 de cada looping !

 

vc não pode implementar este comando entre os registros (C400 |  ...aqui... | C490) porque faz com que alem de escrever no arquivo da um Clear na Árvore , ai da o erro que vc viu .

 

Tem que ficar assim :

 

c400 .... c490 ACBrSPEDFiscal1.WriteBloco_C(False) ,  

c400 .... c490 ACBrSPEDFiscal1.WriteBloco_C(False) ... e assim vai ...

Boa noite Marcelo.

 

Inicialmente eu coloquei o ACBrSPEDFiscal1.WriteBloco_C(False) após o C490, e ocorreu o mesmo erro. Tentarei outra vez e, assim que puder, retornarei com o resultado.

Grato,

Tércio Lins.

Link para o comentário
Compartilhar em outros sites

Boa noite Marcelo.

 

Inicialmente eu coloquei o ACBrSPEDFiscal1.WriteBloco_C(False) após o C490, e ocorreu o mesmo erro. Tentarei outra vez e, assim que puder, retornarei com o resultado.

Grato,

Tércio Lins.

 

Provavelmente vc implementou na posição errada do looping , estou colocando um txt Demo que temos aqui do bloco C  que fizemos pra vc analizar .

Link para o comentário
Compartilhar em outros sites

Estranho. Deve haver algum loop polindo o TStringList

 

Toda Via, se for AcbrSpedFsical, tive um problema neste sentido, eu resolvi assim:

LinhasBuffer :=98304; // 100MB RAM

 

Vc pode aumentar para 500MB = 524000. 

Atualmente creio que não há computadores com menos de um 1 GB de RAM,

 

Tenho clientes que escrituram cerca de 2.000 notas por mes. Esta foi a solução que encontrei.

 

Abraço.

 

Prates, Agnaldo

Editado por agnaldoprates

_____________

Prates, Agnaldo

Link para o comentário
Compartilhar em outros sites

Provavelmente vc implementou na posição errada do looping , estou colocando um txt Demo que temos aqui do bloco C  que fizemos pra vc analizar .

 

Bom dia Marcelo.

Obrigado pelo exemplo.

O problema é que se colocarmos após ou a cada registro C400, se não estou enganado, esse registro é para cada ECF.

Mesmo uma empresa que só tenha um ou dois ECF, irá gerar uma quantidade de registro(Cupons) que irá estourar a memória.

Empresas do comércio varejista e até supermercados pequenos, têm um movimento grande de Cupons.

Se analisarmos no exemplo o registro C100, ele grava a cada NFe.

O meu conhecimento é pequeno para opinar, não sei se existe algum fator que não permita gravar a cada cupom

ou a cada redução Z.

      for INotas := 1 to NNotas do

      begin

        with RegistroC100New do

        begin

          ........      

          ........      

          ........      

          ........      

          ........      

        end;

        if cbConcomitante.Checked then

        begin

          if (INotas mod BNotas) = 0 then // Gravar a cada N notas

          begin

            // Grava registros na memoria para o TXT, e limpa memoria

            ACBrSPEDFiscal1.WriteBloco_C(False); // False, NAO fecha o Bloco

            ProgressBar1.Position := INotas;

            Application.ProcessMessages;

          end;

        end;

      end;

  "LinhasBuffer :=98304; // 100MB RAM

   Vc pode aumentar para 500MB = 524000.

   Atualmente creio que não há computadores com menos de um 1 GB de RAM,

   Tenho clientes que escrituram cerca de 2.000 notas por mes. Esta foi a solução que encontrei."

   

   Vou tentar o que Agnaldo indicou.

  Mais uma vez estou agradecido,

  Tércio Lins.

 

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...

Só pra enfatizar, eu tive um problema parecido uma vez, gerando um inventário de aproximadamente 100.000 registros, quando chegava a 13% dos registros ocorria o erro. Debuguei o código e observei o seguinte:

 

Ao checar se o produto estava no registro0200, eu utilizava uma função que criava uma tabela virtual. Aí estava a fonte do problema.

 

Bastou alterar:

 

Var
  Tb:TIbQuery;
begin
   Tb := TIbQuery.Create(Self);
 
 
Para:
 
Var
  Tb:TIbQuery;
begin
   Tb := TIbQuery.Create(Self);
   Tb.BufferChunks := 10;
   Tb.UniDirectional :=True;
 

Pronto. Acabou o erro.

_____________

Prates, Agnaldo

Link para o comentário
Compartilhar em outros sites

  • Consultores

Não se esqueça de averiguar que esse objeto seja destruído no fim do procedimento. Ou seu projeto vai vazar memória, ou seja, consumir mais memória do que precisa (memory leak).
 

Var
  Tb:TIbQuery;
begin
  Tb := TIbQuery.Create(Self);
  try
    Tb.BufferChunks := 10;
    Tb.UniDirectional :=True;

    ......Faz um monte de coisa com Tb .....

  finally
    Tb.Free;
  end;
end;

[]'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

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