Guardando Registros En SQL Server (Encabezado y Detalles)

Me gustaría alguien me ayudara con la siguiente inquietud:
Estoy Utilizando Sql Server 2010 y Tengo un formulario de encabezado y detalles (por ejemplo una factura), el encabezado, como es un registro único, simplemente le hago un insert en SQL, pero el detalle (que son varios registros), le hago un insert a cada uno en un ciclo, pero mi pregunta es la siguiente: Si tuviera una falla eléctrica o el equipo se apaga en ese momento (en el ciclo guardando los detalles), solo se guardara en SQL los registros que se le hayan hecho el Insert, ¿cómo podría controlar esto?, porque podría guardar la transacción incompleta!

1 respuesta

Respuesta
1

Como estas guardando los registros ¿?... estás usando sp's o tienes los insert incrustados en tu aplicacion ¿?

Estoy utilizando Store Procedure.

Gracias por la ayuda.

Supongo que en el detalle estás que envías la información fila por fila... algo así.

create procedure dbo.usp_insertar_detalle

@cod_det int, @cod_cab int,...

as

insert into factura_det values(@cod_det, @cod_cab, ...)

Correcto, eso mismo.

Le envío a través del SqlExec(), mi conexión, mi cadena de caracteres y el Store procedure.

Este es un ejemplo de mi sore Procedure:

USE [CON]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[cncatcnt_Insertar]
@cod_comp numeric (1,0),
@cod_cnta varchar (50),
@des_cnta varchar (50)
AS
insert into dbo.cncataf0 (cod_comp, cod_cnta, des_cnta) VALUES (@cod_comp, @cod_cnta, @des_cnta)

Gracias anticipadas.

Debes de manipular las transacciones... parece que estás usando foxpro, nunca he usado ese lenguaje, pero el algoritmo sería el siguiente

for li = 1 hasta "total de items"

{

//asignar valores a las variables

//ejecutas tu procedimiento almacenado

//si ocurre un error, cancelas la transacción y sales del sistema (return)

// de lo contrario continuas con el bucle

}

// confirmas la transacción

La intensión es que, al recorrer el bucle no confirmes la transacción, sólo la confirmas al culminar el bucle.

De todas maneras en tu cadena de conexión debes de tener una propiedad para la autoconfirmación de transacciones, esa propiedad debe de estar deshabilitada.

Que buena es tu idea, pero tengo una duda, y es que como le estoy enviado la Store procedure que guarde los registros:

Suponiendo que este dentro del ciclo li en el paso descrito (//si ocurre un error, cancelas la transacción y sales del sistema (return)) y de cinco registros, haya procesado los tres primeros y en la posición 4 ocurre un error con ese registro, mi pregunta es:

Como le digo al Sql Server que cancele y no guarde los 3 registros anteriores?

y como le digo al Sql Server que ya mi transacción ya termino?

Desde FoxPro, puedo verificar la conexión y su estado, puedo verificar si la ejecución de cada Stored Procedure fue exitosa, pero no tengo como controlar la transacción del ciclo como una transacción, es por esto mi duda de como controlarlo en Sql Server.

Disculpa las tantas preguntas y de antemano muchas gracias por toda la ayuda prestada.

Te explico con un ejemplo en sql

Begin tran --inicio de la transacción
insert into personal values (@cod, @nombre, @tipo ) --trans 01
if @@error <> 0 begin --si encuentra un error en trans 01
rollback tran --cancelar la transacción
return --salir
end

update contrato set fecha = @fecha where cod = @cod -- trans 02

if @@error <> 0 begin --si encuentra un error en trans 01

rollback tran --cancelar la transacción

return --salir

end

Commit tran --confirmer transacción

Cómo ves, sólo inicio una vez la transacción y en toda la traza existen varios roolback y un sólo commit.

Lo que hace el rollback es cancelar toda transacción que este en la misma trama(begin tran)

Por mas que hagas 100 insert, si en en el ionsert 100 ocurra un error, el rollback cancelará todo, mientras qué, el commit confirmará todo.

Este ejemplo es el sql, en las herramientas de programación no debes iniciar nada, todo depende de una propiedad en tu cadena de conexión.

En toda cadena de conexión existe una propiedad commit, autocommit o algo así, lo cual indica que las transacciones serán confirmadas automáticamente o manipuladas por el usuario. Por ejemplo, si esa propiedad está activada, la propia aplicación confirmará las transacciones automáticamente, debes de usarla con mucho cuidado, pues en tu caso no es recomendable, debes de desactivar esa propiedad para que puedas manipular las transacciones, cancelarlas y/o confirmarlas a tus necesidades.

Ahora, deberás averiguar como cancelar y confirmar una transacción en foxpro.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas