Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-10-2019
Gregorio Cíber Gregorio Cíber is offline
Miembro
 
Registrado: jun 2008
Posts: 98
Poder: 16
Gregorio Cíber Va por buen camino
Saber si un registro de una tabla está siendo utilizado en otras.

Hola amigos.
Necesito saber si un determinado registro de una tabla está siendo utilizado en otra u otras para que, si no así, borralo.

Intentaré explicarme.

La aplicación delphi (y la BD Firebird 3.0) genera un código de lote por cada artículo cuando se recibe la mercancia, crea el registro con el lote en su tabla correspondiente (llamémosla TBL_LOTES) y anota su referencia en la tabla de líneas de albaranes de proveedor.

La referencia del lote se utiliza, lógicamente, en la tabla anterior, pero también en la de líneas de albaranes de cliente, traspaso de existencias, regularización, etc.

Para que no se llene TBL_LOTES con aquellos que, habiendo sido creados ya no están referenciados en ninguna otra tabla, quiero que se compruebe esto y, si es así, se borren.

Para ello he creado un trigger en TBL_LOTES que despues de modificar analiza tabla por tabla si el lote está refenciado en ellas para tomar la determinación de borrarlo o no. Pero esto, además de lento, lo veo poco elegante razón por la cual solicito ayuda por si alguien tiene una solución mejor.

Espero haberlo explicado bien. Gracias anticipadas.
Responder Con Cita
  #2  
Antiguo 01-10-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Gregorio Cíber Ver Mensaje
Espero haberlo explicado bien. Gracias anticipadas.
Me parece que no.
Un lote de una cantidad de cierto artículo que luego se van vendiendo. Cuando se han vendido todas las unidades de ese lote, ¿por qué ibas a borrarlo?
En todo caso, puedes poner campos: cantidad, cantidadvendida (stock del lote sería cantidad - cantidadvendida). Si es cero es que no quedan.

También puedes poner si quieres un campo "todovendido" 1.true 0.false para cuando se venda todo.
También... bueno, es que no sé exactamente qué problema es y qué quieres conseguir.
Responder Con Cita
  #3  
Antiguo 01-10-2019
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Gregorio Cíber Ver Mensaje
Necesito saber si un determinado registro de una tabla está siendo utilizado en otra u otras para que, si no así, borralo.

¿Tal vez es demasiado simple, pero no puedes utilizar una clave foránea para eso?
Saber si "alguien" lo está usando ya te lo da la propìa "Foreign Key".
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 01-10-2019
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por Gregorio Cíber Ver Mensaje
Pero esto, además de lento...
Siempre suena sospechoso cuando de habla de "lento". Es que es REALMENTE lento o solo te parece?

---

Si mal no entiendo, estas haciendo un workflow. En términos de negocios, las operaciones destructivas no son ideales, es mejor ir guardando el historico de las acciones (por ejemplo, yo guardo en la BD un log con TODAS las operaciones contra TODAS las tablas. Que ese log tiene 500.000 registros? Y eso que? no es lento). Un workflow se maneja en terminos simples con "estados". Yo tengo uno para los pedidos/facturas que mueve de "Borrador" -> "Enviado" -> "Procesado" -> "Pagado" y es solo un campo extra.


Ademas, la forma como planteas parace un diseño poco ortodoxo. Mira mejor como se diseña un sistema con inventario. Ten en cuenta que si hablamos de NEGOCIOS hay ciertas reglas contables y legales que debes tener en cuenta (de ahi la importancia de almacenar los movimientos y RARAMENTE hacer borrados. Yo solo dejo borrar pedidos si estan en "Borrador", por ejemplo.)
__________________
El malabarista.
Responder Con Cita
  #5  
Antiguo 01-10-2019
Gregorio Cíber Gregorio Cíber is offline
Miembro
 
Registrado: jun 2008
Posts: 98
Poder: 16
Gregorio Cíber Va por buen camino
En primer lugar gracias a Casimiro, Neftalí y mamcx por responder.

En segundo, me parece que no expresé bien la idea. A ver si ahora lo consigo.

Es evidente que si se crea un lote y se utiliza no se debe borrar, de hecho no lo permito. También es cierto que no importa mucho, desde el punto de vista de la BD, el tamaño que adquiera la tabla de lotes. Entonces, ¿para qué plantearse el asunto de borrarlos?. Pues por una razón. Para que no aparezcan lotes que no se han utilizado, teniendo en cuenta que dije que se creaban cuando se recibe la mercancía de forma automática para cada una de las lineas del detalle con un código único. Si una línea de esta tabla se borra sin que el tote haya sido utilizado, debería eliminarse puesto que ya no tiene sentido mantenerlo.

Dicho esto, lo que yo planteaba es poder saber si el lote ha sido refenciado en alguna tabla de las que lo pueden utilizar sin tener que ir mirándolo en cada una de ellas.

Creo que ahora me ha salido algo mejor la explicación.
Gracias amigos.
Responder Con Cita
  #6  
Antiguo 01-10-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Creo que estamos igual
Si entra un lote de artículos de un proveedor (se use o no se use), está ahí en el almacén, ¿se ignoran? No se entiende.
Y en todo caso, la respuesta de Neftalí sería la que estás buscando, por algo Firebird es un gestor de bases de datos relacionales, si se hiciera uso del lote, su código referenciado haría relación a esa línea de lote, si intentaras borrarlo entonces la BD no te dejaría.
Lee esto.
Responder Con Cita
  #7  
Antiguo 02-10-2019
Gregorio Cíber Gregorio Cíber is offline
Miembro
 
Registrado: jun 2008
Posts: 98
Poder: 16
Gregorio Cíber Va por buen camino
Casimiro, gracias por responder.

No obstante el asunto no va por ahí. Seguiré con lo que tengo hecho, que funciona, y si encuentro otra solución más 'elegante' la aportaré por si le sirve a alguien.

Saludos.
Responder Con Cita
  #8  
Antiguo 02-10-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Creo que sí va por ahí , lee lo que te he comentado antes, esto.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como Saber si una fecha está entre otras dos fechas davidmedina29 Varios 16 18-02-2016 17:38:21
Saber si un registro esta utilizado por una transaccion... Jose Roman Firebird e Interbase 0 28-10-2010 18:38:38
Saber si un registro en un ClientDataset ya está en la BD droguerman OOP 3 22-03-2010 17:40:55
Saber si un Tabla(dataset) esta siendo usado por otro componente cacuna OOP 3 26-05-2004 18:21:43
Quiero Saber como hacer que un boton se vea que esta siendo pulsado Julio César Varios 2 27-11-2003 18:34:11


La franja horaria es GMT +2. Ahora son las 22:03:14.


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