Fórum Access Violation at address #238271

17/06/2004

0

Bom tarde pessoal,
Estou com um problema de endereçamento de memória( Access vilation at address- Runtime 217) . Ocorre da seguinte forma, tenho dois Dataset lote e itens, daí feche-os e executo outro Dataset com Delete passando parametro. É nesse momento que o erro acontece. Vejam o código abaixo. Caso possam me ajudar a identificar o problema ou outra forma de faze-los.

aux:=LoteREFERENCIA.AsString; //Guarda o dado da referencia
Itens.Close;//Fechar tabelas principais
Itens.DataSet.Prepared:=false;
Lote.Close;
Lote.DataSet.Prepared:=false;
//---------------------------------------------------------//
Delete_itens.Close;
Delete_itens.Params.ParamByName(´ref´).AsString:=aux;
Delete_itens.Execute;
Delete_itens.close;

Delete_Lote.Close;
Delete_Lote.Params.ParamByName(´ref´).AsString:=aux;
Delete_Lote.Execute;
Delete_Lote.close;


Hcnc

Hcnc

Responder

Posts

17/06/2004

Paulo_amorim

Olá

Onde exatamente dá Access Violation?

E essa Delete_itens é que componente?

Até+


Responder

Gostei + 0

17/06/2004

Hcnc

Oi Paulo,
Olha só! Ele deleta o(s) registro(s) setado(s) no itens e depois no lote. Daí o problema surge quando saiu da tela. Daí tenho no Onclose assim:
itens.close;
Lote.close;
Action:=cafree;


O componente usuado é o TSimplesDataset (DBExpress Delphi 7).


Responder

Gostei + 0

17/06/2004

Paulo_amorim

Olá

Isso pode estar sendo causado porque um
Itens.dataset está aberto ou algo do genero...

Tente fechar os datasets do
itens.DataSets
e
Lote.DataSets...

Debugando, vc ve que o ero ta em qual linha?
itens.Close
ou
Action := caFree; ??
Se for no itens.close, pode mesmo tem algo aberto...

Até+


Responder

Gostei + 0

17/06/2004

Hcnc

Paulo,
Já debuguei e não apresenta o erro no SimpleDataset e nem no Action. Volta a tela principal e apresenta na unit do projeto na linha: Application.Run; Cara! muito esquisito.


Responder

Gostei + 0

17/06/2004

Rômulo Barros

REstaure o backup;.... :lol:


Responder

Gostei + 0

18/06/2004

Hcnc

É uma opção.

Valeu pela ajuda...

Até mais!


Responder

Gostei + 0

18/06/2004

Gelsonluiz

Ola, tudo bem.

Bem antes de vc tentar restaurar o backup, verifique se no formulário que chamou este está fazendo algum tipo de referencia aos datasets ou componentes deste que está sendo fechado, pois a linha ´Action = cafree´ remove o formulário e todos os seus componentes da memória gerando assim um ´Acess violation´.
Falo isso porque isso já aconteceu comigo.

Espero que tenha ajudado, Gelson.


Responder

Gostei + 0

18/06/2004

Hcnc

Olá Gelson,
Em primeiro lugar obrigado pela ajuda, pois obtive sucesso em identificar aonde gera o Acess violation. Daí retirei o Action:=Cafree tanto do forme lote como do forme itens, mas o erro se apresenta ao fechar a aplicação. E agora! Como fazer, pois tenho que referenciar o forme itens com o de lote, para atualizar um campo no forme lote ou criar outro componente Lote no forme itens e não reutilizar o do forme lote. Vou tentar.

Valeu cara!


Responder

Gostei + 0

18/06/2004

Paulo_amorim

Olá

A aplicação eh SDI? se sim, tente fazer:

no form chamador, vc deve ter os codigos
Form1 := Form1.Create(Self);
Form1.Show; //ou ShowModal, seila

Coloque essa linha depois

Form1.Free;

Form1 := Form1.Create(Self);
Form1.Show; //ou ShowModal, seila
Form1.Free;
Quem sabe melhore...

Espero que ajude
Até+


Responder

Gostei + 0

18/06/2004

Hcnc

