fbpx

¿Qué es un Stored Procedure en una base de datos y por que usarlos?

Introducción

En Stored Procedure(Procedimiento almacenado) en una base de datos es un objeto que nos ayuda a realizar una o varias tareas especificas y que se encuentra formado por múltiples instrucciones del lenguaje conocido como SQL(por sus siglas en inglés Structured Query Language), pueden llegar a ser tan complejos o sencillos como lo requiera la lógica del negocio de la empresa o del sistema que se este desarrollando.

En donde son utilizados los Stored Procedures

Los Stored Procedures son soportados por todos los motores de bases de datos existentes, no existe motor de base de datos que no lo tenga considerado en su estructura, tales como Microsoft SQL Server, MySQL, Oracle, PostgreSQL, MongoDB, etc., su implementación en esencia es básicamente la misma, lo que debemos de preocuparnos por conocer y dominar como programadores es el Lenguaje Estructurado de Consultas SQL, ese es el importante, claro que todos los motores tienen su toque del fabricante, donde en ocasiones te hacen la vida mas fácil o mas difícil al realizar cierta tarea casi en automático, un ejemplo de ello es el famoso Identity en una Tabla tanto en Microsoft SQL Server como en Oracle o MySQL tiene su toque de marca, pero el concepto es el mismo

Que motor de base de datos elegir

Es abrumador y a veces da hasta miedo tanto motor de bases de datos existente como para decidirnos por cual incluir en nuestro backend, por eso se debe de hacer un análisis profundo de que es lo que se va a desarrollar o de la solución que se va a implementar y sus posibilidades de crecimiento a largo plazo, incluyendo también el presupuesto del cliente, eso a veces lo dejamos de lado pero es en verdad importante saber lo que nuestro cliente este dispuesto a invertir para poder realizar una buena elección.

Te voy a dejar 2 ejemplos de Stored Procedures uno sencillo y uno un poco mas complejo desarrollados en Microsoft SQL Server

USE [MiDepaDB]
GO
/****** Object:  StoredProcedure [dbo].[USP_INDICADORES_AGREGAR]    Script Date: 02/05/2024 08:07:53 a. m. ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[USP_INDICADORES_AGREGAR]
(
	@P_IN_Clave					VARCHAR(10),
	@P_IN_DescripcionCorta		VARCHAR(100),
	@P_IN_DescripcionLarga		VARCHAR(500),
	@P_IN_VisibleCliente		INT,
	@P_IN_EnviarCorreoACliente	INT,
	@P_IN_EnviarCorreoAUsuario	INT
)
AS
BEGIN
	/*
		HISTORIAL DE CAMBIOS
		AUTOR			FECHA			DESCRIPCION
		------------	-----------		------------------------------------------------------------
		JSERRANO		2022-07-06		Agrega un indicador nuevo validando que la Clave no exista
		--------------------------------------------------------------------------------------------

		PRUEBA

		EXEC USP_INDICADORES_AGREGAR null, null

	*/

	SET NOCOUNT ON;
	DECLARE @Id_Estatus_Activo	INT = 1,	-- Activa, CA_ESTATUS WHERE proceso = 'Catalogo'
			@Id_Indicador		INT = 0,
			@ExisteClaveNueva	INT

	SET @ExisteClaveNueva = ( SELECT COUNT(1) 
						        FROM CA_INDICADORES 
						       WHERE Clave = @P_IN_Clave AND
									 Id_Estatus = @Id_Estatus_Activo )

	IF @ExisteClaveNueva = 0
		BEGIN

			INSERT INTO CA_INDICADORES( Clave, DescripcionCorta, DescripcionLarga, VisibleCliente, EnviarCorreoACliente,
										EnviarCorreoAUsuario, FechaAlta, FechaModificacion, Id_Usuario, Id_Estatus )
								VALUES( @P_IN_Clave, @P_IN_DescripcionCorta, @P_IN_DescripcionLarga, @P_IN_VisibleCliente, @P_IN_EnviarCorreoACliente,
										@P_IN_EnviarCorreoAUsuario, GETDATE(), GETDATE(), 1, @Id_Estatus_Activo )
	
			SET @Id_Indicador = @@IDENTITY

		END
	ELSE IF @ExisteClaveNueva >= 1
		BEGIN

			SET @Id_Indicador = 0			-- La clave nueva ya existe y no se puede agregar el indicador nuevo

		END

	SELECT @Id_Indicador AS 'Id_Indicador'


END

Ejemplo de Stored Procedure de 63 líneas de código

Algo que es siempre muy importante incluir al momento de desarrollar estos objetos en nuestra base de datos es el Historial de cambios de nuestra versión, que aunque podemos llevarlos con un controlador de versiones como es git nunca esta demás también incluirlos en el encabezado de nuestros Stored Procedures, créeme por experiencia se lo que te digo, se que a veces da flojera hacer esto, pero es muy importante en desarrollos grandes, acostúmbrate a hacerlo aunque tu desarrollo sea pequeño, eso hablará bien de ti y de tu trabajo en el lugar en donde te encuentres, y te ayudara a encontrar problemas rápidamente en el caso de que surja alguno.

Ejemplo 2, un Stored Procedure un poco mas “complejo”

