Mestre-detalhe não deleta registro
Pessoal Ajudem por favor
Tenho um mestre-detalhe IBDataset(mestre) e IBTable(detalhe) em sistema de estoque. Quando da emissão do cupom caso tenha que que excluir um item o sistema faz tudo certo o cupom é emitido sem aquele item que foi apagado e tudo joinha. Mas o registro que foi apagado na aplicação ainda está no banco e não se apaga de jeito nenhum, já fiz de tudo que esperava dar certo e nada.
segue parte do código:
procedure TfrmTelaPDV.editExcluirExit(Sender: TObject);
begin
if dm2.cds_Detalhe.Locate('item', editExcluir.Text, []) then //// operador informa o item do cupom para excluir
begin
if MessageDlg('Confirma a Exclusão do Item?',mtConfirmation, [mbYes,mbNo],0)= mrYes then
begin
MemoEditExcluido(); ///insere linha de dedução do item no cupom
dm2.cds_detalhe.Delete; /// deleta o item mas antes devolve o item ao estoque e recalcula os valores do cupom tudo ok
end;
end
else
ShowMessage('Item não Encontrado');
telaExcluirItem.Visible := false;
EdtCodProd.SetFocus;
end;
Ao final o registro ainda está no banco, não foi apagado fisicamente;
já coloquei logo abaixo dm1.IBTrans2.CommitRetaining; mas também não resolve.
Me ajudem por favor.
Delphi7 / Firebird 2.5 / IBExpert
Tenho um mestre-detalhe IBDataset(mestre) e IBTable(detalhe) em sistema de estoque. Quando da emissão do cupom caso tenha que que excluir um item o sistema faz tudo certo o cupom é emitido sem aquele item que foi apagado e tudo joinha. Mas o registro que foi apagado na aplicação ainda está no banco e não se apaga de jeito nenhum, já fiz de tudo que esperava dar certo e nada.
segue parte do código:
procedure TfrmTelaPDV.editExcluirExit(Sender: TObject);
begin
if dm2.cds_Detalhe.Locate('item', editExcluir.Text, []) then //// operador informa o item do cupom para excluir
begin
if MessageDlg('Confirma a Exclusão do Item?',mtConfirmation, [mbYes,mbNo],0)= mrYes then
begin
MemoEditExcluido(); ///insere linha de dedução do item no cupom
dm2.cds_detalhe.Delete; /// deleta o item mas antes devolve o item ao estoque e recalcula os valores do cupom tudo ok
end;
end
else
ShowMessage('Item não Encontrado');
telaExcluirItem.Visible := false;
EdtCodProd.SetFocus;
end;
Ao final o registro ainda está no banco, não foi apagado fisicamente;
já coloquei logo abaixo dm1.IBTrans2.CommitRetaining; mas também não resolve.
Me ajudem por favor.
Delphi7 / Firebird 2.5 / IBExpert
Marcos Roberto
Curtidas 0
Respostas
Thiago Santana
09/04/2015
MRoberto, a aplicação retorna algum erro?
GOSTEI 0
Marcos Roberto
09/04/2015
Não nenhum. Só fico sabendo quando imprimo relatório das vendas por produtos, então todos os produtos excluidos aparecem.
Outra coisa é que o arquivo mestre está correto seus valores, digo já sem os produtos excluidos.
Outra coisa é que o arquivo mestre está correto seus valores, digo já sem os produtos excluidos.
GOSTEI 0
Marisiana Battistella
09/04/2015
Se deletar o registro diretamente no banco de dados, ele é excluido?
GOSTEI 0
Marcos Roberto
09/04/2015
Sim. Pelo IBExpert tenho como deletar sem problema.
GOSTEI 0
Marisiana Battistella
09/04/2015
Demorei mas voltei.... MRoberto, você conseguiu resolver?
Adquiri pouca experiência me programação com Delphi, mas a causa mais provável é que a inserção não esteja sendo efetuada de fato.
Você chegou a testar linha a linha para verificar se as informações estão sendo buscadas corretamente?
Lembro que existe um recurso para fazer esse tipo de verificação...
Adquiri pouca experiência me programação com Delphi, mas a causa mais provável é que a inserção não esteja sendo efetuada de fato.
Você chegou a testar linha a linha para verificar se as informações estão sendo buscadas corretamente?
Lembro que existe um recurso para fazer esse tipo de verificação...
GOSTEI 0
Marcos Roberto
09/04/2015
Marisiana,
Como disse, em tempo de execução tudo dá certo, o cupom sai sem o item excluido. O relatorio das vendas sai correto, somente se voce for listar todos os itens daquele cupom o excluido aparece, por estar no banco.
Não sei mais o que fazer, somente um expert em BD poderá dizer o que está acontecendo.
Muito agradecido;
Como disse, em tempo de execução tudo dá certo, o cupom sai sem o item excluido. O relatorio das vendas sai correto, somente se voce for listar todos os itens daquele cupom o excluido aparece, por estar no banco.
Não sei mais o que fazer, somente um expert em BD poderá dizer o que está acontecendo.
Muito agradecido;
GOSTEI 0
Marisiana Battistella
09/04/2015
Mas é por essas razão que a exclusão não deve estar sendo efetivada no banco.
Verifica se após emitir esse cupom não está sendo realizado um rollback.
Verifica se após emitir esse cupom não está sendo realizado um rollback.
GOSTEI 0
Marcos Roberto
09/04/2015
... após a deleção dou CommitRetaining, nunca uso rollback.
valeu.
valeu.
GOSTEI 0
Marisiana Battistella
09/04/2015
Mas CommitRetaining não a mantém a transação aberta?
GOSTEI 0
Marisiana Battistella
09/04/2015
Encontrei essa explicação na web:
No Commit a transação é gravada e encerrada, sendo necessário startar novamente para uma nova sequência de comandos.
No CommitRetaining a transação é gravada, mas continua aberta, não sendo necessário restartar.
No CommitRetaining a transação é gravada, mas continua aberta, não sendo necessário restartar.
GOSTEI 0
Marcos Roberto
09/04/2015
... Então se vc der o commit as entidades serão todas fechadas e em tempo de execução no meio de uma venda se vc fizer isto perde todo o serviço. O CommitRetaing encerra a transação, ou seja garante a gravação dos mesmos e vc continua acessando todas as entidades sem problema.
Valeu..
Valeu..
GOSTEI 0
Marisiana Battistella
09/04/2015
Certo, entendido.
Então, no teu caso, como não está excluindo o item do banco de dados, em algum momento está precisando realizar o COMMIT para efetivar a deleção do registro.
Então, no teu caso, como não está excluindo o item do banco de dados, em algum momento está precisando realizar o COMMIT para efetivar a deleção do registro.
GOSTEI 0
X Me
09/04/2015
Você esta utilizando dataSetProvider?? Se sim, você precisa alterar a propriedades poCascadeDelete para True, ou seja, habilitar ela. Mesma coisa ocorre para a propriedade poCascadeUpdade. Ambas estão dentro de options.
Assim quando você alterar ou apagar algum registro o mestre detalhe também apaga os filhos desse registro.
Assim quando você alterar ou apagar algum registro o mestre detalhe também apaga os filhos desse registro.
GOSTEI 0
Marcos Roberto
09/04/2015
xkEY
Estou usando IBDataSet (mestre) e IBTable (detalhe) será que tem que habilitar também algum evento?
Obrigado !
Estou usando IBDataSet (mestre) e IBTable (detalhe) será que tem que habilitar também algum evento?
Obrigado !
GOSTEI 0