Pessoal,
Não deu certo. Já tentei de todas as formas que sei e as sugestões de vcs.
A referencia que tenho do forme itens para o forme lote é:

procedure TFItensLotePagar.FaturaAfterApplyUpdates(Sender: TObject;
var OwnerData: OleVariant);
begin
//-----------Atualizar o campo Soma Lote ---------//
SUMiTens.close;
SUMiTens.Params.ParamByName (´ref´).AsString:=FLotePagar.LoteREFERENCIA.AsString;
SUMiTens.Open;
FLotePagar.itens.Refresh;//Atualizar os dados itens na tela principal.
FLotePagar.Lote.Edit;
FLotePagar.LoteSOMA_ITENS.AsCurrency:=SUMiTensVALOR_TOTAL.AsCurrency;
FLotePagar.Lote.Post;
SUMiTens.Close;
//-------------------------

end;


Responder

Gostei + 0

18/06/2004

Paulo_amorim

Olá

Poste como está a hierarquia dos Forms, especificando quem chama quem:
tipo...
FPrincipal - FLotes - FItensLotes

Posta a parte da procedure com A.V. , explicando em qual form está a procedure...
Posta também o OnClose do form com Access Violation... não o form da procedure, o que já está - eu presuom - fechado...
Quem sabe assim fica mais claro...

Até+


Responder

Gostei + 0

18/06/2004

Hcnc

Olá pessoal,

Vou detalhar melhor para entendimento do que estou fazendo. Desde já obrigado pela ajuda!

A hierarquia dos formes são:

1.FPrincipal chama FLotePagar:


procedure TFPrincipal.MenuDblClick(Sender: TObject);
Begin
Application.CreateForm(TFLotePagar,FLotePagar);
FLotePagar.ShowModal;
End;

2.OnActivate do FLotePagar

procedure TFLotePagar.FormActivate(Sender: TObject);
begin
empresa.open;
Lote.open;
end;

3.OnDataChange do DataSource ligado ao TsimplesDataset (Lote)

procedure TFLotePagar.DSLoteDataChange(Sender: TObject; Field: TField);
begin
Itens.close;
Itens.Params.ParamByName(´ref´).AsString:=LoteREFERENCIA.AsString;
Itens.Open;
end;


4.Form FLotePagar cria o Form FItensLotePagar

procedure TFLotePagar.BtnMovtoClick2(Sender: TObject);
begin
if ((Lote.State in [dsInsert, dsEdit])or (Lote.IsEmpty=true)) then
Showmessage(´Antes de incluir itens no lote cancele ou grave ou crie um lote!´)
else
begin
Application.CreateForm(TFItensLotePagar,FItensLotePagar);
FItensLotePagar.Showmodal;
end;

end;



5.After AppyUpdate(0) no SimpleDataset Fatura (grava no itens lote).

procedure TFItensLotePagar.FaturaAfterApplyUpdates(Sender: TObject;
var OwnerData: OleVariant);
begin
//-----------Atualizar o campo Soma Lote ---------//
SUMiTens.close;
SUMiTens.Params.ParamByName(´ref´).AsString:=FLotePagar.LoteREFERENCIA.AsString;
SUMiTens.Open;
FLotePagar.itens.Refresh;//Atualizar os dados itens na tela principal.
FLotePagar.Lote.Edit;
FLotePagar.LoteSOMA_ITENS.AsCurrency:=SUMiTensVALOR_TOTAL.AsCurrency;
FLotePagar.Lote.Post;
SUMiTens.Close;
//-------------------------

end;

6.Onclose do FitensLotePagar

procedure TFItensLotePagar.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Fatura.close;
CadEmp.Close; {Fachar tabelas}
CadUnimed.Close;
Especie.close;
Action:=cafree;//destroi form
end;

7.OnClick do botão confirma

procedure TFLotePagar.BtnConfirmaClick(Sender: TObject);
var aux:string;
begin

