Aqui dejo mi codigo y los resultados para el SP_CierreMes. hay cosas que necesito de mas practica para entender mejor su uso pero siempre hay proyectos que ayudan a afianzar el conocimiento como lo es este.
USE [TiendaLatam]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SP_CierreDeMes]
@Anio INT,
@Mes INT,
@CodigoPais NVARCHAR(2) = NULL,
@Resultado NVARCHAR(20) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @FilasInsertadas INT = 0;
DECLARE @VentasConsolidadas DECIMAL(18,2) = 0;
BEGIN TRY
IF @Anio < 2000 OR @Anio > YEAR(GETDATE()) + 1 OR @Mes < 1 OR @Mes > 12
THROW 50001, 'Parámetros de fecha inválidos.', 1;
IF EXISTS (
SELECT 1 FROM ResumenMensual
WHERE (@CodigoPais IS NULL OR CodigoPais = @CodigoPais) AND Anio = @Anio AND Mes = @Mes
)
THROW 50002, 'El período ya fue cerrado anteriormente.', 1;
BEGIN TRANSACTION;
-- INSERTAR REGISTRO EN RESUMEN MENSUAL
INSERT INTO ResumenMensual
(CodigoPais, Anio, Mes, TotalPedidos, VentasTotales, TicketPromedio)
SELECT
pa.CodigoPais,
@Anio,
@Mes,
COUNT(p.PedidoID),
SUM(p.Total),
AVG(p.Total)
FROM Pedidos p
INNER JOIN Clientes c ON p.ClienteID = c.ClienteID
INNER JOIN Paises pa ON c.PaisID = pa.PaisID
WHERE YEAR(p.FechaPedido) = @Anio
AND MONTH(p.FechaPedido) = @Mes
AND p.Estado = 'Completado'
AND (@CodigoPais IS NULL OR pa.CodigoPais = @CodigoPais)
GROUP BY pa.CodigoPais;
-- SETEO DE VARIABLES
SET @FilasInsertadas = @@ROWCOUNT;
SELECT @VentasConsolidadas = ISNULL(SUM(VentasTotales), 0)
FROM ResumenMensual
WHERE Anio = @Anio
AND Mes = @Mes
AND (@CodigoPais IS NULL OR CodigoPais = @CodigoPais);
SET @Resultado = 'SUCCESS';
-- INSERTAR EL REGISTRO DE AUDITORIA DE CIERRE EN LOGCIERRES
INSERT INTO LogCierres (CodigoPais, Anio, Mes, Estado, VentasTotales, Mensaje)
VALUES (
ISNULL(@CodigoPais, 'ALL'),
@Anio,
@Mes,
@Resultado,
ISNULL(@VentasConsolidadas, 0),
'Cierre exitoso. Países procesados: ' + CAST(@FilasInsertadas AS NVARCHAR(10))
);
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
SET @Resultado =
CASE ERROR_NUMBER()
WHEN 50002 THEN 'ALREADY_CLOSED'
ELSE 'ERROR'
END;
-- REGISTRAR EL ERROR EN LOGCIERRES
INSERT INTO LogCierres (CodigoPais, Anio, Mes, Estado, VentasTotales, Mensaje)
VALUES (
ISNULL(@CodigoPais, 'ALL'),
@Anio,
@Mes,
@Resultado,
0,
'Error ' + CAST(ERROR_NUMBER() AS NVARCHAR(20)) + ': ' + ERROR_MESSAGE()
);
-- SI EL ERROR NO ES DE PARAMETROS, QUE ARROJE EL ERROR DEL SISTEMA
IF ERROR_NUMBER() NOT IN (50001, 50002)
THROW;
END CATCH;
END;
GO
-- EJECUCION DEL SP
DECLARE @res NVARCHAR(20);
EXEC SP_CierreDeMes
@Anio=2024,
@Mes=1,
@CodigoPais='CO',
@Resultado = @res OUTPUT; -- @res Captura el valor de la variable resultado dentro del SP
SELECT * FROM LogCierres ORDER BY FechaHora DESC;
SELECT * FROM ResumenMensual





