Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-09-2010
afxe afxe is offline
Miembro
 
Registrado: jul 2004
Ubicación: Malaga-España
Posts: 273
Poder: 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
  #2  
Antiguo 01-09-2010
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
Pienso que lo mejor es un triger en la cabecera que actualice la tabla detalle.
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
Recorrer controles enlazados a una TDataSource Juandedian OOP 2 05-02-2008 20:06:10
Reportes no enlazados a datos !!!!!!!! david_uh Varios 3 27-07-2007 21:02:54
2 Combobox enlazados molinero1 Varios 3 16-04-2007 20:10:48
Componentes enlazados @le Varios 6 31-08-2005 16:18:10
combos enlazados con mysql camc79 PHP 4 18-02-2005 15:09:32


La franja horaria es GMT +2. Ahora son las 23:34:07.


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