SQL - Insertar maestro detalle mismo sp

   
Vista:

Insertar maestro detalle mismo sp

Publicado por Alberto Valero (25 intervenciones) el 12/05/2009 19:34:43
Cual es la mejor practica para insertar datos en una tabla maestra y de detalle en el mismo stored procedure.?
Por ejemplo cual es la mejor practica para pasar el valor de la tabla maestra recien insertada al detalle y cuidar que en error en una hacerles rollback, espero sus comentarios gracias.
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

RE:Insertar maestro detalle mismo sp

Publicado por DALSOM (197 intervenciones) el 12/05/2009 21:33:48
NO CREO.

HACES TRANSACCIONES, PERO NO ES UTIL EN EL MISMO SP.
IMAGINATE, QUE TU DETALLE TENGA 10 REGISTROS,
COMO LO HARIAS, CON 10 PARAMETROS?

TE RECOMIENDO QUE PIENSES EN FUNCION DE UN SP PARA LA LINEA EN LA MAESTRA, Y OTRO PARA INTRODUCIR UNA LINEA EN LA DETALLE, EL CUAL UTILIZAS TANTAS VECES COMO LINEAS TENGAS.

AH, INICIA LA TRANSACCION SOLO ANTES DE LLAMAR TU SP, Y VALIDA SI LOGRO INSERTAR O NO, IGUAL EN EL DE DETALLE, PARA QUE PUEDAS DECIDIR, CUANDO HACER UN Rollback O UN Commit.

SALUDOS,
DALSOM.
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

RE:Insertar maestro detalle mismo sp

Publicado por anonimo (1 intervención) el 26/07/2012 00:40:13
Y que pasa si uno de los detalles, sale error?..... tendrias que eliminar la cabezera y los otros detalles, el rollback debe de funcionar si algo falla deshacer todos los cambios.
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

RE:Insertar maestro detalle mismo sp

Publicado por Julio (1 intervención) el 15/05/2013 20:45:29
hola... antes que nada.. gracias por sus comentarios....

yo casualmente estoy haciendo un pequeño sistema en php con mysq y estoy intentando guardar datos maestro detalle
y primero hice un procedimiento que guardaba el maestro y le pasaba las sentencias del detalle como parametro y no me funciono . asi que decidi hacer los procedimientos por separado
ahora lo que he hecho
es que
- primero me conecto a la db
- lugo inicio una transaccion sobre esa coneccion
- con la misma coneccion ejecuto el procedimiento que inserta el maestro
luego este me envia el id de ese maestro (para luego asociarlo a los detalles)
-luego hago un bucle para hacer las inserciones una por una del detalle ejecutando otro procedimiento en la misma coneccion
"pero en el momento que quiero hacer la primera consulta me da este error"
""Commands out of sync; you can't run this command now""
al parecer es por que tengo que liberar los resultados de la laconsulta anterior pero ya lo hice con mysqli_next_result($link);
ya no me da el error pero no me guarda los datos y supuestamente no hay ningun error por que al final valido los errores para dar un rollback o COMMIT, y ya cheque me esta haciendo el COMMIT pero no guarda los datos....

talvez alguien me puede decir donde esta lo malo....

muchas gracias
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
Imágen de perfil de Tony

RE:Insertar maestro detalle mismo sp

Publicado por Tony (1 intervención) el 13/06/2016 16:06:16
Hola yo uso un esquema de este tipo, espero que te sirva

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Public Sub AgregarMaestroDetalle()
        Using cn As New SqlConnection(CadenaConexion)
            cn.Open()
 
            Dim Trans As SqlTransaction = cn.BeginTransaction()
            Dim cmd As SqlCommand = cn.CreateCommand()
 
            cmd.Transaction = Trans
            cmd.CommandType = CommandType.StoredProcedure
 
            Try
                'Insertamos la cabecera en la base de datos
                cmd.CommandText = "NombreStoredProcedureInsertaCabecera"
                cmd.Parameters.AddWithValue("@NombreParametro1", ValorParametro1)
                cmd.Parameters.AddWithValue("@NombreParametro2", ValorParametro2)
		...
                cmd.Parameters.AddWithValue("@NombreParametroN", ValorParametroN)

                Dim param As SqlParameter = cmd.Parameters.Add("@NuevoId", SqlDbType.Int)
                param.Direction = ParameterDirection.Output

                cmd.ExecuteNonQuery()

                NuevoId = Convert.ToInt32(cmd.Parameters("@NuevoId").Value)

                'Insertamos el detalle
                cmd.CommandText = "NombreStoredProcedureInsertaDetalle"
 
                For Each dr As DataRow In dtRepuestos.Rows
                    cmd.Parameters.Clear()
 
                    cmd.Parameters.AddWithValue("@ONuevoId", NuevoId)
                    cmd.Parameters.AddWithValue("@ParametroDetalle1", dr("ValorDetalle1"))
                    cmd.Parameters.AddWithValue("@ParametroDetalle1", dr("ValorDetalle1"))
                    ...
                    cmd.Parameters.AddWithValue("@ParametroDetalleN", dr("ValorDetalleN"))
 
                    cmd.ExecuteNonQuery()
                Next
 
            Trans.Commit()
 
                cn.Close()
            Catch ex As Exception
                Trans.Rollback()
            End Try
        End Using
End Sub
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