actualizar dataset con tabla cabecera y detalle

28/05/2005 - 00:33 por Christian Velarde | Informe spam
Buen dia a todos
necesito una ayuda, tengo un dataset el cual contiene una tabla cabecera y
otra tabla detalle. Pues el problema esta en que el id de la tabla cabecera
es autonumerico, como agregaria al dataset un registro a la tabla cabecera de
tal forma que tambien se considere el id en la tabla detalle, para luego
actualizar la Base de Datos con este dataset.
Les agradesco su atención.
 

Leer las respuestas

#1 Julio Casal
30/05/2005 - 08:11 | Informe spam
Qué tal Christian. Dado que el id de la cabecera no se conocerá sino hasta
que se haya ingresado el registro correspondiente en la BD, pues lo que te
recomiendo es que crees un stored procedure en SQL Server que reciba los
elementos de la cabecera como parámetros y que reciba los detalles en la
forma de un documento XML que abrirás con la sentencia OpenXML. El documento
XML lo obtienes convirtiendo la tabla de detalles del dataset en XML (revisa
los métodos GetXML y WriteXML del dataset). El procedure que recibe el doc
XML junto con los parámetros de cabecera sería similar a este ejemplo:

CREATE PROCEDURE USP_CatalogosInsertar
@Id [int] OUTPUT,
@Nombre [varchar](50),
@Descripcion [varchar](100),
@docXML NText

AS

SET NOCOUNT ON

DECLARE @ManejadorXML int

EXEC sp_xml_preparedocument @ManejadorXML output, @docXML

INSERT INTO dbo.TB_Catalogos (Nombre, Descripcion)
VALUES(@Nombre, @Descripcion)

SELECT @id = SCOPE_IDENTITY()

INSERT INTO dbo.TB_CatalogosItems
(IdCatalogo,
IdCatalogoItem,
Descripcion)
SELECT @id,
IdCatalogoItem,
Descripcion
FROM OpenXML(@ManejadorXML,'/CatalogosDataset/CatalogosItems', 2)
WITH (IdCatalogoItem char(5),
Descripcion varchar(100))

EXEC sp_xml_removedocument @ManejadorXML

SET NOCOUNT OFF


Como lo puedes observar, el id de la cabecera lo obtengo con la sentencia
"SELECT @id = SCOPE_IDENTITY()", la cual entrega el id del último valor
autonumerado generado. Con ese id hago la inserción en la tabla de detalles
para todos los detalles que vienen en el documento XML.

Si no deseas usar XML, lo que podrías hacer es retornar ese id que te genera
el SCOPE_IDENTITY() y capturarlo en tu programa cliente. Luego lo asignas a
todas las filas de detalles de tu dataset y posteriormente mandas ahí si a
grabar todo el dataset a la BD. Sin embargo, este método es ineficiente
comparado con el otro, dado que en este caso estás haciendo un viaje para
enviar la cabecera, otro para recuperar el Id, y otro más para enviar los
detalles, peor aún si enviás los detalles de uno en uno.

Espero te haya servido de ayuda.

Saludos.

Julio Casal
Developer Senior .Net
MCP
Angel Intelligence


"Christian Velarde" wrote:

Buen dia a todos
necesito una ayuda, tengo un dataset el cual contiene una tabla cabecera y
otra tabla detalle. Pues el problema esta en que el id de la tabla cabecera
es autonumerico, como agregaria al dataset un registro a la tabla cabecera de
tal forma que tambien se considere el id en la tabla detalle, para luego
actualizar la Base de Datos con este dataset.
Les agradesco su atención.

Preguntas similares