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
Jesús Serrano
Desarrollador web con amplia experiencia en diferentes lenguajes de programación, Servidores de Bases de datos y servidores web.
El que no vive para servir no sirve para vivir
Contactar
Si necesitas ayuda con tu desarrollo de software o el marketing de tu negocio no dudes en ponerte en contacto con nosotros.
Teléfono: 4772288223