Erro tentando eliminar registro no SQL SERVER com DBExpress

Delphi

21/09/2006

Pessoal, estou desenvolvendo utilizando o BDS 2006 com DBExpress e driver para SQL SERVER (SQLDataSet + DataSetProvider + ClientDataSet). Ocorre que notei um certo problema a uns dias atrás.

Imaginem a seguinte situação:

Tabela de Clientes
Tabela de Pedidos

A tabela de clientes se relaciona com a tabela de pedidos de forma que não poderá haver pedido sem um cliente registrado, sendo assim não é possível eliminar o cliente se este possuir pedidos.

O usuário tenta eliminar um cliente que possua pedido(s) e gera uma mensagem do tipo ´Access violation ... in module ´dbxmss30.dll´´, o normal seria o delphi me mostrar e mensagem completa retornada pelo banco na qual constaria qual FK iria ser violada se determinado registro fosse excluído, assim eu poderei retornar uma mensagem personalizada para o usuário explicando o porque da não exclusão do registro, porem gera o access violation nestes casos. Caso a tentativa de exclusão seja num registro que não tenha lançamentos na outra tabela então exclui normalmente.

Desde já agradeço a atenção,


Andreaskaquino

Andreaskaquino

Curtidas 0

Respostas

Marco Salles

Marco Salles

21/09/2006

O usuário tenta eliminar um cliente que possua pedido(s) e gera uma mensagem do tipo ´Access violation ... in module ´dbxmss30.dll´´,


voce que personalizar esta mensagem ?????

o normal seria o delphi me mostrar e mensagem completa retornada pelo banco na qual constaria qual FK iria ser violada se determinado registro fosse excluído, assim eu poderei retornar uma mensagem personalizada para o usuário explicando o porque da não exclusão do registro,




Use o ReconcileError do ClientDataset e trate o E.message para personalizar a mensagem


GOSTEI 0
Marco Salles

Marco Salles

21/09/2006

O usuário tenta eliminar um cliente que possua pedido(s) e gera uma mensagem do tipo ´Access violation ... in module ´dbxmss30.dll´´,


voce que personalizar esta mensagem ?????

o normal seria o delphi me mostrar e mensagem completa retornada pelo banco na qual constaria qual FK iria ser violada se determinado registro fosse excluído, assim eu poderei retornar uma mensagem personalizada para o usuário explicando o porque da não exclusão do registro,




Use o ReconcileError do ClientDataset e trate o E.message para personalizar a mensagem


GOSTEI 0
Andreaskaquino

Andreaskaquino

21/09/2006

Caro Marco, eu já estou usando uma função no evento OnReconcileError para personalizar as mensagens exibidas ao usuário no caso de eventuais erros como por exemplo o erro de violação da chave estrangeira informando ao mesmo o pq não é possível fazer uma exclusão de registro. Porem o programa não chega a passar na função, ao invez disso acaba gerando um ´Access Violation...´ na ´dbxmss30.dll´.

Grato,


GOSTEI 0
Luis Lambranho

Luis Lambranho

21/09/2006

Desculpem ressuscitar o tópico... mas alguém conhece uma solução para esse problema?
GOSTEI 0
Andreas Aquino

Andreas Aquino

21/09/2006

Na ocasião só consegui resolver o problema controlando a violação de chave estrangeira antes da exclusão. Creio que tenha sito problema com o driver DBX para SQLSERVER. Controlando a violação de chaves antes de excluir não tive nenhum outro problema.
GOSTEI 0
Luis Lambranho

Luis Lambranho

21/09/2006

Na ocasião só consegui resolver o problema controlando a violação de chave estrangeira antes da exclusão. Creio que tenha sito problema com o driver DBX para SQLSERVER. Controlando a violação de chaves antes de excluir não tive nenhum outro problema.


Obrigado pela atenção, ANDREAS.

Consegui resolver a pouco.
Eu tinha duas versões do firebird instalado na minha máquina e estava dando algum conflito. Foi só desinstalar a versão do FB que não estava usada e colocar a FBCLIENT correta que tudo funcionou belezinha.


GOSTEI 0
POSTAR