if (Lote.State in [dsInsert, dsEdit]) then
Showmessage(´Antes de confirma o lote, cancele ou grave os dados!´)
else
begin
if LoteVALOR_LOTE.AsCurrency=LoteSOMA_ITENS.AsCurrency then
begin //Compara valores
Itens.First;
GerarTitulo.Open;
while Itens.Eof=false do //implantar titulos do lote
begin
//--------Gerar os títulos na tabela faturas Recebidas----------//
GerarTitulo.Insert;
GerarTituloFAT_RECEBIDA.AsString:=ItensFAT_RECEBIDA.AsString;//Faturas Recebida
GerarTituloCOD_UNIMED.AsBCD:=ItensCOD_UNIMED.AsBCD;//Unimed
GerarTituloCOD_EMP.AsBCD:=ItensCOD_EMP.AsBCD;//Empresa
GerarTituloREFERENCIA.AsString:=ItensREFERENCIA.AsString;//Referencia do lote
GerarTituloCOD_ESP.AsString:=ItensCOD_ESP.AsString;//tipo especie
GerarTituloUSUA_ACESSO.AsString:=LoteUSUA_ACESSO.AsString;//usuario acesso
GerarTituloVAL_ORIGINAL_RE.AsCurrency:=ItensVAL_ORIG_RE.AsCurrency;//Valor fatura
GerarTituloDAT_RECEB_RE.AsDateTime:=ItensDAT_RECEB.AsDateTime;//Data Recebimento
GerarTituloDAT_VENC_RE.AsDateTime:=ItensDAT_VENC.AsDateTime; //Data Vencimento
GerarTituloANO_REF_RE.AsString:=ItensANO_REFERENCIA.AsString;//Ano Referencia
//GerarTituloREF_FATURA_GLOSA.AsString:= //Referencia a fatura emitida
GerarTituloVAL_SALDO_RE.AsCurrency:=ItensVAL_ORIG_RE.AsCurrency; //Valor saldo inicial = Valor Fatura
GerarTituloCONTA_SALDO.AsString:=ItensCONTA_SALDO.AsString;//Conta de Passivo
GerarTituloCONTA_RESULTADO.AsString:=ItensCONTA_RESULTADO.AsString;//Conta de despesa
GerarTitulo.Post;
//-------------------------------------------
{Movto_re apropriação}
//-------------------------------------------
Itens.Next; //próximo título
end; // fim do while
//-----------Atualizar o campo Soma Lote ---------//
GerarTitulo.Close; // fecha a tabela
aux:=LoteREFERENCIA.AsString; //Guarda o dado da referencia
Itens.Close;//Fechar tabelas principais
//---------------------------------------------------------//
Delete_itens.Close; //Truncate a tabela itens_lote_RE
Delete_itens.Params.ParamByName(´ref´).AsString:=aux;
Delete_itens.Execute;
Delete_itens.close;

Lote.Close;
Delete_Lote.Close; //Truncate a tabela lote_re
Delete_Lote.Params.ParamByName(´ref´).AsString:=aux;
Delete_Lote.Execute;
Delete_Lote.close;
//---------------------------------------------------------//
Lote.open; //Abrir tabelas principais
Showmessage(´Lote implantado com sucesso!´);
end else
Begin
Showmessage(´Valor lote difere da soma das faturas!´);
DBEdit4.SetFocus;
end;//fim do else
end;//fim do if lote dsinsert
end;


Obs: Caso não confirme o lote não apresenta erro de acess violation ao sair da tela FLotePagar, mas se confirmar sim.

8.OnClose do Form FlotePagar

procedure TFLotePagar.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Itens.Close;
Lote.Close;
empresa.close;
action:=cafree;
end;


Responder

Gostei + 0

22/06/2004

Hcnc

Olá pessoal,
Na verdade o erro se encontra no item 7 neste processo:

itens.close;
Delete_itens.Close;
Delete_itens.Params.ParamByName(´ref´).AsString:=aux;
Delete_itens.Execute;
Delete_itens.close;

Lote.Close;
Delete_Lote.Close;
Delete_Lote.Params.ParamByName(´ref´).AsString:=aux;
Delete_Lote.Execute;
Delete_Lote.close;

Daí não entendo por que não posso criar outro objeto TSimplesDataset para deletar os dados. Se alguém puder me explicar ficarei grato.

Até mais!


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar