![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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. |
#2
|
||||
|
||||
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.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#3
|
||||
|
||||
Cita:
¿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. |
#4
|
||||
|
||||
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. |
#5
|
|||
|
|||
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. |
#6
|
||||
|
||||
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.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#7
|
|||
|
|||
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. |
#8
|
||||
|
||||
Creo que sí va por ahí
![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
![]() |
|
|
![]() |
||||
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 |
![]() |
|