Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   SQL Server (http://www.forosdelweb.com/f87/)
-   -   Insertar datos en cabecera y detalle llamando a un store procedure (http://www.forosdelweb.com/f87/insertar-datos-cabecera-detalle-llamando-store-procedure-502360/)

Developer9 02/07/2007 11:48

Insertar datos en cabecera y detalle llamando a un store procedure
 
Que hay weyes... yo por aquí descifrando donde está el botón para hacer un nuevo tema pero ya toy.

Mi pregu es, como le hacen para insertar cabecera y detalle (en las respectivas tablas de cabecera y detalle) en un store procedure.

He visto algunas aplicaciones que por ejemplo para insertar en una tabla el procedimiento tiene tantos parámetros como campos en la tabla, cosa que agarra el parámetro y hace el insert

Desde el código he visto que abren una conexión y hacen el insert de la cabecera, para insertar detalle se barren en datagrid y van generando los insert fila por fila.

Pero lo que necesito es llamar a un store procedure, enviarle la cabecera y el detalle y que me haga los insert respectivos, como le mando los parámetros. El detalle siempre varía, pueden ser uno, dos, tres registros

De que manera ustedes lo hacen?

moNTeZIon 03/07/2007 02:13

Re: Insertar datos en cabecera y detalle llamando a un store procedure
 
Como andas wey!
Pues si, yo lo hago con dos procedures, uno para la cabecera, y otro por cada línea.
El de la cabecera es algo así:
Código:

CREATE Procedure [dbo].[PEDIDOS_InsertarCabecera]
(
        @IDCliente                int,
        @Fecha                        datetime,
        @Portes                        money,
        @PortesIVA                money,
        @Estado                        nvarchar(50),
        @IDPedido                int OUTPUT
)
AS
BEGIN
        INSERT INTO Pedidos (IDCliente, Fecha, Portes, PortesIVA, Estado)
        VALUES (@IDCliente, @Fecha, @Portes, @PortesIVA, @Estado)

        SELECT @IDPedido = @@Identity
END

Y este es el de las líneas:
Código:

CREATE Procedure [dbo].[PEDIDOS_InsertarLinea]
(
        @IDPedido        int,
        @CodigoProducto        nvarchar(15),
        @NombreProducto        nvarchar(50),
        @Cantidad        money,
        @PrecioUnidad        money,
        @Dto                money,
        @PorIVA                money,
        @PorREC                money
)
AS
BEGIN
        INSERT INTO LineasPedido
        (
                IDPedido,
                CodigoProducto,
                NombreProducto,
                Cantidad,
                PrecioUnidad,
                Dto,
                PorIVA,
                PorREC
        )
        VALUES
        (
                @IDPedido,
                @CodigoProducto,
                @NombreProducto,
                @Cantidad,
                @PrecioUnidad,
                @Dto,
                @PorIVA,
                @PorREC
        )
END

No se me ocurre que tipo de parámetro podrías pasarle, que englobe todas las líneas, y poder hacer todo esto desde un solo procedimiento. Existirá una estructura así en SQL Server que pueda ser utilizada como pararámetro?
Adeeeeeeeu :adios:

Developer9 03/07/2007 08:31

Re: Insertar datos en cabecera y detalle llamando a un store procedure
 
Que tal monte de zion, gracias por contestar.

La cosa es que de la forma como tu lo haces tienes que llamar a dos procedimientos, pero que pasa si el procedimiento donde insertas el detalle falla, la fregaste porque ya insertaste la cabecera. La idea es manejar la transaccionalidad en el procedimiento que por cierto no veo ningún BEGIN TRAN, COMMIT TRAN y no veo ningún IF @@error entonces ROLLBACK TRAN en tus procedimientos

Por eso mi idea es hacer uno solo, para tener un begin tran y un commit tran

En tu caso como haces para manejar los errores

BarOdy 08/07/2007 08:33

Re: Insertar datos en cabecera y detalle llamando a un store procedure
 
Hola:

Si pues es cierto lo que comentas no se manejan transacciones, pero de la forma que se planteó la solucion anterior, es decir tener dos procedimientos uno para registrar la cabecera y otro para ir registrando los detalles, me imagino que las transacciones la maneja desde la aplicación para asegurar la confiabilidad y consistencia de los datos, por ejemplo el objeto Connection de ADO tiene los métodos BeginTran, CommitTran, RollbackTran.

Pero SQL Server 2000, inlcuye el soporte para XML a través del cual podrías enviar un documento XML con datos para diferentes tablas, de esta forma se envia cabecera y uno o muchos detalles o tablas relacionadas, es un tema interesante...

Te doy un referencia de las palabras claves que debes buscar en los Libros en Pantalla de SQL Serve para que tengas un mayor alcance del tema:

- sp_xml_preparedocument
- sp_xml_removedocument
- OPENXML, esta funcion es muy importante pues con ella obtienes la estructura del documento XML.

Espero que pueda ayudarte.

Recibe un cordial saludo.
barOdy

Developer9 09/07/2007 09:28

Re: Insertar datos en cabecera y detalle llamando a un store procedure
 
Gracias por contestar.

Claaaro wey!! ya soy campeon para manejar xml. Lo que pasaba es que necesitaba determinar la manera de insertar cabecera y detalle a mi esposa para su proyecto de graduación y quería conocer otras alternativas, pero manejando la transaccionalidad desde el procedimiento y no desde .net

Lo que pasa es que el profesor chillón podía chillar ya que el proyecto no se lo hizo del manera como el les "enseño", para lo cual hay que barrerse el datagrid del detalle y formar sql dinámicos. Como comprenderán eso es wuacala.

Tocó hacerlo enviandole xml como parámetros a la base, de la manera como vos lo dices :arriba:

moNTeZIon 11/07/2007 03:51

Re: Insertar datos en cabecera y detalle llamando a un store procedure
 
eeeeeeeeei !!!
Pues si, la transaccion en mi caso se encuentra en la propia aplicación que llama a los dos procedimientos.
Muy interesante lo de mandar el xml.
Nos vemos :adios:

Developer9 11/07/2007 07:49

Re: Insertar datos en cabecera y detalle llamando a un store procedure
 
Cita:

Iniciado por moNTeZIon (Mensaje 2064514)
eeeeeeeeei !!!
Pues si, la transaccion en mi caso se encuentra en la propia aplicación que llama a los dos procedimientos.
Muy interesante lo de mandar el xml.
Nos vemos :adios:

:si: :si:

Si gustas algún día de estos te enseño :arriba:


La zona horaria es GMT -6. Ahora son las 07:41.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.