PDA

Ver la Versión Completa : Saber si un registro de una tabla está siendo utilizado en otras.


Gregorio Cíber
01-10-2019, 00:46:56
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.

Casimiro Notevi
01-10-2019, 11:16:03
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.

Neftali [Germán.Estévez]
01-10-2019, 13:49:12
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".

mamcx
01-10-2019, 16:54:20
Pero esto, además de lento...


Siempre suena sospechoso cuando de habla de "lento". Es que es REALMENTE lento o solo te parece (http://www.clubdelphi.com/foros/showthread.php?t=93348)?

---

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.)

Gregorio Cíber
01-10-2019, 19:10:40
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.

Casimiro Notevi
01-10-2019, 19:17:12
Creo que estamos igual :D
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 (https://firebird21.wordpress.com/2013/05/26/entendiendo-a-las-foreign-keys/).

Gregorio Cíber
02-10-2019, 21:11:32
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.

Casimiro Notevi
02-10-2019, 22:32:53
Creo que sí va por ahí :D, lee lo que te he comentado antes, esto (https://firebird21.wordpress.com/2013/05/26/entendiendo-a-las-foreign-keys/).