USE [SPPV]
GO
/****** Object:  StoredProcedure [dbo].[USP_TRANSACCION_INSERTAR]    Script Date: 02/05/2024 08:55:17 a. m. ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[USP_TRANSACCION_INSERTAR]
(	
	@P_IN_KEYTRA			INT,
	@P_IN_KEYTIE			INT,
	@P_IN_KEYTDO			VARCHAR(2),
	@P_IN_KEYCRE			INT,
	@P_IN_KEYCLI			INT,
	@P_IN_KEYEMP			INT,
	@P_IN_KEYUSR			INT,
	@P_IN_TARJET			BIGINT =NULL ,							   -- Número de Monedero electrónico
	
	@P_IN_KEYAGE			INT  = null,							   -- se agrega para la venta con distribuidor
	@P_IN_FOLIOV			VARCHAR(25) = null,						   -- se agrega para la venta con distribuidor

	@P_IN_DETALLE				  NVARCHAR(MAX),
	@P_IN_TIPO_PAGO_IMPORTE		  NVARCHAR(MAX),
	@P_IN_TICKET_TARJETA		  NVARCHAR(MAX),
	@P_IN_CAMBIO_PRECIO_TIENDA	  NVARCHAR(MAX),
	@P_IN_TRANSACCION_PROMOCIONES NVARCHAR(MAX) = NULL,                -- se agrega para insertar en la tabla relacional de promociones       

	@P_OUT_MENSAJE			VARCHAR(400) OUTPUT,
	@P_OUT_SUBTOT			DECIMAL(12,2) OUTPUT,
	@P_OUT_IMPIVA			DECIMAL(12,2) OUTPUT,
	@P_OUT_IMPTOT			DECIMAL(12,2) OUTPUT,
	@P_OUT_IMPDES			DECIMAL(12,2) OUTPUT,
	@P_OUT_FECALT			DATETIME OUTPUT
)
AS
BEGIN
	/*
		HISTORIAL DE CAMBIOS
		AUTOR			FECHA			DESCRIPCION
		------------	-----------		------------------------------------------------------------
		JSERRANO		2017-06-22		Inserta una transacción generada desde el punto de venta
		--------------------------------------------------------------------------------------------
	*/
	SET NOCOUNT ON;
	DECLARE @EST_ACTIV			INT = 0,
			@FCH_TRAN			DATETIME = GETDATE(),
			@FolioTran			INT,
			@CantidadVenta		INT,
			@ImporteTotal		Decimal(12,2),
			@ImporteIVA			Decimal(12,2),
			@ImporteSubTotal	Decimal(12,2),
			@ImporteDescuento	Decimal(12,2),
			@PorcentajeIVA		Decimal(12,4),
			@IdIVA				INT,
			@TipoMovimiento		VARCHAR(1),
			@Referencia			VARCHAR(250),
			@SalidaMETI			VARCHAR(300),
			@SalidaPG			INT = 0,
			@MensajeMonedero	VARCHAR(300),
			@PuntosGenerados	INT = 0,
			@TipoTransaccion	INT = 0,
			@TipoOperacion		INT = 0,
			@ImportePesos		DECIMAL(12,2) = 0,
			@ImportePuntos		INT = 0,
			@SePuedeBonificar	INT = 0,
			@SePuedeRedimir		INT = 0,
			@ImporteTotalMonederoElectronico	DECIMAL(12,2),
			@IdFP_Documento		INT,
			@ScriptSincroniza	NVARCHAR(MAX) = '',

			-- Cursor TD_TRANSACCIONES_DETALLE
			@TD_PRD_KEYPRD		CHAR(20),
			@TD_RAN_KEYRAN		INT, 
			@TD_RAD_KEYTAL		CHAR(5), 
			@TD_TRD_CANTID		INT, 
			@TD_TRD_PRECIO		DECIMAL(12,2),
			@TD_TRD_PCOSTO		DECIMAL(12,2),
			@TD_TRD_PORDES		DECIMAL(12,2),
			@TD_TRD_IMPDES		DECIMAL(12,2),
			@TD_PRO_KEYPRO		INT,
			@TD_USR_KEYVTA		INT,

			-- Cursor TP_TIPO_PAGO_IMPORTE
			@TPI_FPA_KEYFPA		INT,
			@TPI_TPI_IMPTOT		DECIMAL(12,2),

			-- Cursor TT_TICKET_TARJETA
			@TT_FPA_KEYFPA		INT,
			@TT_TIT_NUMAUT		CHAR(6),
			@TT_TIT_NUMTAR		CHAR(4), 
			@TT_TIT_IMPORT		DECIMAL(12,2), 
			@TT_TIT_REFFIN		CHAR(8),

			-- Cursor TD_TICKET_DOCUMENTO
			@TD_FPA_KEYFPA		INT, 
			@TD_TPI_REFERE		VARCHAR(300),

			-- Cursor BC_BIT_CAMBIOS_PRECIOS_TIENDA
			@CPT_PRD_KEYPRD		CHAR(20),
			@CPT_RAN_KEYRAN		INT, 
			@CPT_RAD_KEYTAL		CHAR(5),
			@CPT_USR_KEYVTA		INT,
			@CPT_USR_KEYAUT		INT,
			@CPT_BCP_CANTID		INT, 
			@CPT_BCP_PREANT		DECIMAL(12,2), 
			@CPT_BCP_PREACT		DECIMAL(12,2), 
			@CPT_BCP_CAUSAS		VARCHAR(100),

			-- Cursor MI_MOVIMIENTOS_INVENTARIO
			@MI_PRD_KEYPRD		CHAR(20),
			@MI_RAD_KEYTAL		CHAR(5),
			@MI_RAN_KEYRAN		INT,
			@MI_TRD_CANTID		INT,
			@MI_TRD_PRECIO		DECIMAL(12,2),
			@MI_TRD_PCOSTO		DECIMAL(12,2),
			@MI_TRD_IMPDES		DECIMAL(12,2),
			@MI_PRV_NOMPRO		VARCHAR(200),

			-- Cursor Transacciones Promociones
			 @cur_PRD_KEYPRD   varchar(20),
			 @cur_RAN_KEYRAN   int,	
			 @cur_RAD_KEYTAL   varchar(5), 
			 @cur_TIE_KEYTIE   int,
			 @cur_PRO_KEYPRO   int,
			 @cur_USR_KEYVTA   int	, 
			 @cur_TPR_PORDES   decimal(12,2)
	/*  
	@TipoTransaccion	Comportamiento
	1 = Abono,				(+)
	2 = Cargo,				(-)
	3 = Ninguna				(=)
	
	@TipoOperacion
	1 = Consulta de Saldo (Pesos y Puntos), 
	2 = Activación de Monedero (Con el saldo especificado), 
	3 = Recarga de Monedero, 
	4 = Bonificación (Generación de puntos por Venta), 
	5 = Redención (Utilización de puntos), 
	6 = Cancelación de Monedero (Por area Administrativa), 
	7 = Baja de Monedero (Por area Administrativa), 
	8 = Registro de Mondero (Por area Administrativa), 
	9 = Bloqueo de Monedero (Por reglas antifraude)
	*/
 
	DECLARE @TBL_TRANS_DET AS TABLE ( PRD_KEYPRD	CHAR(20),
									  RAN_KEYRAN	INT,
									  RAD_KEYTAL	CHAR(5),
									  TIE_KEYTIE	INT,
									  TRD_CANTID	INT,
									  TRD_PRECIO	DECIMAL(12,2),
									  TRD_PCOSTO	DECIMAL(12,2),
									  TRD_PORDES	DECIMAL(12,2),
									  TRD_IMPDES	DECIMAL(12,2),
									  PRO_KEYPRO	INT,
									  USR_KEYVTA	INT )

	DECLARE @TBL_TRANS_PROMO AS TABLE (PRD_KEYPRD	CHAR(20),
									   RAN_KEYRAN	INT,
									   RAD_KEYTAL	CHAR(5),
									   TIE_KEYTIE	INT,
									   PRO_KEYPRO	INT,
									   USR_KEYVTA   INT,
									   TPR_PORDES   DECIMAL (12,2)
									   )	

	-- Convertir cadena JSON a tabla temporal
	INSERT INTO @TBL_TRANS_DET ( PRD_KEYPRD, RAN_KEYRAN, RAD_KEYTAL, TIE_KEYTIE, TRD_CANTID, TRD_PRECIO,
								 TRD_PCOSTO, TRD_PORDES, TRD_IMPDES, PRO_KEYPRO, USR_KEYVTA )
	SELECT * 
	FROM OPENJSON(@P_IN_DETALLE) 
	WITH (	PRD_KEYPRD	CHAR(20),
			RAN_KEYRAN	INT,
			RAD_KEYTAL	CHAR(5),
			TIE_KEYTIE	INT,
			TRD_CANTID	INT,
			TRD_PRECIO	DECIMAL(12,2),
			TRD_PCOSTO	DECIMAL(12,2),
			TRD_PORDES	DECIMAL(12,2),
			TRD_IMPDES	DECIMAL(12,2),
			PRO_KEYPRO	INT,
			USR_KEYVTA	INT)

	DECLARE @TBL_PAGO_IMPORTE AS TABLE ( FPA_KEYFPA	INT,
									     TPI_IMPTOT	DECIMAL(12,2),
										 TPI_REFERE	VARCHAR(300) )


	-- Convertir cadena JSON a tabla temporal
	INSERT INTO @TBL_PAGO_IMPORTE ( FPA_KEYFPA, TPI_IMPTOT, TPI_REFERE )
	SELECT * 
	FROM OPENJSON(@P_IN_TIPO_PAGO_IMPORTE) 
	WITH (	FPA_KEYFPA	INT,
			TPI_IMPTOT	DECIMAL(12,2),
			TPI_REFERE	VARCHAR(300) )

	DECLARE @TBL_TICKET_TARJETA AS TABLE ( FPA_KEYFPA	INT,
										   TIT_NUMAUT	CHAR(6),
										   TIT_NUMTAR	CHAR(4),
										   TIT_IMPORT	DECIMAL(12,2),
										   TIT_REFFIN	CHAR(8) )

	-- Convertir cadena JSON a tabla temporal
	INSERT INTO @TBL_TICKET_TARJETA ( FPA_KEYFPA, TIT_NUMAUT, TIT_NUMTAR, TIT_IMPORT, TIT_REFFIN )
	SELECT * 
	FROM OPENJSON(@P_IN_TICKET_TARJETA) 
	WITH (	FPA_KEYFPA	INT,
			TIT_NUMAUT	CHAR(6),
			TIT_NUMTAR	CHAR(4),
			TIT_IMPORT	DECIMAL(12,2),
			TIT_REFFIN	CHAR(8) )

	DECLARE @TBL_CAMBIO_PRECIO_TIENDA AS TABLE ( PRD_KEYPRD	CHAR(20),
												 RAN_KEYRAN	INT,
												 RAD_KEYTAL	CHAR(5),
												 USR_KEYAUT	INT,
												 BCP_CANTID INT,
												 BCP_PREANT	DECIMAL(12,2),
												 BCP_PREACT	DECIMAL(12,2),
												 BCP_CAUSAS	VARCHAR(100),
												 USR_KEYVTA INT )

	-- Convertir cadena JSON a tabla temporal
	INSERT INTO @TBL_CAMBIO_PRECIO_TIENDA ( PRD_KEYPRD, RAN_KEYRAN, RAD_KEYTAL, USR_KEYAUT, BCP_CANTID, BCP_PREANT, BCP_PREACT, BCP_CAUSAS, USR_KEYVTA )
	SELECT * 
	FROM OPENJSON(@P_IN_CAMBIO_PRECIO_TIENDA) 
	WITH (	PRD_KEYPRD	CHAR(20),
			RAN_KEYRAN	INT,
			RAD_KEYTAL	CHAR(5),
			USR_KEYAUT	INT,
			BCP_CANTID  INT,
			BCP_PREANT	DECIMAL(12,2),
			BCP_PREACT	DECIMAL(12,2),
			BCP_CAUSAS	VARCHAR(100),
			USR_KEYVTA	INT )

	---- Convertir cadena JSON(P_IN_TRANSACCION_PROMOCIONES)  tabla temporal(@TBL_TRANS_PROMO)
	INSERT INTO @TBL_TRANS_PROMO ( PRD_KEYPRD,	RAN_KEYRAN,	RAD_KEYTAL,	TIE_KEYTIE,	PRO_KEYPRO,	USR_KEYVTA,  TPR_PORDES)
	SELECT * 
	FROM OPENJSON(@P_IN_TRANSACCION_PROMOCIONES) 
	WITH (	PRD_KEYPRD	CHAR(20),
			RAN_KEYRAN	INT,
			RAD_KEYTAL	CHAR(5),
			TIE_KEYTIE	INT,
			PRO_KEYPRO  INT,
			USR_KEYVTA	INT,
			TPR_PORDES	DECIMAL(12,2)
		 )

		
	SET @ImporteTotal = ( SELECT SUM(TPI_IMPTOT) FROM @TBL_PAGO_IMPORTE );

	SELECT @PorcentajeIVA = ( IMP_PORCEN / 100 ),
		   @IdIVA = IMP.IMP_KEYIMP
	FROM CA_IMPUESTOS IMP 
	INNER JOIN CA_TIENDAS TIE ON TIE.IMP_KEYIMP = IMP.IMP_KEYIMP AND TIE.TIE_KEYTIE = @P_IN_KEYTIE;

	SET @ImporteIVA = ( SELECT SUM(TPI_IMPTOT) * ( @PorcentajeIVA )
						FROM @TBL_PAGO_IMPORTE );

	SET @ImporteSubTotal = @ImporteTotal - @ImporteIVA;

	SET @ImporteDescuento = ( SELECT SUM(TRD_IMPDES)
							  FROM @TBL_TRANS_DET );

	SET @CantidadVenta = ( SELECT SUM(TRD_CANTID) FROM @TBL_TRANS_DET );

	SET @EST_ACTIV = dbo.FUN_OBTENER_ESTATUS ('ABC','ACTIVO')

	IF ( @P_IN_KEYTRA IS NULL)
		SET @FolioTran = ( SELECT FOL_KEYFOL FROM CA_FOLIOS WHERE TIE_KEYTIE = @P_IN_KEYTIE AND TDO_KEYTDO = @P_IN_KEYTDO );
	ELSE
		SET @FolioTran = @P_IN_KEYTRA;

	IF @P_IN_KEYTDO = 'VT'
		SET @TipoMovimiento = 'S';
	ELSE IF @P_IN_KEYTDO = 'AP'
		SET @TipoMovimiento = 'S';
	ELSE IF @P_IN_KEYTDO = 'NC'
		SET @TipoMovimiento = 'E';

	-- Se determina si se trata de una Bonificacion o de una Redencion en base a la redencion de PUNTOS (9)
	IF ( SELECT COUNT(1) FROM @TBL_PAGO_IMPORTE WHERE FPA_KEYFPA = 9 ) = 0
		BEGIN
			SET @SePuedeBonificar = 1;
		END
	ELSE
		BEGIN
			SET @SePuedeBonificar = 0;
		END

	-- Obtenemos el importe en Puntos que seran Redimidos
	IF ( SELECT COUNT(1) FROM @TBL_PAGO_IMPORTE WHERE FPA_KEYFPA = 9 ) = 1
		BEGIN
			SET @ImportePuntos = ( SELECT TPI_IMPTOT FROM @TBL_PAGO_IMPORTE WHERE FPA_KEYFPA = 9 );
			SET @SePuedeRedimir = 1;
		END
	-- Obtenemos el importe en Pesos que seran Redimidos
	IF ( SELECT COUNT(1) FROM @TBL_PAGO_IMPORTE WHERE FPA_KEYFPA = 10 ) = 1
		BEGIN
			SET @ImportePesos = ( SELECT TPI_IMPTOT FROM @TBL_PAGO_IMPORTE WHERE FPA_KEYFPA = 10 );
			SET @SePuedeRedimir = 1;
		END

	-- Eliminamos del ImporteTotalMonderoElectronico el monto pagado con puntos
	SET @ImporteTotalMonederoElectronico = @ImporteTotal - ISNULL(( SELECT SUM(TPI_IMPTOT) FROM @TBL_PAGO_IMPORTE WHERE FPA_KEYFPA = 9 ),0);

	--BEGIN TRAN
	BEGIN TRY


		SET @ScriptSincroniza  = N'BEGIN TRAN ';
		
		INSERT INTO TR_TRANSACCIONES ( TRA_KEYTRA,	TDO_KEYTDO,		TIE_KEYTIE,		IMP_KEYIMP,		CRE_KEYCRE,
									   CLI_KEYCLI,	EMP_KEYEMP,		TRA_CANTID,		TRA_SUBTOT,		TRA_IMPIVA,
									   TRA_IMPTOT,	TRA_CODFAC,		TRA_FECSYS,		TRA_SERFAC,		TRA_FOLFAC,
									   TRA_STSAPL,	TRA_FECMOV,		EST_KEYEST,		USR_KEYUSR,		AGE_KEYAGE,
									   AGE_FOLIOV )
							  VALUES ( @FolioTran,	  @P_IN_KEYTDO,	@P_IN_KEYTIE,	@IdIVA,			  @P_IN_KEYCRE,
									   @P_IN_KEYCLI,  @P_IN_KEYEMP,	@CantidadVenta,	@ImporteSubTotal, @ImporteIVA, 
									   @ImporteTotal, NULL,			@FCH_TRAN,0,	0,				  0,			
									   @FCH_TRAN,	  @EST_ACTIV,	@P_IN_KEYUSR,	@P_IN_KEYAGE,	 @P_IN_FOLIOV	 );
				
				
		if (@P_IN_FOLIOV is null)
			set @P_IN_FOLIOV = '0' 

		if (@P_IN_KEYAGE is null)
			set @P_IN_KEYAGE= 0 


		SET @ScriptSincroniza = @ScriptSincroniza + N' INSERT INTO TR_TRANSACCIONES ( TRA_KEYTRA, TDO_KEYTDO, TIE_KEYTIE, IMP_KEYIMP, CRE_KEYCRE,
																					  CLI_KEYCLI, EMP_KEYEMP, TRA_CANTID, TRA_SUBTOT, TRA_IMPIVA,
																					  TRA_IMPTOT, TRA_CODFAC, TRA_FECSYS, TRA_SERFAC, TRA_FOLFAC,
																					  TRA_STSAPL, TRA_FECMOV, EST_KEYEST, USR_KEYUSR, AGE_KEYAGE,
																					  AGE_FOLIOV	) 
		VALUES ( ' + CONVERT(NVARCHAR,@FolioTran)    + N',''' + CONVERT(NVARCHAR,@P_IN_KEYTDO) + N''',' + CONVERT(NVARCHAR,@P_IN_KEYTIE)   + N',' + CONVERT(NVARCHAR,@IdIVA) + N',' + CONVERT(NVARCHAR,@P_IN_KEYCRE) + N','
				   + CONVERT(NVARCHAR,@P_IN_KEYCLI)  + N',' + ISNULL(CONVERT(NVARCHAR,@P_IN_KEYEMP),N'NULL') + N',' + CONVERT(NVARCHAR,@CantidadVenta) + N',' + CONVERT(NVARCHAR,@ImporteSubTotal) + N',' + CONVERT(NVARCHAR,@ImporteIVA) + N','
				   + CONVERT(NVARCHAR,@ImporteTotal) + N',NULL,' + 'CONVERT(DATETIME,' + N'''' + CONVERT(NVARCHAR,@FCH_TRAN,103) + N' ' + CONVERT(NVARCHAR,@FCH_TRAN,108) + N'''),0,0,0' + N','
				   + N'CONVERT(DATETIME,' + N'''' + CONVERT(NVARCHAR,@FCH_TRAN,103) + N' ' + CONVERT(NVARCHAR,@FCH_TRAN,108) + N'''),' + CONVERT(NVARCHAR,@EST_ACTIV)   + N',' + CONVERT(NVARCHAR,@P_IN_KEYUSR) + N',' 
				   + CONVERT(NVARCHAR,@P_IN_KEYAGE) + N',' +  CONVERT(NVARCHAR,@P_IN_FOLIOV) + N') ';

				   
		INSERT INTO TD_TRANSACCIONES_DETALLE ( TRA_KEYTRA, TDO_KEYTDO, PRD_KEYPRD, RAN_KEYRAN, RAD_KEYTAL,
											   TIE_KEYTIE, TRD_CANTID, TRD_PRECIO, TRD_PCOSTO, TRD_PORDES,
											   TRD_IMPDES, TRD_FECMOV,  USR_KEYVTA, EST_KEYEST,
											   USR_KEYUSR )
									SELECT distinct	@FolioTran,		@P_IN_KEYTDO,	PRD_KEYPRD,		RAN_KEYRAN,		RAD_KEYTAL,
											@P_IN_KEYTIE,	SUM(TRD_CANTID),TRD_PRECIO,		TRD_PCOSTO,		TRD_PORDES,
											TRD_IMPDES,		@FCH_TRAN,				USR_KEYVTA,		@EST_ACTIV,
											@P_IN_KEYUSR
									FROM @TBL_TRANS_DET
									GROUP BY PRD_KEYPRD, RAN_KEYRAN, RAD_KEYTAL, TRD_PRECIO, TRD_PCOSTO,
											 TRD_PORDES, TRD_IMPDES, PRO_KEYPRO, USR_KEYVTA;


		-- Generamos el fragmento del script de TD_TRANSACCIONES_DETALLE
		DECLARE TransaccionesDetalle
			CURSOR FOR
				SELECT	PRD_KEYPRD,	RAN_KEYRAN,	RAD_KEYTAL,	SUM(TRD_CANTID), TRD_PRECIO,
						TRD_PCOSTO,	TRD_PORDES,	TRD_IMPDES,	PRO_KEYPRO,		 USR_KEYVTA
				FROM @TBL_TRANS_DET
				GROUP BY PRD_KEYPRD, RAN_KEYRAN, RAD_KEYTAL, TRD_PRECIO, TRD_PCOSTO,
						 TRD_PORDES, TRD_IMPDES, PRO_KEYPRO, USR_KEYVTA
		OPEN TransaccionesDetalle
		FETCH NEXT FROM TransaccionesDetalle 
			INTO @TD_PRD_KEYPRD, @TD_RAN_KEYRAN, @TD_RAD_KEYTAL, @TD_TRD_CANTID, @TD_TRD_PRECIO,
				 @TD_TRD_PCOSTO, @TD_TRD_PORDES, @TD_TRD_IMPDES, @TD_PRO_KEYPRO, @TD_USR_KEYVTA
		WHILE @@FETCH_STATUS = 0
			BEGIN
				SET @ScriptSincroniza = @ScriptSincroniza + N' INSERT INTO TD_TRANSACCIONES_DETALLE ( TRA_KEYTRA, TDO_KEYTDO, PRD_KEYPRD, RAN_KEYRAN, RAD_KEYTAL,
																						 TIE_KEYTIE, TRD_CANTID, TRD_PRECIO, TRD_PCOSTO, TRD_PORDES,
																						 TRD_IMPDES, TRD_FECMOV, USR_KEYVTA, EST_KEYEST,
																						 USR_KEYUSR ) 
				VALUES ( ' + CONVERT(NVARCHAR,@FolioTran)    + N',''' + CONVERT(NVARCHAR,@P_IN_KEYTDO) + N''',''' + CONVERT(NVARCHAR,@TD_PRD_KEYPRD) + N''',' + CONVERT(NVARCHAR,@TD_RAN_KEYRAN) + N',''' + CONVERT(NVARCHAR,@TD_RAD_KEYTAL) + N''','
						   + CONVERT(NVARCHAR,@P_IN_KEYTIE)  + N',' + CONVERT(NVARCHAR,@TD_TRD_CANTID) + N',' + CONVERT(NVARCHAR,@TD_TRD_PRECIO) + N',' + CONVERT(NVARCHAR,@TD_TRD_PCOSTO) + N',' + CONVERT(NVARCHAR,@TD_TRD_PORDES) + N','
						   + CONVERT(NVARCHAR,@TD_TRD_IMPDES) + N',' + 'CONVERT(DATETIME,' + N'''' + CONVERT(NVARCHAR,@FCH_TRAN,103) + N' ' + CONVERT(NVARCHAR,@FCH_TRAN,108) + N''')' + N',' + CONVERT(NVARCHAR,@TD_USR_KEYVTA) + N',' + CONVERT(NVARCHAR,@EST_ACTIV)   + N',' 
						   + CONVERT(NVARCHAR,@P_IN_KEYUSR) +
					 N') '

				FETCH NEXT FROM TransaccionesDetalle INTO @TD_PRD_KEYPRD, @TD_RAN_KEYRAN, @TD_RAD_KEYTAL, @TD_TRD_CANTID, @TD_TRD_PRECIO,
														  @TD_TRD_PCOSTO, @TD_TRD_PORDES, @TD_TRD_IMPDES, @TD_PRO_KEYPRO, @TD_USR_KEYVTA
			END

		CLOSE TransaccionesDetalle
		DEALLOCATE TransaccionesDetalle

		INSERT INTO TP_TIPO_PAGO_IMPORTE ( TRA_KEYTRA, TDO_KEYTDO, FPA_KEYFPA, TIE_KEYTIE,
										   TPI_IMPTOT, TPI_FEULAC, TPI_FECALT, EST_KEYEST, USR_KEYUSR )
		SELECT	@FolioTran,		@P_IN_KEYTDO,	FPA_KEYFPA,		@P_IN_KEYTIE,
				TPI_IMPTOT,		@FCH_TRAN,		@FCH_TRAN,		@EST_ACTIV,		@P_IN_KEYUSR
		FROM @TBL_PAGO_IMPORTE;

		-- Generamos el fragmento del script de TP_TIPO_PAGO_IMPORTE
		DECLARE TipoPagoImporte
			CURSOR FOR
				SELECT	FPA_KEYFPA,	TPI_IMPTOT
				FROM @TBL_PAGO_IMPORTE
		OPEN TipoPagoImporte
		FETCH NEXT FROM TipoPagoImporte 
			INTO @TPI_FPA_KEYFPA, @TPI_TPI_IMPTOT
		WHILE @@FETCH_STATUS = 0
			BEGIN
				SET @ScriptSincroniza = @ScriptSincroniza + N' INSERT INTO TP_TIPO_PAGO_IMPORTE ( TRA_KEYTRA, TDO_KEYTDO, FPA_KEYFPA, TIE_KEYTIE,
																					 TPI_IMPTOT, TPI_FEULAC, TPI_FECALT, EST_KEYEST, USR_KEYUSR ) 
				VALUES ( ' + CONVERT(NVARCHAR,@FolioTran)    + N',''' + CONVERT(NVARCHAR,@P_IN_KEYTDO) + N''',' + CONVERT(NVARCHAR,@TPI_FPA_KEYFPA) + N',' + CONVERT(NVARCHAR,@P_IN_KEYTIE) + N','
						   + CONVERT(NVARCHAR,@TPI_TPI_IMPTOT) + N',' + 'CONVERT(DATETIME,' + N'''' + CONVERT(NVARCHAR,@FCH_TRAN,103) + N' ' + CONVERT(NVARCHAR,@FCH_TRAN,108) + N''')' + N',' + 'CONVERT(DATETIME,' + N'''' + CONVERT(NVARCHAR,@FCH_TRAN,103) + N' ' + CONVERT(NVARCHAR,@FCH_TRAN,108) + N''')' + N',' + CONVERT(NVARCHAR,@EST_ACTIV) + N',' + CONVERT(NVARCHAR,@P_IN_KEYUSR) +
					 N') '

				FETCH NEXT FROM TipoPagoImporte INTO @TPI_FPA_KEYFPA, @TPI_TPI_IMPTOT
			END

		CLOSE TipoPagoImporte
		DEALLOCATE TipoPagoImporte

		INSERT INTO TT_TICKET_TARJETA ( TRA_KEYTRA, TIE_KEYTIE, TDO_KEYTDO, FPA_KEYFPA, TIT_NUMAUT,
										TIT_NUMTAR, TIT_IMPORT, TIT_FECMOV, TIT_REFFIN, USR_KEYUSR,
										EST_KEYEST )
		SELECT	@FolioTran,		@P_IN_KEYTIE,	@P_IN_KEYTDO,	FPA_KEYFPA, TIT_NUMAUT,
				TIT_NUMTAR,		TIT_IMPORT,		@FCH_TRAN,		TIT_REFFIN, @P_IN_KEYUSR,
				@EST_ACTIV
		FROM @TBL_TICKET_TARJETA;

		-- Generamos el fragmento del script de TT_TICKET_TARJETA
		DECLARE TicketTarjeta
			CURSOR FOR
				SELECT	FPA_KEYFPA, TIT_NUMAUT, TIT_NUMTAR,	TIT_IMPORT,	TIT_REFFIN
				FROM @TBL_TICKET_TARJETA
		OPEN TicketTarjeta
		FETCH NEXT FROM TicketTarjeta 
			INTO @TT_FPA_KEYFPA, @TT_TIT_NUMAUT, @TT_TIT_NUMTAR, @TT_TIT_IMPORT, @TT_TIT_REFFIN
		WHILE @@FETCH_STATUS = 0
			BEGIN
				SET @ScriptSincroniza = @ScriptSincroniza + N' INSERT INTO TT_TICKET_TARJETA ( TRA_KEYTRA, TIE_KEYTIE, TDO_KEYTDO, FPA_KEYFPA, TIT_NUMAUT,
																							   TIT_NUMTAR, TIT_IMPORT, TIT_FECMOV, TIT_REFFIN, USR_KEYUSR,
																							   EST_KEYEST ) 
				VALUES ( ' + CONVERT(NVARCHAR,@FolioTran) + N',' + CONVERT(NVARCHAR,@P_IN_KEYTIE) + N',''' + CONVERT(NVARCHAR,@P_IN_KEYTDO) + N''',' + CONVERT(NVARCHAR,@TT_FPA_KEYFPA) + N',''' + CONVERT(NVARCHAR,@TT_TIT_NUMAUT) + N''','
						   + N'''' + CONVERT(NVARCHAR,@TT_TIT_NUMTAR) + N''',' + CONVERT(NVARCHAR,@TT_TIT_IMPORT) + N',' + 'CONVERT(DATETIME,' + N'''' + CONVERT(NVARCHAR,@FCH_TRAN,103) + N' ' + CONVERT(NVARCHAR,@FCH_TRAN,108) + N''')' + N',' + CASE WHEN CONVERT(NVARCHAR,@TT_TIT_REFFIN) IS NULL THEN N'NULL' ELSE CONVERT(NVARCHAR,@TT_TIT_REFFIN) END + N',' + CONVERT(NVARCHAR,@P_IN_KEYUSR) + N','
						   + CONVERT(NVARCHAR,@EST_ACTIV) +
					 N') '

				FETCH NEXT FROM TicketTarjeta INTO @TT_FPA_KEYFPA, @TT_TIT_NUMAUT, @TT_TIT_NUMTAR, @TT_TIT_IMPORT, @TT_TIT_REFFIN
			END

		CLOSE TicketTarjeta
		DEALLOCATE TicketTarjeta

		SET @IdFP_Documento = 11;
		INSERT INTO TD_TICKET_DOCUMENTO ( TRA_KEYTRA, TIE_KEYTIE, TDO_KEYTDO, FPA_KEYFPA, TID_REFERE,
										  TID_FECMOV, USR_KEYUSR, EST_KEYEST )
		SELECT	@FolioTran,		@P_IN_KEYTIE,	@P_IN_KEYTDO,	FPA_KEYFPA,	TPI_REFERE,
				@FCH_TRAN,		@P_IN_KEYUSR,	@EST_ACTIV
		FROM @TBL_PAGO_IMPORTE
		WHERE FPA_KEYFPA = @IdFP_Documento;

		-- Generamos el fragmento del script de TD_TICKET_DOCUMENTO
		DECLARE TicketDocumento
			CURSOR FOR
				SELECT FPA_KEYFPA, TPI_REFERE
				FROM @TBL_PAGO_IMPORTE
				WHERE FPA_KEYFPA = @IdFP_Documento
		OPEN TicketDocumento
		FETCH NEXT FROM TicketDocumento 
			INTO @TD_FPA_KEYFPA, @TD_TPI_REFERE
		WHILE @@FETCH_STATUS = 0
			BEGIN
				SET @ScriptSincroniza = @ScriptSincroniza + N' INSERT INTO TD_TICKET_DOCUMENTO ( TRA_KEYTRA, TIE_KEYTIE, TDO_KEYTDO, FPA_KEYFPA, TID_REFERE,
																								 TID_FECMOV, USR_KEYUSR, EST_KEYEST ) 
				VALUES ( ' + CONVERT(NVARCHAR,@FolioTran) + N',' + CONVERT(NVARCHAR,@P_IN_KEYTIE) + N',''' + CONVERT(NVARCHAR,@P_IN_KEYTDO) + N''',' + CONVERT(NVARCHAR,@TD_FPA_KEYFPA) + N',''' + CONVERT(NVARCHAR,@TD_TPI_REFERE) + N''','
						   + N'CONVERT(DATETIME,''' + CONVERT(NVARCHAR,@FCH_TRAN,103) + N' ' + CONVERT(NVARCHAR,@FCH_TRAN,108) + N''')' + N',' + CONVERT(NVARCHAR,@P_IN_KEYUSR) + N',' + CONVERT(NVARCHAR,@EST_ACTIV) +
					 N') '

				FETCH NEXT FROM TicketDocumento INTO @TD_FPA_KEYFPA, @TD_TPI_REFERE
			END

		CLOSE TicketDocumento
		DEALLOCATE TicketDocumento

		INSERT INTO BC_BIT_CAMBIOS_PRECIOS_TIENDA ( TIE_KEYTIE, TRA_KEYTRA, TDO_KEYTDO, PRD_KEYPRD, RAN_KEYRAN,
													RAD_KEYTAL, USR_KEYVTA, USR_KEYAUT, CRE_KEYCRE, BCP_CANTID,
													BCP_PREANT, BCP_PREACT, BCP_CAUSAS, BCP_FECALT, BCP_FEULAC,
													USR_KEYUSR, EST_KEYEST )
		SELECT	@P_IN_KEYTIE,	@FolioTran,		@P_IN_KEYTDO,	PRD_KEYPRD,		RAN_KEYRAN,	
				RAD_KEYTAL,		USR_KEYVTA,		USR_KEYAUT,		@P_IN_KEYCRE,	BCP_CANTID,
				BCP_PREANT,		BCP_PREACT,		BCP_CAUSAS,		@FCH_TRAN,		@FCH_TRAN,
				@P_IN_KEYUSR,	@EST_ACTIV
		FROM @TBL_CAMBIO_PRECIO_TIENDA;

		-- Generamos el fragmento del script de BC_BIT_CAMBIOS_PRECIOS_TIENDA
		DECLARE CambiosPreciosTienda
			CURSOR FOR
				SELECT	PRD_KEYPRD, RAN_KEYRAN, RAD_KEYTAL, USR_KEYVTA, USR_KEYAUT,
						BCP_CANTID, BCP_PREANT, BCP_PREACT, BCP_CAUSAS
				FROM @TBL_CAMBIO_PRECIO_TIENDA
		OPEN CambiosPreciosTienda
		FETCH NEXT FROM CambiosPreciosTienda 
			INTO @CPT_PRD_KEYPRD, @CPT_RAN_KEYRAN, @CPT_RAD_KEYTAL, @CPT_USR_KEYVTA, @CPT_USR_KEYAUT,
				 @CPT_BCP_CANTID, @CPT_BCP_PREANT, @CPT_BCP_PREACT, @CPT_BCP_CAUSAS
		WHILE @@FETCH_STATUS = 0
			BEGIN
				SET @ScriptSincroniza = @ScriptSincroniza + N' INSERT INTO BC_BIT_CAMBIOS_PRECIOS_TIENDA ( TIE_KEYTIE, TRA_KEYTRA, TDO_KEYTDO, PRD_KEYPRD, RAN_KEYRAN,
																										   RAD_KEYTAL, USR_KEYVTA, USR_KEYAUT, CRE_KEYCRE, BCP_CANTID,
																										   BCP_PREANT, BCP_PREACT, BCP_CAUSAS, BCP_FECALT, BCP_FEULAC,
																										   USR_KEYUSR, EST_KEYEST )
				VALUES ( ' + CONVERT(NVARCHAR,@P_IN_KEYTIE) + N',' + CONVERT(NVARCHAR,@FolioTran) + N',''' + CONVERT(NVARCHAR,@P_IN_KEYTDO) + N''',''' + CONVERT(NVARCHAR,@CPT_PRD_KEYPRD) + N''',' + CONVERT(NVARCHAR,@CPT_RAN_KEYRAN) + N','
						   + '''' + CONVERT(NVARCHAR,@CPT_RAD_KEYTAL) + N''',' + CONVERT(NVARCHAR,@CPT_USR_KEYVTA) + N',' + CONVERT(NVARCHAR,@CPT_USR_KEYAUT) + N',' + CONVERT(NVARCHAR,@P_IN_KEYCRE) + N',' + CONVERT(NVARCHAR,@CPT_BCP_CANTID) + N','
						   + CONVERT(NVARCHAR,@CPT_BCP_PREANT) + N',' + CONVERT(NVARCHAR,@CPT_BCP_PREACT) + N',''' + CONVERT(NVARCHAR,@CPT_BCP_CAUSAS) + N''',' + N'CONVERT(DATETIME,''' + CONVERT(NVARCHAR,@FCH_TRAN,103) + N' ' + CONVERT(NVARCHAR,@FCH_TRAN,108) + N''')' + N',' + N'CONVERT(DATETIME,''' + CONVERT(NVARCHAR,@FCH_TRAN,103) + N' ' + CONVERT(NVARCHAR,@FCH_TRAN,108) + N''')' + N','
						   + CONVERT(NVARCHAR,@P_IN_KEYUSR) + N',' + CONVERT(NVARCHAR,@EST_ACTIV) +
					 N') '

				FETCH NEXT FROM CambiosPreciosTienda INTO @CPT_PRD_KEYPRD, @CPT_RAN_KEYRAN, @CPT_RAD_KEYTAL, @CPT_USR_KEYVTA, @CPT_USR_KEYAUT,
														  @CPT_BCP_CANTID, @CPT_BCP_PREANT, @CPT_BCP_PREACT, @CPT_BCP_CAUSAS
			END

		CLOSE CambiosPreciosTienda
		DEALLOCATE CambiosPreciosTienda
		
	--	select @TipoMovimiento tipo_mov, @P_IN_KEYTDO keytdo 


		INSERT INTO MI_MOVIMIENTOS_INVENTARIO (	PRD_KEYPRD, RAD_KEYTAL, RAN_KEYRAN, TMO_TPOMOV, TMO_CVETMO,
												TIE_KEYTIE, MOI_FECMOV, MOI_CANTID, MOI_PRECIO, MOI_COSTO,
												MOI_REFERE, MOI_DESCTO, MOI_FECLLE, MOI_COSPRO, MOI_NUMDOC,
												MOI_NOMPRO, EST_KEYEST, USR_KEYUSR )
		SELECT	PRD_KEYPRD,			RAD_KEYTAL,		RAN_KEYRAN,		@TipoMovimiento,	@P_IN_KEYTDO, 
				@P_IN_KEYTIE,		@FCH_TRAN,		TRD_CANTID,		TRD_PRECIO,			TRD_PCOSTO,
				@FolioTran,			TRD_IMPDES,		@FCH_TRAN,		0,					'', 
				( SELECT PRV_NOMPRO FROM CA_PROVEEDORES WHERE PRV_KEYPRV = CAST(SUBSTRING(PRD_KEYPRD,LEN(PRD_KEYPRD)-4,5) AS INT) ), @EST_ACTIV, @P_IN_KEYUSR
		FROM @TBL_TRANS_DET;

		-- Generamos el fragmento del script de MI_MOVIMIENTOS_INVENTARIO
		DECLARE MovimientosInventario
			CURSOR FOR
				SELECT	PRD_KEYPRD,	RAD_KEYTAL,	RAN_KEYRAN,	TRD_CANTID,	TRD_PRECIO,
						TRD_PCOSTO, TRD_IMPDES, ( SELECT PRV_NOMPRO FROM CA_PROVEEDORES WHERE PRV_KEYPRV = CAST(SUBSTRING(PRD_KEYPRD,LEN(PRD_KEYPRD)-4,5) AS INT) ) PRV_NOMPRO
				FROM @TBL_TRANS_DET
		OPEN MovimientosInventario
		FETCH NEXT FROM MovimientosInventario 
			INTO @MI_PRD_KEYPRD, @MI_RAD_KEYTAL, @MI_RAN_KEYRAN, @MI_TRD_CANTID, @MI_TRD_PRECIO,	
				 @MI_TRD_PCOSTO, @MI_TRD_IMPDES, @MI_PRV_NOMPRO
		WHILE @@FETCH_STATUS = 0
			BEGIN
				SET @ScriptSincroniza = @ScriptSincroniza + N' INSERT INTO MI_MOVIMIENTOS_INVENTARIO ( PRD_KEYPRD, RAD_KEYTAL, RAN_KEYRAN, TMO_TPOMOV, TMO_CVETMO,
																									   TIE_KEYTIE, MOI_FECMOV, MOI_CANTID, MOI_PRECIO, MOI_COSTO,
																									   MOI_REFERE, MOI_DESCTO, MOI_FECLLE, MOI_COSPRO, MOI_NUMDOC,
																									   MOI_NOMPRO, EST_KEYEST, USR_KEYUSR )
				VALUES ( ''' + CONVERT(NVARCHAR,@MI_PRD_KEYPRD) + N''',''' + CONVERT(NVARCHAR,@MI_RAD_KEYTAL) + N''',' + CONVERT(NVARCHAR,@MI_RAN_KEYRAN) + N',''' + CONVERT(NVARCHAR,@TipoMovimiento) + N''',''' + CONVERT(NVARCHAR,@P_IN_KEYTDO) + N''','
						     + CONVERT(NVARCHAR,@P_IN_KEYTIE) + N',' + N'CONVERT(DATETIME,''' + CONVERT(NVARCHAR,@FCH_TRAN,103) + N' ' + CONVERT(NVARCHAR,@FCH_TRAN,108) + N''')' + ',' + CONVERT(NVARCHAR,@MI_TRD_CANTID) + N',' + CONVERT(NVARCHAR,@MI_TRD_PRECIO) + N',' + CONVERT(NVARCHAR,@MI_TRD_PCOSTO) + N','
					  + '''' + CONVERT(NVARCHAR,@FolioTran) + N''',' + CONVERT(NVARCHAR,@MI_TRD_IMPDES) + N',' + N'CONVERT(DATETIME,''' + CONVERT(NVARCHAR,@FCH_TRAN,103) + N' ' + CONVERT(NVARCHAR,@FCH_TRAN,108) + N''')' + N',0,''''' + N','
					  + '''' + CONVERT(NVARCHAR,@MI_PRV_NOMPRO) + N''',' + CONVERT(NVARCHAR,@EST_ACTIV) + N',' + CONVERT(NVARCHAR,@P_IN_KEYUSR) +
					 N') '

				FETCH NEXT FROM MovimientosInventario INTO @MI_PRD_KEYPRD, @MI_RAD_KEYTAL, @MI_RAN_KEYRAN, @MI_TRD_CANTID, @MI_TRD_PRECIO,	
														   @MI_TRD_PCOSTO, @MI_TRD_IMPDES, @MI_PRV_NOMPRO
			END

		CLOSE MovimientosInventario
		DEALLOCATE MovimientosInventario

		-- insertamos en la tabla tp_transacciones_promociones las promocines que aplicaron a la transaccion en caso de existir
	
	
		INSERT INTO TP_TRANSANCCIONES_PROMOCIONES ( TRA_KEYTRA,		TDO_KEYTDO,			PRD_KEYPRD,		RAN_KEYRAN,		RAD_KEYTAL,		TIE_KEYTIE, 
												   PRO_KEYPRO,		USR_KEYVTA,			TPR_PORDES,		TPR_FECALT,		TPR_FEULAC,		EST_KEYEST,
												   USR_KEYUSR)
										  SELECT   @FolioTran,		@P_IN_KEYTDO,		PRD_KEYPRD,		RAN_KEYRAN,		RAD_KEYTAL,		@P_IN_KEYTIE,	
												   PRO_KEYPRO,		USR_KEYVTA,         TPR_PORDES,		@FCH_TRAN,		@FCH_TRAN,		@EST_ACTIV,													
									     		   @P_IN_KEYUSR
											FROM @TBL_TRANS_PROMO
											GROUP BY PRD_KEYPRD, RAN_KEYRAN, RAD_KEYTAL, TPR_PORDES, PRO_KEYPRO, USR_KEYVTA;
	
	
		-- Generamos el fragmento del script de tp_transacciones_promociones
		DECLARE TransaccionesPromociones
			CURSOR FOR
				SELECT	PRD_KEYPRD,	RAN_KEYRAN,	RAD_KEYTAL, TIE_KEYTIE,
						PRO_KEYPRO,	USR_KEYVTA, TPR_PORDES
				FROM @TBL_TRANS_PROMO
				
		OPEN TransaccionesPromociones
		FETCH NEXT FROM TransaccionesPromociones
			INTO @cur_PRD_KEYPRD,	@cur_RAN_KEYRAN,	@cur_RAD_KEYTAL,    @cur_TIE_KEYTIE,
				 @cur_PRO_KEYPRO,	@cur_USR_KEYVTA,	@cur_TPR_PORDES
		WHILE @@FETCH_STATUS = 0
			BEGIN
			
				SET @ScriptSincroniza = @ScriptSincroniza + N' INSERT INTO TP_TRANSANCCIONES_PROMOCIONES ( TRA_KEYTRA,		TDO_KEYTDO,			PRD_KEYPRD,		RAN_KEYRAN,		RAD_KEYTAL,		TIE_KEYTIE, 
																										   PRO_KEYPRO,		USR_KEYVTA,			TPR_PORDES,		TPR_FECALT,		TPR_FEULAC,		EST_KEYEST,
																										   USR_KEYUSR)
																								VALUES ( ' + CONVERT(NVARCHAR,@FolioTran)     + N',''' + CONVERT(NVARCHAR,@P_IN_KEYTDO) + N''',''' + CONVERT(NVARCHAR,@cur_PRD_KEYPRD) + N''',' + CONVERT(NVARCHAR,@cur_RAN_KEYRAN) + N',''' + CONVERT(NVARCHAR,@cur_RAD_KEYTAL) + N''',' + CONVERT(NVARCHAR,@P_IN_KEYTIE) +','+
																										   + CONVERT(NVARCHAR,@cur_PRO_KEYPRO)+ N',' + CONVERT(NVARCHAR,@cur_USR_KEYVTA) + N',' + CONVERT(NVARCHAR,@cur_TPR_PORDES) + N',' + 'CONVERT(DATETIME,' + N'''' + CONVERT(NVARCHAR,@FCH_TRAN,103) + N' ' + CONVERT(NVARCHAR,@FCH_TRAN,108) + N''')' + N',' + 'CONVERT(DATETIME,' + N'''' + CONVERT(NVARCHAR,@FCH_TRAN,103) + N' ' + CONVERT(NVARCHAR,@FCH_TRAN,108) + N''')' 
																										   + N',' + CONVERT(NVARCHAR,@EST_ACTIV)   + N',' 
																										   + CONVERT(NVARCHAR,@P_IN_KEYUSR) +
																									  N') '
								
																										
				FETCH NEXT FROM TransaccionesPromociones
												   INTO @cur_PRD_KEYPRD,	@cur_RAN_KEYRAN,	@cur_RAD_KEYTAL,    @cur_TIE_KEYTIE,
														@cur_PRO_KEYPRO,	@cur_USR_KEYVTA,	@cur_TPR_PORDES
			END

		CLOSE TransaccionesPromociones
		DEALLOCATE TransaccionesPromociones

		
		-- ______________________________________________________________________________________________

		if ( @P_IN_KEYTDO != 'AP' )
			BEGIN 
				UPDATE CA_FOLIOS SET FOL_KEYFOL = @FolioTran + 1,
									 FOL_FEULAC = @FCH_TRAN
				WHERE TIE_KEYTIE = @P_IN_KEYTIE AND TDO_KEYTDO = @P_IN_KEYTDO;

				SET @ScriptSincroniza = @ScriptSincroniza + N' UPDATE CA_FOLIOS SET FOL_KEYFOL = ' + CONVERT(NVARCHAR,@FolioTran + 1) + N', FOL_FEULAC = ' +
										N'CONVERT(DATETIME,''' + CONVERT(NVARCHAR,@FCH_TRAN,103) + N' ' + CONVERT(NVARCHAR,@FCH_TRAN,108) + N''') ' +
										N'WHERE TIE_KEYTIE = ' + CONVERT(NVARCHAR,@P_IN_KEYTIE) + N' AND TDO_KEYTDO = ''' + CONVERT(NVARCHAR,@P_IN_KEYTDO) + N'''';
			END

		SET @ScriptSincroniza = @ScriptSincroniza + N' COMMIT TRAN ';

		INSERT INTO SI_SINCRONIZA(TIE_KEYTIE,SIN_SCRIPT, SIN_FECALT, SIN_FECSIN, SIN_FEULAC, SIN_STATUS)
		VALUES(@P_IN_KEYTIE, @ScriptSincroniza, @FCH_TRAN, NULL, @FCH_TRAN, 0);

		 

		--SAVE TRAN VENTA

		--COMMIT TRAN VENTA;

		SET @P_OUT_MENSAJE = ( SELECT CONVERT(VARCHAR,ERR_KEYERR) + '|' + ERR_DESCRI + '|' + CONVERT(VARCHAR,@FolioTran) + '|' + CONVERT(VARCHAR,@PuntosGenerados)
							   FROM ER_ERRORES WHERE ERR_KEYERR = 0 );
		SET @P_OUT_SUBTOT = @ImporteSubTotal;
		SET @P_OUT_IMPIVA = @ImporteIVA;
		SET @P_OUT_IMPTOT = @ImporteTotal;
		SET @P_OUT_IMPDES = @ImporteDescuento;
		SET @P_OUT_FECALT = @FCH_TRAN;

	END TRY
	BEGIN CATCH
		--SELECT ERROR_NUMBER(), ERROR_MESSAGE() AS ErrorNumber;  ERR_DESCRI
		SET @P_OUT_MENSAJE = ( SELECT CONVERT(VARCHAR,ERR_KEYERR) + '|'  + ' - ' + ERROR_MESSAGE() + '||' + CONVERT(VARCHAR,@PuntosGenerados)
								FROM ER_ERRORES WHERE ERR_KEYERR = 1516 );
	END CATCH
	
END

Store Procedure que inserta una transacción de venta desde una aplicación de punto de venta de 644 líneas de código

No te preocupes tanto en entender como funciona y que es lo que hace, el objetivo de mostrártelo es que veas que pueden llegar a ser tan complejos como el negocio lo requiera, recuerda que siempre es mejorable todo lo que se hace, y como en el Stored Procedure anterior no olvides el historial de cambios y una breve explicación de que es lo que se hace en cada fragmento de código.

Tampoco quiero decir que te vas a poner a comentar como funciona un insert o un select, no estoy queriendo decir eso, pero si que se hace en un bloque en especifico, por ejemplo

No olvidemos nuestro historial de cambios, si deseas saber como llevar el control de tu código fuente en SQL puedes leer también este articulo Como controlar nuestro código fuente con Git y GitHub desde Visual Studio Code

Un Stored Procedure puede llegar a volverse muy complejo por eso es que debemos de ser muy específicos y cuidadosos en el código que se esta generando, pero eso es algo que el tiempo te va a enseñar.

Conclusiones

El objetivo del articulo no era enseñarte como crear un SP o como ejecutarlo o como depurarlo, mas bien era hacerte consciente de el por que usarlos y para que nos sirven en una solución de software, podemos llegar a tener una solución de software que tenga varios motores de bases de datos para que funcione, no necesariamente tiene que ser solo una, de echo al día de hoy es raro ver una solución con un solo tiempo de base de datos.

Las buenas o malas practicas de programación tampoco son un tema que se este tratando en este articulo.

¿Conoces alguna otra manera de hacer este cambio? coméntanoslo.

¿Necesitas ayuda con tu desarrollo de software o el marketing de tu negocio? No dudes en contactarnos

Halcón de cola roja como imagen del autor.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

* *
*

Scroll al inicio