En este artículo, hablaremos sobre los informes profesionales de SQL Server Reporting Services, cómo crear procedimientos almacenados para que estos informes cumplan con los requisitos comerciales y los beneficios de usar procedimientos almacenados para ejecutar informes SSRS.
Acerca de los informes profesionales de SSRS
Primero, familiaricémonos con los informes profesionales de SSRS.
Definición sencilla
Un informe SSRS profesional es un informe creado teniendo en cuenta las prácticas estándar de desarrollo de informes y que se ha probado exhaustivamente para que sea capaz de cumplir con los requisitos comerciales.
En otras palabras, un informe profesional de SSRS se diseña, desarrolla, prueba e implementa con mucho cuidado en el entorno de destino para asegurarse de que cumple el propósito y es beneficioso para el negocio.
Ejemplos
Un ejemplo simple de un informe profesional de SSRS es un informe de ventas mensual que brinda una idea de qué tan bien le está yendo a la empresa en términos de venta de sus servicios o productos.
Otro ejemplo de un informe SSRS desarrollado profesionalmente es un informe que muestra las transacciones comerciales diarias desde la perspectiva empresarial.
Frecuencia de informes SSRS profesionales
La frecuencia de un informe describe la frecuencia con la que se debe ejecutar este informe para mostrar las últimas cifras que luego se pueden enviar a los departamentos relacionados dentro de la empresa o a clientes externos.
La frecuencia de un informe profesional de SSRS puede ser una de las siguientes:
Informe diario
Un informe diario, como su nombre lo indica, debe ejecutarse diariamente para ser accedido o enviado a sus suscriptores internos y/o externos.
Informe semanal
Un informe que muestra las cifras semanales y se envía a los destinatarios cada semana.
Informe Mensual
Un informe mensual contiene datos de todo el mes y debe entregarse cada mes.
Informe Anual
Un informe anual brinda más información sobre los datos mediante el cálculo de cifras anuales para sus suscriptores y usuarios finales.
Informe basado en cualquier período financiero
Los informes que siguen a cualquier otro período financiero se incluyen en esta categoría.
Acerca de la frecuencia de los informes
Tenga en cuenta que el informe más importante en lo que respecta a la frecuencia es el informe diario.
De hecho, no se trata solo del informe:los datos que prepara diariamente para el informe también son importantes.
Si ha preparado datos para un informe diario, preparar datos para un informe semanal es lo mismo que ejecutar informes diarios para una semana completa. Un informe mensual, a su vez, es lo mismo que ejecutar un informe semanal cuatro veces.
Sin embargo, si solo se le pide que cree un informe mensual, también es aceptable preparar datos para el informe mensualmente, y se recomienda en algunas circunstancias sobre la preparación de datos diarios.
Los detalles de esto están más allá del alcance de este artículo, pero la razón por la que mencioné esto aquí es para resaltar la importancia de desarrollar un informe diario que requiere preparar datos para el informe diariamente. Esto también puede mostrar cómo preparar datos para informes semanales, mensuales y anuales.
La función de un procedimiento almacenado
Los procedimientos almacenados desempeñan un papel fundamental en los informes profesionales de SSRS, ya que obtienen los datos necesarios para el informe de la base de datos.
Los procedimientos almacenados brindan muchos beneficios cuando se usan para generar informes.
Lógica empresarial y procedimientos almacenados
Los procedimientos almacenados son muy recomendables para implementar la lógica empresarial de generación de informes.
Facilidad de prueba de unidad de base de datos
Los procedimientos almacenados pueden someterse a pruebas unitarias con facilidad para garantizar que cumplan con la especificación empresarial e implementen la lógica empresarial para el informe de SSRS.
Seguridad
El uso de procedimientos almacenados para ejecutar un informe requiere derechos de acceso al procedimiento almacenado requerido; esto se puede administrar con usuarios o roles de la base de datos.
Esta gestión de acceso para los procedimientos almacenados escritos para generar informes ayuda a crear una solución de informes segura en la que solo usuarios específicos pueden acceder y ejecutar los informes.
Mantenimiento
Los informes de SSRS basados en procedimientos almacenados son fáciles de mantener, ya que solo se requieren cambios en el procedimiento almacenado, sin necesidad de modificar ni realizar un seguimiento de los scripts de formato libre para los conjuntos de datos del informe.
Requisitos previos
Este artículo asume que los lectores están familiarizados con los conceptos básicos de los scripts T-SQL y los informes de bases de datos.
Lea el artículo Desarrollo de informes SSRS en palabras simples para obtener una comprensión rápida de cómo crear un informe de SSRS simple.
Configurar una base de datos de muestra (ITSales)
Para comenzar, creemos una base de datos de muestra llamada ITSales que contiene cifras de ventas de TI:
-- Create a sample database (ITSales) CREATE DATABASE ITSales; GO USE ITSales; -- (1) Create a monthly sale table in the sample database CREATE TABLE MonthlySale ( SaleId INT PRIMARY KEY IDENTITY (1, 1) ,SellingDate DATETIME2 ,Customer VARCHAR(50) ,Product VARCHAR(150) ,TotalPrice DECIMAL(10,2) ) GO -- (2) Populate the monthly sale table SET IDENTITY_INSERT [dbo].[MonthlySale] ON INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (1, N'2019-05-01 00:00:00', N'Asif', N'Dell Laptop', CAST(300.00 AS Decimal(10, 2))) INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (2, N'2019-05-02 00:00:00', N'Mike', N'Dell Laptop', CAST(300.00 AS Decimal(10, 2))) INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (3, N'2019-05-02 00:00:00', N'Adil', N'Lenovo Laptop', CAST(350.00 AS Decimal(10, 2))) INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (4, N'2019-05-03 00:00:00', N'Sarah', N'HP Laptop', CAST(250.00 AS Decimal(10, 2))) INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (5, N'2019-05-05 00:00:00', N'Asif', N'Dell Desktop', CAST(200.00 AS Decimal(10, 2))) INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (6, N'2019-05-10 00:00:00', N'Sam', N'HP Desktop', CAST(300.00 AS Decimal(10, 2))) INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (7, N'2019-05-12 00:00:00', N'Mike', N'iPad', CAST(250.00 AS Decimal(10, 2))) INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (8, N'2019-05-13 00:00:00', N'Mike', N'iPad', CAST(250.00 AS Decimal(10, 2))) INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (9, N'2019-05-20 00:00:00', N'Peter', N'Dell Laptop', CAST(350.00 AS Decimal(10, 2))) INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (10, N'2019-05-25 00:00:00', N'Peter', N'Asus Laptop', CAST(400.00 AS Decimal(10, 2))) INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (11, N'2019-06-03 00:00:00', N'Sarah', N'iPad', CAST(300.00 AS Decimal(10, 2))) INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (12, N'2019-06-05 00:00:00', N'Sam', N'Dell Laptop', CAST(350.00 AS Decimal(10, 2))) INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (13, N'2019-06-10 00:00:00', N'Akeel', N'Acer Laptop', CAST(300.00 AS Decimal(10, 2))) INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (14, N'2019-06-12 00:00:00', N'Asif', N'iPad', CAST(400.00 AS Decimal(10, 2))) INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (15, N'2019-06-14 00:00:00', N'Sarah', N'Lenovo Desktop', CAST(400.00 AS Decimal(10, 2))) INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (16, N'2019-06-15 00:00:00', N'Sahil', N'HP Desktop', CAST(500.00 AS Decimal(10, 2))) INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (17, N'2019-06-20 00:00:00', N'Akeel', N'iPad', CAST(350.00 AS Decimal(10, 2))) INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (18, N'2019-06-24 00:00:00', N'Mike', N'Dell Desktop', CAST(300.00 AS Decimal(10, 2))) INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (19, N'2019-06-25 00:00:00', N'Sahil', N'Lenovo Laptop', CAST(500.00 AS Decimal(10, 2))) INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (20, N'2019-06-26 00:00:00', N'Peter', N'Acer Laptop', CAST(350.00 AS Decimal(10, 2))) SET IDENTITY_INSERT [dbo].[MonthlySale] OFF
Requisitos, Análisis y Planificación
Antes de comenzar a trabajar en este proyecto, echemos un vistazo a los requisitos comerciales esperados para nuestro informe mensual y un análisis preliminar.
Declaración
El requisito comercial del informe mensual puede llegar a usted de la siguiente forma:
"Como usuario comercial, quiero ver un mensual informe de ventas”
Sugerencia
Busque las palabras clave en el requisito comercial, como mensual , diariamente o semanalmente para comprender qué frecuencia debe tener el informe resultante.
Análisis preliminar
Dado que se trata de un informe de ventas mensuales, requiere que los parámetros se suministren automáticamente en tiempo de ejecución o se basa en el código del procedimiento almacenado para calcular las ventas mensuales.
Un informe mensual muestra las cifras de un mes completo; esto significa que el informe debe tener en cuenta lo siguiente:
- El informe debe mostrar las cifras del mes anterior en función de la fecha actual
- El informe debe calcular dinámicamente el mes anterior del año en curso
Finalmente, tenemos que elegir el objeto de base de datos más adecuado. Y un procedimiento almacenado es la mejor opción para lidiar con este tipo de requisitos de informes comerciales.
Plan de Desarrollo
El plan de desarrollo es simple:
- Cree un procedimiento almacenado para mostrar las cifras de ventas mensuales
- Cree un informe de SSRS para mostrar las cifras de ventas mensuales según el procedimiento almacenado
Puede abordar esto de una de las siguientes maneras:
- Un procedimiento almacenado sin parámetros, y el procedimiento calcula tanto el período de tiempo del último mes como las ventas
- Un procedimiento almacenado con parámetros, donde el procedimiento calcula las ventas y el informe calcula el período de tiempo del último mes
Crear y ejecutar una prueba de un procedimiento almacenado de informes
Lo primero aquí sería crear un procedimiento almacenado que pueda cumplir con el requisito comercial.
Elección del procedimiento sin enfoque de parámetros
Aquí, cumpliremos con la especificación comercial mediante el uso de un procedimiento almacenado sin parámetros. Esto significa que no solo vamos a calcular las ventas utilizando el procedimiento almacenado, sino que también calcularemos el período de tiempo de ventas mensuales en función de la fecha actual dentro del procedimiento almacenado en lugar de hacerlo en tiempo de ejecución.
Subestimar la lógica del informe mensual
El informe mensual en realidad no significa "un informe de ventas del mes actual" porque el mes actual aún no está completo, por lo que tenemos que tratar con el último mes completo, es decir, el mes anterior.
Así es como se construyen la mayoría de los informes mensuales profesionales, a menos que se indique lo contrario.
Por ejemplo, si la fecha actual es el 6 de julio de 2019, esperamos que el informe de ventas mensual nos muestre las ventas de junio de 2019 porque junio es el último mes completo.
Diseño de la lógica del informe mensual
Hay muchas formas de diseñar la lógica de informes mensuales en T-SQL.
El concepto de StartDate y AfterEndDate
Este es el concepto más importante en los informes profesionales con frecuencias diarias, mensuales, semanales o anuales.
Tenemos que consultar las tablas de ventas desde una fecha de inicio hasta la fecha de finalización; esta última también se puede llamar después de la fecha de finalización .
Entonces, suponiendo que la fecha actual es el 6 de julio de 2019, debemos inicializar la fecha de inicio (StartDate) con el 01 de junio de 2019 y después de la fecha de finalización (AfterEndDate) con el 01 de julio de 2019, pero esto debe realizarse dinámicamente cada vez que se llama al procedimiento.
Cálculo de la fecha de finalización posterior
AfterEndDate es el día siguiente a la finalización del último mes.
Suponiendo que hoy sea el 6 de julio de 2019, AfterEndDate será el 1 de julio de 2019.
La forma más sencilla de lograr esto es usar DateFromParts() función que toma los parámetros de año, mes y día para configurar una fecha.
Ejecute el siguiente código T-SQL para obtener AfterEndDate usando DateFromParts() función:
DECLARE @CurrentYear INT ,@CurrentMonth INT , @AfterEndDate DATETIME SET @CurrentYear=YEAR(GETDATE()) SET @CurrentMontH=Month(GETDATE()) SET @AfterEndDate=DATEFROMPARTS(@CurrentYear,@CurrentMonth,1) SELECT GETDATE() AS CurrentDate,@AfterEndDate as Next_Day_After_Last_Complete_Month
La salida es la siguiente:
Cálculo de la fecha de inicio
La fecha de inicio (StartDate) es el primer día del último mes. Esto también se puede calcular con DATEFROMPARTS() función junto con DATEADD() función.
Restar un mes de AfterEndDate usando DATEADD() función, obtenemos la fecha de inicio del último mes.
Consulte el siguiente código T-SQL:
-- Computing StartDate and AfterEndDate for the monthly report DECLARE @CurrentYear INT ,@CurrentMonth INT , @AfterEndDate DATETIME , @StartDate DATETIME SET @CurrentYear=YEAR(GETDATE()) SET @CurrentMontH=Month(GETDATE()) SET @AfterEndDate=DATEFROMPARTS(@CurrentYear,@CurrentMonth,1) SET @StartDate=DATEADD(MM,-1,@AfterEndDate) -- Subtracting one month from AfterEndDate SELECT GETDATE() AS CurrentDate,@StartDate AS StartDate,@AfterEndDate as Next_Day_After_Last_Complete_Month
La salida es la siguiente:
El procedimiento almacenado ShowMonthlySales
Vamos a codificar el procedimiento almacenado de tal manera que calcule el período de tiempo correcto más las ventas mensuales según los cálculos anteriores, sin necesidad de parámetros.
Cree el procedimiento almacenado de la siguiente manera:
CREATE PROCEDURE ShowMonthlySales AS SET NOCOUNT ON BEGIN DECLARE @CurrentYear INT ,@CurrentMonth INT , @AfterEndDate DATETIME , @StartDate DATETIME SET @CurrentYear=YEAR(GETDATE()) SET @CurrentMontH=Month(GETDATE()) -- Calculating the first day of the current month SET @AfterEndDate=DATEFROMPARTS(@CurrentYear,@CurrentMonth,1) -- Calculating the first day of the last month SET @StartDate=DATEADD(MM,-1,@AfterEndDate) -- Subtracting one month from AfterEndDate -- Show sales from the first day of last month through the first day of the current month SELECT s.SellingDate,s.Customer,s.Product,s.TotalPrice FROM MonthlySale s where s.SellingDate>[email protected] and s.SellingDate<@AfterEndDate order by s.SellingDate END
Prueba:ejecución del procedimiento almacenado
Asumiendo que la fecha actual es 6 de julio de 2019 , ejecutemos el procedimiento almacenado en la base de datos de muestra ITSales para ver los resultados:
--Test-run the ShowMonthlySales procedure EXEC ShowMonthlySales
La salida es la siguiente:
¡Felicidades! Ha creado con éxito un procedimiento almacenado que puede ejecutarse detrás de un informe de ventas mensual profesional. Mientras permanezca intacto y los requisitos comerciales no cambien, el procedimiento funciona durante todo el año.
Cosas que hacer
Ahora que puede escribir procedimientos almacenados para informes mensuales, intente lo siguiente para mejorar aún más sus habilidades:
- Cree un procedimiento almacenado de informe para mostrar las cifras de ventas diarias en función de la fecha de inicio y después de la fecha de finalización lógica discutida en este artículo
- Teniendo en cuenta la lógica de ventas mensuales, intente crear un procedimiento de informe para las cifras de ventas anuales
- Cree un informe de SSRS para mostrar las ventas mensuales según el procedimiento almacenado mencionado en este artículo mientras usa los siguientes artículos como referencia:
- Creación de informes de SSRS centrados en el cliente con parámetros
- Desarrollo de informes SSRS en términos simples