Ver Mensaje Individual
  #2  
Antiguo 03-05-2007
afxe afxe is offline
Miembro
 
Registrado: jul 2004
Ubicación: Malaga-España
Posts: 273
Reputación: 20
afxe Va por buen camino
Eterno dilema

Hola.

Efectivamente, el diseño que planteas te puede traer algunos dolores de cabeza. Te podría contestar una a una tus dudas, pero mejor te digo el método que utilizo y menos problemas me ha dado.
Atendiendo a las reglas de ingeniería del software, cada tupla (registro) de una tabla debe tener un identificador único (preferiblemente integer), que deberá ser su clave primaria. Es no quiere decir que no puedas tener otras claves únicas.

Te propongo esta estructura:
Código SQL [-]
CREATE TABLE VENTAS (
       ID                        INTEGER NOT NULL,
       NUMERO_DOCUMENTO  INTEGER NOT NULL
       IDCLIENTE             INTEGER NOT NULL,
       FECHA DATE
  );
  
  CREATE TABLE LINEAS (
       ID                        INTEGER NOT NULL
       IDVENTA               INTEGER NOT NULL,
       LINEA                   INTEGER NOT NULL, 
       REFERENCIA          VARCHAR(10), 
       DESCRIPCION        VARCHAR(20), 
       CANTIDAD             FLOAT, 
       IMPORTE               FLOAT
  );
  
 ALTER TABLE VENTAS ADD CONSTRAINT PK_VENTAS PRIMARY KEY (ID);
 ALTER TABLE LINEAS ADD CONSTRAINT PK_LINEAS PRIMARY KEY (ID);
 
CREATE UNIQUE INDEX IDX_LINEAS1 ON LINEAS (IDVENTA, LINEA);
 
 ALTER TABLE LINEAS ADD CONSTRAINT RELATION_200 FOREIGN KEY (IDVENTA) REFERENCES VENTAS (ID);

También crearía unos GENERATOR para los ID de cada tabla, pero eso ya como tú prefieras. La manera de programar sería la siguiente:

Dar de alta el registro de cabecera (maestro) y generar un identificador único para esa cabecera, sin importarte si se deja el hueco o no por cancelación. Abrir la tabla de detalles en modo Cache o bajo una transacción, y asignar al IDVENTAS el ID generado del Maestro en cada alta en Detalle. Antes de confirmar la venta, sacar el número consecutivo para el campo NUMERO_DOCUMENTO según el tipo de documento (según has comentado) y actualizar dicho contador.
Trabajarás con 'códigos internos' de manera que el nº de factura o pedido se genera cuando se confirme la entrada. Además cuentas con la ventaja de poder realizar fácilmente cambios en la numeración de facturas/albaranes, ya que dicha renumeración no afecta a los detalles.

También es bueno que los detalles tengan un identificador único por si luego tienes que hacer referencia a alguna línea de detalles, por ejemplo, para enlazar lineas de albaranes de compra con las líneas de pedidos a proveedores. Si usas claves compuestas terminas teniendo que crear un chorro de campos cada vez que quieres enlazar un registro con otro.

Saludos.
Responder Con Cita