PDA

Ver la Versión Completa : maestro/detalle con temporales


anubis
08-06-2012, 15:28:41
Hola amigos,

Tengo una relación maestro/detalle que funciona bien salvo a la hora de insertar nuevos registros.

La pregunta es si al insertar un nuevo registro en la tabla maestra y que no existe en la detalle hasta que complete el registro, para evitar errores si es perfectamente valido usar una tabla temporal para la de detalle y despues pasar esos registros.

O de que otra forma se podría hacer.

tablas:

maestra

facturas
--------
numfactura
coddetalle
...

lineasfactura
------------
numfactura
lineasdetalle

gracias

Casimiro Notevi
08-06-2012, 16:04:02
Depende cómo tengas hecho ese maestro/detalle.
Si es un select del detalle mediante el un campo del maestro, entonces simplemente no aparecerá nada en el detalle (obviamente), por lo que no hay nada que hacer, todo perfecto.

EDITO: creo que dices que das de alta el maestro cuando has dado de alta algo en el detalle. No es un buen método, debes dar de alta primero el maestro, sería lo idóneo.

anubis
08-06-2012, 19:16:08
Gracias por responder casimiro ;).

Como estoy haciendo una prueba, tengo todas las relaciones asignadas en el inspector de objetos, y para ver si funciona (uso sqlite), desde un sqlite manager "meti" los datos a mano, esto es, 2 numeros de factura en el maestro y varios registros en el detalle asignando amano el numero de factura

tablas:

maestra

facturas
--------
numfactura
coddetalle
...

lineasfactura
------------
numfactura
lineasdetalle

ya en el programa usando un dbgrid, al insertar un nuevo registro, debido a la relacion que ya tiene maestro/detalle, me aparecen los detalles

Casimiro Notevi
08-06-2012, 19:39:28
Quieres decir entonces que funciona bien, no?

anubis
08-06-2012, 20:10:24
funciona bien sino añado nada, solo consultas.

Lo que queria es añadir registros al maestro y al detalle, pero en detalle, el codigo de la factura todavia no existe porque no se dio de alta primero.

La pregunta es si para el detalle puedo hacer una tabla temporal para despues pasarla ya con todo, o no es una forma normal de hacerlo?.
O como lo haces tu.

gracias

Casimiro Notevi
08-06-2012, 20:56:15
Primero se da de alta el "maestro" y luego los "detalles", no puede ser de otra forma sin son tablas relacionadas.
En todo caso, si termina sin dar de alta ningún "detalle", puedes borrar el "maestro", si quieres.
Realmente no se puede dar muchos consejos de un sistema que no se tiene ni idea de lo que hace, ni cómo lo hace, ni lo que quieres hacer en cuanto a su funcionamiento se refiere :)

anubis
08-06-2012, 22:39:39
gracias.
El sistema es simplemente dar de alta una factura por numero de factura, y luego en otra tabla las lineas que contiene esa factura con su precio y demas.

Digo yo que es una relacion maestro/detalle normal y si funciona mi problema era, como a cualquiera, el insertar nuevos registros en el maestro y el detalle.

Tal y como lo planteas, si es así como debe ser no tengo por que usar una tabla temporal.

Estoy en lo correcto a la hora de trabajar con maestro/detalle?.

Documentacion de maestro/detalle sobre relacion si hay, inclusive en este foro, pero de insertar nuevos registros no he conseguido nada.

Gracias amigo casimiro por arrojarme luz.

Casimiro Notevi
08-06-2012, 22:52:20
Una relación maestro->detalle es una relación "uno a muchos". Lo normal es tener un campo por el que están relacionadas ambas tablas.
En el caso de facturas es aconsejable que sea por un campo código que no sea el número de la factura, ¿por qué?, son varios motivos, pero por si se borra una factura, por ejemplo, así no perderíamos el incremento que debe existir entre ellas, las facturas.

tbCabecerasFacturas (
id integer,
numero integer,
fecha date,
cliente integer,
total numeric(15,4),
primary key (id)
)

tbLineasFacturas (
id integer,
id_cabecera integer,
codigoArticulo integer,
cantidad integer,
precio numeric(15,4),
primary key (id),
foreign key (id_cabecera) references tbCabecerasFacturas (id)
)

Básicamente, a grandes rasgos:
Los campos id son autoincrementales.
Cada vez que creamos una factura podemos buscar la última y aumentar en 1 su número. Si se cancela, borra, etc. no habría problema con saltos de números.
Y como ves, se llaman tablas relacionales porque están relacionadas, es imposible dar de alta un registro en tbLineasFacturas si no existe su correspondiente 'id' en la tabla tbCabecerasFacturas

Yo uso 2 querys, uno para la cabecera y otro para el detalle. Si se cambia la cabecera entonces busco los registros en el detalle con el 'id' de la cabecera, simplemente.

anubis
08-06-2012, 22:58:27
Se agradece de veras la informacion.

Si me quedo claro la relacion y si me funcionaba con la sconsultas, me quedaba el insertar registros pero lo voy a hacer registrando primero el maestro y luego el detalle.

gracias voy a probarlo y os cuento