Ver Mensaje Individual
  #1  
Antiguo 02-05-2007
Avatar de morta71
morta71 morta71 is offline
Miembro
 
Registrado: may 2006
Ubicación: Girona - España
Posts: 30
Reputación: 0
morta71 Va por buen camino
Diseño/ejecución maestro/detalle

Hola a todos.

Actualmente estoy enfrascado en un programa con tablas maestro detalle, ya tuve algún problema con claves foráneas que quedó solucionado con la ayuda de algunos foreros (hilo http://www.clubdelphi.com/foros/showthread.php?t=41997).

Según he etado leyendo sobre diseño de Bases de Datos, en teoría, si no entendí mal, un diseño de tablas maestro-detalle como el que describo a continación sería correcto.

Código SQL [-]
  CREATE TABLE VENTAS (
       ID INTEGER NOT NULL,
       IDCLI INTEGER NOT NULL,
       FECHA DATE
  );
  
  CREATE TABLE LINEAS (
       IDVENTA INTEGER NOT NULL,
       LINEA INTEGER NOT NULL, 
       REFERENCIA VARCHAR(10), 
       DESCRIPCION VARCHAR(20), 
       CANTIDAD FLOAT, 
       IMPORTE FLOAT
  );
  
 ALTER TABLE MASTER ADD CONSTRAINT PK_VENTAS PRIMARY KEY (ID);
 ALTER TABLE LINEAS ADD CONSTRAINT PK_LINEAS PRIMARY KEY (IDVENTA, LINEA);
 ALTER TABLE LINEAS ADD CONSTRAINT RELATION_200 FOREIGN KEY (IDVENTA) REFERENCES VENTAS (ID);

El campo ID de VENTAS hace las veces de número de factura / albarán / pedido o similar, por lo que su asignación estaría reservada para el final, al momento que se acepta la venta, en el momento del commit, ya que si se asigna al inicio y la venta no es aceptada, pueden quedar huecos en el número de VENTA asignado si hay otras ventas simultáneas (no sé si me explico bien ).

Las dudas que me corroen son:

a) si ID = NULL hasta el final, se producirán errores en la inserción de lineas detalle FOREING KEY

b) puedo poner ID = 0 y al final actualizarlo, no queda muy elegante, pero ¿como actualizo el detalle si ambas consultas están enlazadas por ID?, para realizar esto último ¿habría que desvincular las consultas?, ¿actualización en cascada?

c) o en todo caso debería trabajar con controles no asociados a datos y sustituir el DBGrid del detalle por un TStringGrid y al finalizar volcar todo a la BD. ¿Es practico teniendo en cuenta que pueden haber 2, 20 ó 100 líneas (por exagerar un poco)?

d) el diseño de las tablas es incorrecto

No sé como actuar, ¿qué opciones utilizais en éstos casos?

Gracias
Responder Con Cita