Ir para conteúdo
  • Cadastre-se

dev botao

Erro Memória Tipo 74


Ver Solução Respondido por EMBarbosa,
  • Este tópico foi criado há 3750 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Olá pessoal. Estou com um erro de memória na geração do registro tipo 74 - Registro de Inventário.
   
       Tenho um sql em uma query que retorna os dados mostrados na imagem em anexo, quando faço a primeira iteração do loop
na tabela para preencher as propriedade do registro74 tudo ocorre normalmente, mas na segunda iteração, ocorre um erro de
memória, sendo que na hora de adicionar o registro74 a lista, um código chamado: GetRegistroExiste(Obj.Codigo) é executado,
e pelo debug consigo ver que os valores comparados são iguais:
 

while (I < Self.Count) and (Self[i].Codigo <> FCodigo) do
     Inc( I ) ;

 
       Como o retorno da função não é menor que zero, o meu obj recebe um free como mostrado abaixo:
 

if Result < 0 then
     Result := inherited Add(Obj)
  else
     Obj.Free;
 

 

    Meu objeto é desistanciado com o Obj.free, o que provoca na próxima iteração do loop um erro de acess violation ao setar
o próximo valor da query na propriedade do objeto, já que o mesmo foi limpo.
 
Obs: Eu estou dando o next na tabela e também não há nenhum registro com código duplicado como vcs podem ver na imagem
em anexo. Se alguém puder me ajudar desde já agradeço.

post-13678-0-50020100-1390327309_thumb.p

Link para o comentário
Compartilhar em outros sites

  • Consultores

  Não sei como posso ajudar. Você não disponibilizou o código. Também não explicou que tipo de classe é o Obj nem o motivo de você estar chamando um Free nele. Sua dúvida não está bem definida, tipo, não há uma pergunta, nem uma sugestão do que espera que alguém faça ao ler o seu tópico... Poderia esclarecer?

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

Opa, beleza

 

Vou gerar o registro 74 do sintegra.

Tenho uma query com os dados que estão na imagem anexada acima.

 

Vou iterar pela query para salvar os dados na minha variável wregistro75 do tipo TRegistro75.

 

 while not (qrySintegra.Eof) do
  begin
    with ACBrSintegra, qrySintegra do
    begin
      wregistro75.DataInicial     :=  tmpDTINI; //Minha variável de data
      wregistro75.DataFinal       :=  tmpDTFIM; //Minha variável de data
      wregistro75.Codigo          :=  FieldByName('CDPRO').AsString;
      wregistro75.NCM             :=  FieldByName('CDNCM').AsString;
      wregistro75.Descricao       :=  FieldByName('NMPRO').AsString;
      wregistro75.Unidade         :=  FieldByName('CDUND').AsString;
      wregistro75.AliquotaIpi     :=  FieldByName('ALIPI').AsInteger;
      wregistro75.AliquotaICMS    :=  FieldByName('PICMS').AsFloat;
      wregistro75.Reducao         :=  FieldByName('REDICMS').AsFloat;
      wregistro75.BaseST          :=  FieldByName('BASEST').AsFloat;

      ACBrSintegra.Registros75.Add(wregistro75);
      Next;
    end;
  end;
 
Na primeira iteração tudo da certo, mas na segunda ao chegar no código:
 
 ACBrSintegra.Registros75.Add(wregistro75);

tem o seguinte código dentro do método add:

//Código dentro do componente AcbrSintegra  
function TRegistros74.Add(Obj: TRegistro74): Integer;
begin
  Result := GetRegistroExiste(Obj.Codigo) ;
  if Result < 0 then
     Result := inherited Add(Obj)
  else
     Obj.Free;
end;

 

Onde o código GetRegsitroExiste não retorna menor que 0 fazendo com que o
Obj.Free (que é meu wregistro75 seja desinstanciado)
Ai na próxima iteração do loop dá um erro de memória.
Link para o comentário
Compartilhar em outros sites

  • Consultores
  • Solution

Você deve criar uma instância do TRegistro75 para cada Registro 75 que vai no arquivo sintegra. Assim não dá para reutilizar os objetos num loop como está fazendo. Tente o seguinte:

 while not (qrySintegra.Eof) do
  begin
    with ACBrSintegra, qrySintegra do
    begin
      wregistro75 := TRegistro75.Create; //<---- UM OBJETO PARA CADA REGISTRO
      wregistro75.DataInicial     :=  tmpDTINI; //Minha variável de data
      wregistro75.DataFinal       :=  tmpDTFIM; //Minha variável de data
      wregistro75.Codigo          :=  FieldByName('CDPRO').AsString;
      wregistro75.NCM             :=  FieldByName('CDNCM').AsString;
      wregistro75.Descricao       :=  FieldByName('NMPRO').AsString;
      wregistro75.Unidade         :=  FieldByName('CDUND').AsString;
      wregistro75.AliquotaIpi     :=  FieldByName('ALIPI').AsInteger;
      wregistro75.AliquotaICMS    :=  FieldByName('PICMS').AsFloat;
      wregistro75.Reducao         :=  FieldByName('REDICMS').AsFloat;
      wregistro75.BaseST          :=  FieldByName('BASEST').AsFloat;

      ACBrSintegra.Registros75.Add(wregistro75);
      Next;
    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á 3750 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.