Database
 sql >> Base de Dados >  >> RDS >> Database

Como gravar procedimentos armazenados para relatórios profissionais do SSRS


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:
  1. O relatório deve mostrar números do mês anterior com base na data atual
  2. 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:
  1. Crie um procedimento armazenado para mostrar os números de vendas mensais
  2. 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:
  1. Um procedimento armazenado sem parâmetros, e o procedimento calcula o período do último mês e as vendas
  2. 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:
  1. 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
  2. Tendo em mente a lógica de vendas mensais, tente criar um procedimento de relatório para os números de vendas anuais
  3. 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