PDA

Ver la Versión Completa : eliminacion de tablas relacionada


alfil123
18-12-2005, 00:17:17
hola denuevo, tengo que eliminar un registro que esta relacionado con con otra tabla, simpre que trato de eliminar un registro me vota que no se puede, esta pensando que deberia elimiar primero de la tabla que esta relacionada ,pero me gustaria que el programa mande un mensajequeno se puede eleminar.
grasias

marcoszorrilla
18-12-2005, 11:40:31
Pues tendrás que decir con que tipo de tablas estás trabajando, porque en definitiva se trata de capturar el mensaje que envía el motor y sustituirlo por otro a nuestra medida.

Una solución alternativa puede ser buscar este registro en la tabla maestra y si aparece alguna relación enviar nosotros nuestro mensaje, de esta manera al no intentar eliminar nada no dependeríamos del mensaje que envíe el motor....

Un Saludo.

alfil123
18-12-2005, 17:04:49
Pues tendrás que decir con que tipo de tablas estás trabajando, porque en definitiva se trata de capturar el mensaje que envía el motor y sustituirlo por otro a nuestra medida.

Una solución alternativa puede ser buscar este registro en la tabla maestra y si aparece alguna relación enviar nosotros nuestro mensaje, de esta manera al no intentar eliminar nada no dependeríamos del mensaje que envíe el motor....

si, discupa pero nose donde indico conque tabla estoy trabajando y como sustituyo el mensaje del motor.
y en la segunda alternativa, tendria que hacer un conteo del numero de registros que se relaciones con el registro que pretendo eliminar, y si es el conteo es mayor a cero emvio el mensaje, en caso contrario elimino, ¿como hago el conteo de estamanera ? o porfavor indicame si lo que pretengo esta mal.

lucasarts_18
18-12-2005, 17:14:50
la segunda alternativa, tendria que hacer un conteo del numero de registros que se relaciones con el registro que pretendo eliminar, y si es el conteo es mayor a cero emvio el mensaje, en caso contrario elimino, ¿como hago el conteo de estamanera ?
Así se hace:


if Qry.Count > 0 then
begin
//lo que quieres hacer
....
end;


:rolleyes:

marcoszorrilla
18-12-2005, 17:20:21
Pues tendrás que decir con que tipo de tablas estás trabajando
Pues esto era símplemente una pregunta, quería decir que debes de decirnos con que tipo de tablas y motor trabajas porque la solución puede variar de uno a otro.

En cuanto a la solución propuesta por mí eludiendo el tipo de tablas, aunque lucasarts_18 ya te han dado una respuesta válida, la que yo te apuntaba aún sin decirte exactamente como llevarla a cabo, es que:
1.- El usuario selecciona un registro de la tabla maestra y pretende eliminarlo.
2.- Lanzamos una búsqueda, teniendo índices, cosa imprescindible para establecer la relación maestro/detalle, buscamos un registro con la misma clave en la table detalle, si lo encontramos (décimas de segundo), lanzamos mensaje, "Imposible eliminar registro - posee relación en la tabla xxx".

De esta manera te ahorras lanzar un conteo SQL, que sería algo más lento.

Un Saludo.

__hector
19-12-2005, 05:40:01
Yo no entendi bien el planteamiento de la pregunta. Dices que quieres eliminar un registro de una tabla maestro, que tiene asociado uno o varios registros en una tabla detalle, pero que cuando quieres hacerlo te "bota" con un mensaje de que no puedes hacerlo sin borrar primero el detalle. Al mismo tiempo, quieres notificarle al usuario que no se puede borrar el registro (que es lo mismo que te dice la excepcion).

En fin, si lo que quieres es presentar un error amigable cuando se produzca una excepcion, puedes usar un bloque try/except/finally, capturar el error, verificar que el error es el que esperas, y presentar un mensaje mas familiar.

acastillo
30-08-2006, 05:36:53
A proposito del manejo de errores del motor, yo trabajo con Ms SQL Server 2000 y Delphi 7, por diseño de la aplicación, hay muchos procedimientos que se ejecutan en el lado del servidor y me regresan mensajes o errores personalizados a traves de RAISERROR (como "Excedería el límite de crédito").

Lo que me gustaría hacer, es capturar el mensaje exactamente como me lo manda Ms SQL, y formatearlo para mostrarlo en un messagebox mas amigable que el que sale por defecto... lo mismo para el manejo de los foreing key.

Ya intenté interceptar el error en OnUpDateError, sin embargo el errorcode y el message, corresponden a la lista de errores del BDE y no es lo que me está mandando el MsSQL.

La pregunta concreta es: ¿Hay alguna variable como E.Message pero que me traiga el error de Ms SQL y no del BDE?

Alguna idea?

De antemano, muchas gracias

avmm2004
04-09-2006, 18:32:31
Realmente no se si he entendido lo que dices pero....
Si quieres borrar un registro de una tabla maestra y tiene registros asociados en una tabla de detalle (es decir una foreign key) yo que tu utilizaria en la clave - on delete cascade - para que ademas me borre el detalle al borrar el maestro y mediante trigers de la base de datos en el before delete del detalle haria lo que tuviera que hacer con cada linea de detalle (¿ acumular / restar totales .........). Esto requiere un mensaje crítico de cara al usuario (ejemplo de cabecera de facturas con lineas de factura) respecto a lo que va a pasar y que lo confirme. De esta manera te aseguras de no dejar lineas de detalle sin maestro.

Todo esto presuponiendo que utilizas una base de datos relacional (oracle, sql server, interbase, ....), no ficheros planos. (paradox, .....)
Veo logico que si el cliente quiere borrar ¿una factura ? no le de el latazo diciendole que la factura tiene lineas y que no la puede borrar o le de un mensaje ¿criptico ?.

Espero haberte ayudado, aunque no se si era eso lo que tu preguntabas realmente.

acastillo
04-09-2006, 19:05:58
No amigo, creo que no me explique bien.

En mi mensaje dice que uso Ms SQL 2000 (Base de datos relacional), y la pregunta no es como borrar tablas relacionadas, sin embargo si dice literalmente:

La pregunta concreta es: ¿Hay alguna variable como E.Message pero que me traiga el error de Ms SQL y no del BDE?

Puse el ejemlo del foreing key, únicamente porque cuando ocurre esto, SQL manda el error 176X con un mensaje determinado, pero en e.message se recibe un error (creo) 9000 que viene del BDE y obviamente la descripción no concuerda


Saludos y de cualquier forma, muchas gracias por tu respuesta