SQL - Como insertar cabecera y detalle de transaccion

 
Vista:

Como insertar cabecera y detalle de transaccion

Publicado por Fredy Ayala (4 intervenciones) el 30/05/2012 17:35:59
Buenos dias,

Escribo para hacerles una consulta sobre la siguiente:

Tengo una tabla VENTA, a la que puse como PK el campo id_venta y es identity, ademas tengo la tabla VENTA_DETALLE, que tiene como FK el campo id_venta de tipo int y que hace referencia al mismo campo de la tabla VENTA.

Ahora bien, lo que no se como hacer para que cuando se genera el id_venta en la tabla VENTA, como recuperar para que este mismo valor pueda guardar en el detalle. Creo que si hago por aplicación va quedar mal.
En los foros me dijeron para guardar la cabecera de la venta y luego traer este dato a traves de una consulta (por ej. select max(id_venta) from venta) pero creo que si en caso de que otra terminal inserta registro en la base de datos al mismo tiempo, podria encontrarme con grandes problemas y ademas que no le veo eficiente.
Agradeceré infinitamente por la ayuda, muchas gracias, saludos cordiales

Fredy Ayala
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Como insertar cabecera y detalle de transaccion

Publicado por leonardo_josue (1173 intervenciones) el 30/05/2012 20:32:00
Hola Fredy:

¿Con qué Base de Datos estás trabajando? Cometes el mismo error que muchos foristas y es que no mencionas con que motor de BD estás trabajando. Aunque todos ellos utilizan SQL como lenguaje de consultas, existen diferencias importantes entre cada uno de ellos por lo tanto es imposible darte una respuesta puntual sin este dato.

En este mismo tenor, cada BD maneja diferentes funciones o estrategias para resolver este problema, así SQL Server utiliza la función SCOPE_IDENTITY() o también la variable de entorno @@IDENTITY, MySQL utiliza una función llamada LAST_INSERT_ID, y en ORACLE si no mal recuerdo una secuencia tiene la propiedad CURRVAL para obtener el ID que se insertó.

Investiga un poco sobre cualquiera de ellos, si estás trabajando con un motor distinto de el pregunta si tiene alguna alternativa similar a estas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Como insertar cabecera y detalle de transaccion

Publicado por Fredy Ayala (4 intervenciones) el 01/06/2012 07:07:56
Muchisimas gracias Leo,

Ante que nada y disculpa por no haberme expresado con claridad, mi base de datos es sql server.

Estuve investigando el @@IDENTITY, y creo que suficiente me sirve. En este caso haria lo siguiente:
un store procedure que recibe como parametro los datos de la cabecera y el detalle, se inserta la cabecera, se genera el id y luego este ejecuta otro store procedure al cual envia el id generado y el detalle para la insercion del mismo. Corregime si esta mal.

Muchas gracias amigo

Saludos cordiales,
Fredy
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Como insertar cabecera y detalle de transaccion

Publicado por leonardo_josue (1173 intervenciones) el 01/06/2012 15:55:54
Hola Fredy:

En lo particular optaría por hacer las dos inserciones dentro de una sola transacción en un mismo SP... hay que recodar que las transacciones te permiten encapsular todos los movimientos que quieras sobre una base de datos, de tal manera que sólo si se ejecutan todos los movimientos de manera correcta se realiza el commit. Si falla cualquiera de ellos, entonces se aplica un Rollback para evitar que quede información incompleta

Saludos
Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Como insertar cabecera y detalle de transaccion

Publicado por fredy (4 intervenciones) el 01/06/2012 17:43:29
Muchas gracias una vez mas por la respuesta amigo, me sirve bastante la ayuda que me envias.

Otra consulta sr.

Cual es la mejor metodologia para llevar una auditoria de datos?

Mi idea es la siguiente, crear una tabla AUDITORIA, con los campos (idusuario, fecha, hora, tabla, cadena_inserted, cadena_deleted). Entonces creo un trigger en cada tabla y que dispara con cada operacion y guarda concatenado los datos del inserted y deleted asi para tener el registro de todo lo ocurrido en la base de datos, pero esto resultaria muy trabajoso para concatenar todos los campos en caso que la tabla sea muy grande. Lo que quiero saber es si hay alguna manera de resolver de forma mas sencilla, o si el sql server tiene alguna funcion que ya concate ne todos los campos de una tabla.

Muchas gracias por la ayuda amigo.
Mi mail es [email protected]

Saludos cordiales

Fredy
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Como insertar cabecera y detalle de transaccion

Publicado por leonardo_josue (1173 intervenciones) el 01/06/2012 19:31:46
Hola Fredy:

Hasta donde recuerdo (en realidad no he trabajado con esto) SQL Server, a partir de la versión 2008 proporciona una herramienta para auditar la actividad de tu BD... te soy sincero, no conozco mucho del tema, pero hasta donde recuerdo, este agente sirve justamente para monitorear lo que quieres... dale un vistazo a esta liga:

http://msdn.microsoft.com/es-es/library/cc280526(v=sql.105)

Creo que te puede servir.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Como insertar cabecera y detalle de transaccion

Publicado por Fredy (4 intervenciones) el 01/06/2012 20:31:09
Muchas gracias amigo!

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Como insertar cabecera y detalle de transaccion

Publicado por Leopoldo Taylhardat (93 intervenciones) el 09/06/2012 01:59:51
Es una cuestión lógica que tengas que saber cual es el PK de la cabecera...
Yo he usado usar un campo que me concatena en una columna el usuario y la fecha y hora del proceso...
Hago que se arme la variable en el programa y la asigno en la columna, luego rescato el valor del campo primario al localizarlo por el valor de la columna auxiliar(usuario+fechahoraproceso), eso me da el valor de la FK del registro de detalle...
Es algo inevitable hacerlo con programación, porque como dices, si dos usuarios insertan datos a la cabecera, siempre vas a buscar el último que se insertó...
Espero que te sirva...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar