Problema com Access Violation

Delphi

06/08/2009

Olá a todos,

uso o D2007 com Firebird 2.1.2 e estou com um grande problema com uma mensagem de Access Violation q teima em aparecer; e o pior, só aparece na máquina do cliente, na minha máquina não; São 4 tabelas, a T1 é mestre, a T2 e T3 são detalhes da T1, e a T4 é detalhe da T2, estou usando um só botão pra gravar com esse código:
  if dm.cdsDPessoais.State in [dsinsert,dsedit] then
   try
    DBXTrans := dm.ConConcess.BeginTransaction(TDBXIsolations.ReadCommitted);
    if dm.cdsDPessoais.State = dsinsert then
     begin
      dm.cdsDPessoaisID_D_PESSOAIS.AsInteger := dm.GeraId(´SELECT MAX(ID_D_PESSOAIS) FROM D_PESSOAIS´);
      dm.cdsDPessoais.ApplyUpdates(0);
     end
    else
     dm.cdsDPessoais.ApplyUpdates(0);
   dm.ConConcess.CommitFreeAndNil(DBXTrans);
   except
    on e:Exception do
     begin
       dm.ConConcess.RollbackFreeAndNil(DBXTrans);
       raise;
     end;
   end;

  if dm.cdsVeicProposta.State in [dsinsert,dsedit] then
   try
    DBXTrans := dm.ConConcess.BeginTransaction(TDBXIsolations.ReadCommitted);
    if dm.cdsVeicProposta.State = dsinsert then
     begin
      dm.cdsVeicPropostaID_VEICULOS_PROPOSTA.AsInteger := dm.GeraId(´SELECT MAX(ID_VEICULOS_PROPOSTA) FROM VEICULOS_PROPOSTA´);
      dm.cdsVeicPropostaID_D_PESSOAIS.AsInteger := dm.cdsDPessoaisID_D_PESSOAIS.AsInteger;
      dm.cdsVeicProposta.ApplyUpdates(0);
     end
    else
      dm.cdsVeicProposta.ApplyUpdates(0);
   dm.ConConcess.CommitFreeAndNil(DBXTrans);
   except
    on e:Exception do
     begin
       dm.ConConcess.RollbackFreeAndNil(DBXTrans);
       raise;
     end;
   end;


  if dm.cdsVeicTroca.State in [dsinsert,dsedit] then
   try
    DBXTrans := dm.ConConcess.BeginTransaction(TDBXIsolations.ReadCommitted);
    if dm.cdsVeicTroca.State = dsinsert then
     begin
      dm.cdsVeicTrocaID_VEICULO.AsInteger := dm.GeraId(´SELECT MAX(ID_VEICULO) FROM VEICULOS_TROCA´);
      dm.cdsVeicTrocaID_D_PESSOAIS.AsInteger := dm.cdsDPessoaisID_D_PESSOAIS.AsInteger;
      dm.cdsVeicTroca.ApplyUpdates(0);
     end
    else
      dm.cdsVeicTroca.ApplyUpdates(0);
   dm.ConConcess.CommitFreeAndNil(DBXTrans);
   except
    on e:Exception do
     begin
       dm.ConConcess.RollbackFreeAndNil(DBXTrans);
       raise;
     end;
   end;

  if dm.cdsPropostas.State in [dsinsert,dsedit] then
   try
    dm.cdsPropostas.DisableControls;
    DBXTrans := dm.ConConcess.BeginTransaction(TDBXIsolations.ReadCommitted);
    if dm.cdsPropostas.State = dsinsert then
     begin
//      dm.cdsPropostasID_PROPOSTA.AsInteger := dm.GeraId(´SELECT MAX(ID_PROPOSTA) FROM PROPOSTAS´);
      dm.cdsPropostasID_VEICULOS_PROPOSTA.AsInteger := dm.cdsVeicPropostaID_VEICULOS_PROPOSTA.AsInteger;
      dm.cdsPropostas.ApplyUpdates(0);
     end
    else
      dm.cdsPropostas.ApplyUpdates(0);
   dm.ConConcess.CommitFreeAndNil(DBXTrans);
   dm.cdsPropostas.Close;
   dm.cdsPropostas.Open;
   dm.cdsPropostas.EnableControls;
   except
    on e:Exception do
     begin
       dm.ConConcess.RollbackFreeAndNil(DBXTrans);
       raise;
     end;
   end;


todo esse código já é resultado de modificações q tentei fazer para achar uma solução, mas nada até agora; como vcs podem ver, eu gosto de gerar os id´s pelo próprio delphi, no entanto devido ao problema do access violation, resolvi implementar no banco, mas não resolveu, continua a mensagem, e o pior, não é sempre, uma vez aqui e outra acolá, e só na última tabela, a T4.

Não sei mais o q fazer.


Fajo

Fajo

Curtidas 0

Respostas

Elip2008

Elip2008

06/08/2009

vc tem certeza q ker colocá-lo como comentário
// dm.cdsPropostasID_PROPOSTA.AsInteger := dm.GeraId(´SELECT MAX(ID_PROPOSTA) FROM PROPOSTAS´);


GOSTEI 0
Osocram

Osocram

06/08/2009

cara tem q simplificar as coisas qdo ta dando erro...
deixa so uma tabela p ver se da erro.... p ver se é uma tabela especifica ou todas.

como no try exception para trazer o e.message.

passe em qual linha exatamente da o erro.


GOSTEI 0
Mrpostiga

Mrpostiga

06/08/2009

Os dbx não são muito compativeis com o Firebird 2.1.2.

pode ser ai que esteja o problema


GOSTEI 0
Fajo

Fajo

06/08/2009

elip, essa linha foi comentada pois, devido ao erro em questão, modifiquei a forma de incremento q será feita no banco;

osocram, vou colocar o e.message, é incrível, mas não tinha pensado nisso, depois posto o resultado;

postiga, quando se fala em dbx, vc está falando dos componentes ou do driver de acesso, pois estou usano o driver da Corelab.

Obrigado.


GOSTEI 0
POSTAR