Ver Mensaje Individual
  #1  
Antiguo 01-09-2010
afxe afxe is offline
Miembro
 
Registrado: jul 2004
Ubicación: Malaga-España
Posts: 273
Reputación: 20
afxe Va por buen camino
Sobre campos enlazados.

Buen día a todos de los de por aquí.

Uso D7 y FB 2.1. Ahí va mi parrafada, por favor, no se aburran.

A ver si me explico: En un documento de venta de mercancía, con su cabecera de datos comunes y los detalles de los artículos vendidos, uso una tabla de cabecera donde tengo algunos campos, como la fecha de documento, usuario responsable, almacén de mercancía, delegación, vendedor comisionista, código del cliente, etc... que me interesan tenerlos replicados/duplicados en la tabla de detalles de los artículos vendidos, para no tener que hacer joins con la tabla de cabecera cada vez que necesite acceder a esos datos, por ejemplo, para los listados en los que necesito agrupar campos (GROUP BY) por vendedor, cliente, ruta de venta, indicar rango de fechas, o usarlos en los triggers para mantener datos estadísticos.

Si entro en un documento, y cambio, por ejemplo, la fecha, o el vendedor comisionista de la cabecera del documento, debo recorrer todos los detalles reasignando este valor para mantener sincronizada la información y commitearlo todo. Si un procedimiento o un proceso de reasignación cambia o actualiza un dato de la cabecera, tengo que acordarme de recorrer sus detalles cambiando este dato también. No considero esto elegante.

Para mí, lo ideal sería que los campos del fichero de detalle tomaran su valor directamente de la cabecera, una especia de campo COMPUTED BY <Expresion> donde la expresión fuera una SELECT del campo relacionado en la cabecera, y que estuviera disponible para usarlos en índices y agrupaciones, pero hasta lo que conozco, no es posible.

Se han ocurrido varias cosas soluciones:

1. crear un procedimiento que asigne los datos de la cabecera a los detalles cuando ya se han realizado todas las grabaciones y commiteado los datos, procedimiento manual que tengo que acordarme lanzarlo cada vez que se toque alguna cabecera. La desventaja de esto es que los triggers de detalles que actualizan la tabla de comisiones del vendedor, o el stock del almacen, o la estadísticas de venta de clientes, se ejecutan dos veces.
2. En el Trigger BEFORE INSERT OR UPDATE del "FICHERO DETALLE", reasignar los campos NEW.ValoresDeCabecera haciendo una select de los datos de la cabecera, pero esto tiene el problema que si no toco ningún campo del detalle y SÍ cambio valores en la cabecera, el trigger de detalles nunca se ejecuta y quedaría desincronizado cabecera-detalles.
3. En el trigger AFTER INSERT OR UPDATE de cabecera, actualizar los campos del detalle... esto es muy mala idea, pues cuando se comitea la cabecera puede que los detalles no se hayan grabado, conflictos de bloqueo, datos que se machacan cuandos se envian los detalles después, etc....
4. FOREING KEYS multicampo con la opcion ON UPDATE CASCADE, esa solución parece buena, fiable y rápida, pero tengo un pequeño problema de diseño: El mismo fichero de detalles esta relacionado con varias cabeceras diferentes, para cada registro de detalles hay dos campos: TIPO_CABECERA (indica el fichero cabecera) y CODIGO_CABECERA (indica el registro dentro de esa cabecera), luego el campo FECHA_DOCUMENTO será clave foránea de un CABECERA_VENTAS, o CABECERA_CARGA, o CABECERA_COMPRAS, o CABECERA_INVENTARIO... dependiendo del valor del campo TIPO_CABECERA mmmmh creo que tampoco se puede hacer.

Bueno... ¿Qué pensais? ¿Cómo lo haceis vosotros? ¿qué opción no he barajado?

Si habeis leido hasta aquí, os felicito y alabo vuestra paciencia.

Saludos.
__________________
Amar al mundo apasionadamente.
Responder Con Cita