Neste artigo, falaremos sobre relatórios profissionais do SQL Server Reporting Services, como criar procedimentos armazenados para que esses relatórios atendam aos requisitos de negócios e os benefícios de usar procedimentos armazenados para executar relatórios do SSRS.
Sobre os relatórios profissionais de SSRS
Vamos primeiro nos familiarizar com os relatórios profissionais do SSRS.
Definição simples
Um relatório SSRS profissional é um relatório criado com as práticas padrão de desenvolvimento de relatórios em mente e que foi exaustivamente testado para ser capaz de atender aos requisitos de negócios.
Em outras palavras, um relatório profissional de SSRS é cuidadosamente projetado, desenvolvido, testado e implantado no ambiente de destino para garantir que ele atenda ao propósito e seja benéfico para o negócio.
Exemplos
Um exemplo simples de um relatório profissional de SSRS é um relatório mensal de vendas que fornece uma visão de quão bem a empresa está se saindo em termos de venda de seus serviços ou produtos.
Outro exemplo de um relatório SSRS desenvolvido profissionalmente é um relatório que mostra as transações comerciais diárias da perspectiva do negócio.
Frequência de relatórios profissionais de SSRS
A frequência de um relatório descreve a frequência com que esse relatório deve ser executado para mostrar os números mais recentes que podem ser enviados aos departamentos relacionados dentro da empresa ou a clientes externos.
A frequência de um relatório profissional do SSRS pode ser uma das seguintes:
Relatório Diário
Um relatório diário, como o próprio nome indica, deve ser executado diariamente para ser acessado ou enviado aos seus assinantes internos e/ou externos.
Relatório semanal
Um relatório que mostra os números semanais e é enviado aos destinatários todas as semanas.
Relatório Mensal
Um relatório mensal contém dados para todo o mês e deve ser entregue a cada mês.
Relatório anual
Um relatório anual fornece mais informações sobre os dados calculando números anuais para seus assinantes e usuários finais.
Relatório com base em qualquer período financeiro
Os relatórios que seguem qualquer outro período financeiro estão nesta categoria.
Sobre a frequência dos relatórios
Por favor, tenha em mente que o relatório mais importante quando se trata de frequência é o relatório diário.
Na verdade, não é apenas o relatório – os dados que você prepara para o relatório diariamente também são importantes.
Se você preparou dados para um relatório diário, preparar dados para um relatório semanal é o mesmo que executar relatórios diários para uma semana inteira. Um relatório mensal, por sua vez, é o mesmo que executar um relatório semanal quatro vezes.
No entanto, se você for solicitado apenas a criar um relatório mensal, a preparação de dados para o relatório mensalmente também é aceitável e é recomendada em algumas circunstâncias em vez de preparar dados diários.
Os detalhes disso estão além do escopo deste artigo, mas a razão pela qual mencionei isso aqui é destacar a importância de desenvolver um relatório diário que requer a preparação de dados para o relatório diariamente. Isso também pode mostrar como preparar dados para relatórios semanais, mensais e anuais.
O papel de um procedimento armazenado
Os procedimentos armazenados desempenham um papel vital nos relatórios profissionais do SSRS, pois obtêm os dados necessários para o relatório do banco de dados.
Os procedimentos armazenados fornecem muitos benefícios quando usados para fins de relatório.
Lógica de negócios e procedimentos armazenados
Os procedimentos armazenados são altamente recomendados para implementar a lógica de negócios de relatórios.
Facilidade de teste de unidade de banco de dados
Os procedimentos armazenados podem ser facilmente testados em unidade para garantir que atendam à especificação de negócios e implementem a lógica de negócios para o relatório do SSRS.
Segurança
O uso de procedimentos armazenados para executar um relatório requer direitos de acesso ao procedimento armazenado necessário – isso pode ser gerenciado com usuários ou funções do banco de dados.
Esse gerenciamento de acesso para procedimentos armazenados escritos para fins de relatório ajuda a criar uma solução de relatório segura na qual apenas usuários específicos podem acessar e executar os relatórios.
Manutenção
Os relatórios do SSRS baseados em procedimentos armazenados são fáceis de manter, pois são necessárias apenas alterações no procedimento armazenado, sem a necessidade de modificar e acompanhar scripts de formato livre para os conjuntos de dados do relatório.
Pré-requisitos
Este artigo pressupõe que os leitores estejam familiarizados com os conceitos básicos de scripts T-SQL e relatórios de banco de dados.
Leia o artigo Desenvolvimento de relatórios SSRS em palavras simples para obter uma compreensão rápida de como criar um relatório simples do SSRS.
Configurar um banco de dados de amostra (ITSales)
Para começar, vamos criar um banco de dados de exemplo chamado ITSales que contém números de vendas 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álise e Planejamento
Antes de começar a trabalhar neste projeto, vamos dar uma olhada nos requisitos de negócios esperados para nosso relatório mensal e uma análise preliminar.
Declaração
O requisito de negócios de relatório mensal pode chegar a você da seguinte forma:
“Como usuário de negócios, quero ver um mensal relatório de vendas"
Dica
Procure as palavras-chave no requisito comercial, como mensal , diariamente ou semanal para entender qual a frequência que o relatório resultante deve ter.
Análise Preliminar
Como este é um relatório de vendas mensal, ele requer que os parâmetros sejam fornecidos em tempo de execução automaticamente ou se baseie no código do procedimento armazenado para calcular as vendas mensais.
Um relatório mensal mostra os números de um mês completo – isso significa que o relatório deve ter em mente o seguinte:
- O relatório deve mostrar números do mês anterior com base na data atual
- O relatório deve calcular dinamicamente o mês anterior do ano atual
Finalmente, temos que escolher o objeto de banco de dados mais adequado. E um procedimento armazenado é a melhor opção para lidar com esse tipo de requisito de relatório de negócios.
Plano de Desenvolvimento
O plano de desenvolvimento é simples:
- Crie um procedimento armazenado para mostrar os números de vendas mensais
- Crie um relatório de SSRS para mostrar os números de vendas mensais com base no procedimento armazenado
Você pode abordar isso de uma das seguintes maneiras:
- Um procedimento armazenado sem parâmetros, e o procedimento calcula o período do último mês e as vendas
- Um procedimento armazenado com parâmetros, em que o procedimento calcula as vendas e o relatório calcula o período do último mês
Criar e testar um procedimento armazenado de relatório
A primeira coisa aqui seria criar um procedimento armazenado que possa atender ao requisito de negócios.
Escolhendo o procedimento sem abordagem de parâmetros
Aqui, atenderemos à especificação de negócios usando um procedimento armazenado sem parâmetros. Isso significa que não apenas calcularemos as vendas usando o procedimento armazenado, mas também calcularemos o período mensal de vendas com base na data atual dentro do procedimento armazenado, em vez de fazê-lo em tempo de execução.
Como entender a lógica do relatório mensal
O relatório mensal não significa realmente “um relatório de vendas para o mês atual” porque o mês atual ainda não está completo, então temos que lidar com o último mês completo – ou seja, o mês anterior.
É assim que a maioria dos relatórios mensais profissionais são construídos, salvo indicação em contrário.
Por exemplo, se a data atual for 06 de julho de 2019, esperamos que o relatório de vendas mensal nos mostre as vendas de junho de 2019 porque junho é o último mês completo.
Projetando a lógica do relatório mensal
Há muitas maneiras de projetar lógica de relatório mensal em T-SQL.
O conceito de StartDate e AfterEndDate
Este é o conceito mais importante na reportagem profissional com frequência diária, mensal, semanal ou anual.
Temos que consultar as tabelas de vendas de uma data de início até a data de término – a última também pode ser chamada após a data de término .
Assim, assumindo que a data atual é 06 de julho de 2019, devemos inicializar a data de início (StartDate) com 01 de junho de 2019 e após a data de término (AfterEndDate) com 01 de julho de 2019, mas isso deve ser realizado dinamicamente cada vez que o procedimento for chamado.
Cálculo da data de término posterior
AfterEndDate é o próximo dia após o término do último mês.
Supondo que hoje seja 06 de julho de 2019, o AfterEndDate será 01 de julho de 2019.
A maneira mais simples de conseguir isso é usar DateFromParts() função que leva os parâmetros Ano, Mês e Dia para configurar uma data.
Execute o seguinte código T-SQL para obter AfterEndDate usando o DateFromParts() função:
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
A saída é a seguinte:
Cálculo da data de início
A Data de início (StartDate) é o primeiro dia do último mês. Isso também pode ser calculado pelo DATEFROMPARTS() função junto com o DATEADD() função.
Subtraindo um mês de AfterEndDate usando o DATEADD() função, obtemos a data de início do último mês.
Por favor, veja o seguinte 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
A saída é a seguinte:
O procedimento armazenado ShowMonthlySales
Vamos codificar o procedimento armazenado de forma que ele calcule o período de tempo correto mais as vendas mensais com base nos cálculos acima, sem a necessidade de parâmetros.
Crie o procedimento armazenado da seguinte maneira:
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
Teste-Executando o procedimento armazenado
Supondo que a data atual seja 06 de julho de 2019 , vamos executar o procedimento armazenado no banco de dados de amostra ITSales para ver os resultados:
--Test-run the ShowMonthlySales procedure EXEC ShowMonthlySales
A saída é a seguinte:
Parabéns! Você criou com sucesso um procedimento armazenado que pode ser executado por trás de um relatório de vendas mensal profissional. Contanto que permaneça intocado e os requisitos de negócios não mudem, o procedimento faz o trabalho ao longo do ano.
Coisas para fazer
Agora que você pode escrever procedimentos armazenados para relatórios mensais, tente as seguintes coisas para melhorar ainda mais suas habilidades:
- Crie um procedimento armazenado de relatório para mostrar os números de vendas diários com base na data de início e após a data de término lógica discutida neste artigo
- Tendo em mente a lógica de vendas mensais, tente criar um procedimento de relatório para os números de vendas anuais
- Crie um relatório de SSRS para mostrar as vendas mensais com base no procedimento armazenado mencionado neste artigo usando os seguintes artigos como referência:
- Criando relatórios de SSRS focados no cliente com parâmetros
- Desenvolvimento de relatórios SSRS em termos simples