Ayuda por favor. Como insertar información a tabla maestro detalle

Como realizar una inserccion maestro detalle. Ejemplo el tipico caso de Pedidos y Detalle de Pedio que se encuentran en dos tablas con una relación de 1 a muchos. El detalle de pedido (productos a comprar) se encuentra en tabla.

Esto porque no me parece optimo utilizar dos insercciones una el encabezado y otra que recorra la tabla y llamando multiples veces a un procedure que inserte una linea de pedido.

Como hacer que un procedure reciba todos los detalle de pedidos en parametro, que opciones hay.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

pues así es

Una inserción primero para el encabezado, y luego una inserción por cada detalle.

INTEFAZ GRAFICA: PRODUCTO

INTEFAZ GRAFICA:

PRODUCTO A------------------------->CLICK --------------------->MOSTRAR DETALLE A
PRODUCTO B------------------------->CLICK---------------------->MOSTRAR DETALLE B
PRODUCTO C------------------------>CLICK..............................>MOSTRAR DETALLE C

CLIENTE INGRESA SUS DAT OS

REALIZA PRIMER PEDIDO N 1 PRODUCTO A,B TOTAL =1O PESOS
REALIZA SEGUNDO PEDIDO N2 PPODUCTO C TOTAL=30 PESOS
......ASI SUCESIVAMENTE

COMPRA
CLIENTE ID 3
PEDIDOS:
N1 PRODUCTO A,B Total de N1 10
N2 PRODUCTO C Total de N2 30
TOTAL COMPRA 40

ASI QUE TENEMOS

UN CLIENTE REALIZA UNA O MAS COMPRAS
COMPRA TIENE UNO O MAS PEDIDOS
PRODUCTOS TIENE UNA MAS CARACTERISTICAS

OBSERVACION:
PRODUCTOS Y DETALLES FIJOS O DINAMICOS?

ENTONCES UNA COMPRA TIENE
UN CLIENTE
UNO O MAS PEDIDOS
TOTAL DE ESA COMPRA

DETALLE PEDIDO
ID IDPRODUCTO CANTIDAD

ENTONCES SI PRODUCTOS Y DETALLES SON FIJOS

DESDE LA INTERFAGA GRAFIAS PUDES ALMACENENAS LAS COMPRAS ENCAPSULAR ESOS DATOS Y LUEGO MEDIANTE
LA ABASTRACCION IR RECORRIENDO LOS DATOS Y ALMACENARLOS UNO POR UNO
LLAMANDO UNA INSERCCION A LA VEZ

FIJASTE EN DETALLE DE PEDIDO ,(AH! TE DISTE CUENTA) SI ANEXAS MAS COSAS SERAN TU SEGUNDA INSERRCION POR CADA ELEMENTOS REGISTRADO HACIA LA BASE DE DATOS

INSISTO SIEMPRE Y CUANDO EL PEDIDO Y DETALLE SEAN FIJOS

PORQUE SI NO ESTO CAMBIA SERIAN AGREGAR DOS INSERCCIONES MAS, LO MEJOR UN PROCEDIMIENTOS Y CURSORES

Imagen de gloryx

Pero que pasa si ocurre algun

Pero que pasa si ocurre algun problema en la primera insercción y se insera un pedido sin sus detalles ???

Imagen de gloryx

No estaría consistente la

No estaría consistente la base de datos!!!

Imagen de neko069

Qué tipo de framework y base

Qué tipo de framework y base de datos estás usando? igual si nos comentas las herramientas concretas que utilizas se te puede orientar ...

Imagen de gloryx

NetBeans con MySQL aplicacion

NetBeans con MySQL aplicacion de escritorio

Imagen de gloryx

Tengo entendido que se puede

Tengo entendido que se puede armar un xml con los datos que se van insertar para hacerlo en una sola transaccion pero no se como armarla y llamarla desde el programa.

Si estás trabajando con JDBC

Si estás trabajando con JDBC directo tienes que poner la propiedad "autocommit" de la conexión a falso y tienes que invocar el método commit() explicitamente cuando hayas terminado.

De esa forma te aseguras que todos los registros fueron insertados correctamente. Si no lo fueron, llamas al método "rollback()".

Si utilizas algún framework revisa la documentación buscando el término "transacciones" .

Ejemplo:

...
Connection c = ...
try {
    c.setAutoCommit( false ); // por default viene en true
    PreparedStatement tabla1 = ....
    PreparedStatement tabla2 = ....
    PreparedStatement tabla3 = ....
...
    tabla1.executeUpdate();
...
    for( ... ) {
       etc.
    }
...
    /// al terminar hay que hacer commit:
   c.commit(); //

} catch( SQLException sqle ) {
    c.rollback(); // algo falló, dar rollback a la transacción
} finally  {
    c.close(); // siempre cerrar la conexión en un finally
}

Imagen de gloryx

Ok. Excelente muchas gracias.

Ok. Excelente muchas gracias. Le agradezco mucho.

Si estás trabajando con JDBC

Adhiero plenamente al comentario de OscarRyz, y agrego algo:

Si estás trabajando con una base Buffered Loggin, al objeto Connection asígnale el nivel de aislamiento (isolation) COMMITED READ, ya que puede que el dato de la cabecera todavía haya quedado en los logical logs de la base y no se haya grabado en el disco.

sería algo así:
c.setTransactionIsolation(TRANSACTION_COMMITED_READ); o así:
c.setTransactionIsolation(Connection.TRANSACTION_COMMITED_READ);

La verdad es que no lo recuerdo bien.

De esta manera, te aseguras de que cuando vayas a insertar los conceptos que son Foreign Keys (los del detalle), encuentren su Primary Key (los elementos del maestro).

Saludos!

para eso existen las

para eso existen las validaciones, ejemplo:

en la interfaz grafica solicita ese detalle