Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-12-2005
alfil123 alfil123 is offline
Miembro
 
Registrado: nov 2005
Posts: 116
Poder: 19
alfil123 Va por buen camino
eliminacion de tablas relacionada

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
Responder Con Cita
  #2  
Antiguo 18-12-2005
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 18-12-2005
alfil123 alfil123 is offline
Miembro
 
Registrado: nov 2005
Posts: 116
Poder: 19
alfil123 Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 18-12-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Cita:
Empezado por alfil123
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:

Código Delphi [-]
if Qry.Count > 0 then
begin
   //lo que quieres hacer
   ....
end;

__________________
No todo es como parece ser...
Responder Con Cita
  #5  
Antiguo 18-12-2005
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Cita:
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #6  
Antiguo 19-12-2005
Avatar de __hector
[__hector] __hector is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Santo Domingo, Rep. Dom.
Posts: 1.075
Poder: 23
__hector Va por buen camino
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.
__________________
Héctor Geraldino
Software Engineer
Responder Con Cita
  #7  
Antiguo 30-08-2006
Avatar de acastillo
acastillo acastillo is offline
Registrado
 
Registrado: ago 2006
Posts: 4
Poder: 0
acastillo Va por buen camino
Como capturar errores personalizados de Ms SQL desde un TQuery

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
Responder Con Cita
  #8  
Antiguo 04-09-2006
avmm2004 avmm2004 is offline
Miembro
 
Registrado: jun 2006
Ubicación: Santa cruz de Tenerife, Islas Canarias
Posts: 500
Poder: 18
avmm2004 Va por buen camino
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.
Responder Con Cita
  #9  
Antiguo 04-09-2006
Avatar de acastillo
acastillo acastillo is offline
Registrado
 
Registrado: ago 2006
Posts: 4
Poder: 0
acastillo Va por buen camino
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 01:38:27.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi