Database
 sql >> Database >  >> RDS >> Database

Come scrivere procedure archiviate per rapporti SSRS professionali

In questo articolo parleremo dei report professionali di SQL Server Reporting Services, di come creare stored procedure per soddisfare i requisiti aziendali e dei vantaggi dell'utilizzo di stored procedure per l'esecuzione dietro i report SSRS.

Informazioni sui rapporti SSRS professionali

Per prima cosa acquisiamo familiarità con i rapporti SSRS professionali.

Definizione semplice

Un rapporto SSRS professionale è un rapporto creato tenendo conto delle pratiche standard di sviluppo del rapporto e che è stato accuratamente testato per essere in grado di soddisfare i requisiti aziendali.

In altre parole, un report SSRS professionale è progettato, sviluppato, testato e distribuito con molta attenzione nell'ambiente di destinazione per assicurarsi che serva allo scopo e sia vantaggioso per l'azienda.

Esempi

Un semplice esempio di report SSRS professionale è un report mensile sulle vendite che fornisce informazioni dettagliate sull'andamento dell'azienda in termini di vendita dei propri servizi o prodotti.

Un altro esempio di rapporto SSRS sviluppato professionalmente è un rapporto che mostra le transazioni commerciali quotidiane dal punto di vista commerciale.

Frequenza dei rapporti SSRS professionali

La frequenza di un rapporto descrive la frequenza con cui questo rapporto dovrebbe essere eseguito per mostrare i dati più recenti che possono quindi essere inviati ai dipartimenti correlati all'interno dell'azienda oa clienti esterni.

La frequenza di un rapporto SSRS professionale può essere una delle seguenti:

Rapporto giornaliero

Un report giornaliero, come indica il nome, deve essere eseguito quotidianamente per poter essere consultato o inviato ai suoi abbonati interni e/o esterni.

Rapporto settimanale

Un report che mostra i dati settimanali e viene inviato ai destinatari ogni settimana.

Rapporto mensile

Un rapporto mensile contiene i dati per l'intero mese e deve essere consegnato ogni mese.

Rapporto annuale

Un rapporto annuale fornisce maggiori informazioni sui dati calcolando le cifre annuali per i suoi abbonati e utenti finali.

Rendiconto basato su qualsiasi periodo finanziario

Rientrano in questa categoria i rapporti che seguono qualsiasi altro periodo finanziario.

Informazioni sulla frequenza dei rapporti

Tieni presente che il rapporto più importante per quanto riguarda la frequenza è il rapporto giornaliero.

In effetti, non è solo il rapporto:anche i dati che prepari per il rapporto su base giornaliera sono importanti.

Se hai preparato i dati per un rapporto giornaliero, preparare i dati per un rapporto settimanale equivale a eseguire rapporti giornalieri per un'intera settimana. Un rapporto mensile, a sua volta, equivale a eseguire un rapporto settimanale quattro volte.

Tuttavia, se ti viene chiesto solo di creare un rapporto mensile, anche la preparazione dei dati per il rapporto su base mensile è accettabile ed è consigliata in alcune circostanze rispetto alla preparazione dei dati giornalieri.

I dettagli di ciò esulano dallo scopo di questo articolo, ma il motivo per cui l'ho menzionato qui è per evidenziare l'importanza di sviluppare un rapporto quotidiano che richiede la preparazione dei dati per il rapporto su base giornaliera. Questo può anche mostrare come preparare i dati per i rapporti settimanali, mensili e annuali.

Il ruolo di una stored procedure

Le stored procedure svolgono un ruolo fondamentale nei rapporti SSRS professionali poiché ottengono i dati richiesti per il rapporto dal database.

Le stored procedure offrono molti vantaggi se utilizzate a fini di reporting.

Logica aziendale e stored procedure

Le stored procedure sono altamente consigliate per implementare la logica aziendale di reporting.

Facilità di test delle unità di database

Le stored procedure possono essere facilmente testate per garantire che soddisfino le specifiche aziendali e implementino la logica aziendale per il report SSRS.

Sicurezza

L'utilizzo delle procedure memorizzate per eseguire un rapporto richiede diritti di accesso alla procedura memorizzata richiesta, che può essere gestita con utenti o ruoli del database.

Questa gestione dell'accesso per le procedure archiviate scritte a scopo di reporting aiuta a creare una soluzione di reporting protetta in cui solo utenti specifici possono accedere ed eseguire i rapporti.

Manutenzione

I report SSRS basati sulle procedure memorizzate sono facili da gestire poiché sono necessarie solo modifiche alla procedura memorizzata, senza la necessità di modificare e tenere traccia degli script in formato libero per i set di dati dei report.

Prerequisiti

Questo articolo presuppone che i lettori abbiano familiarità con le nozioni di base degli script T-SQL e dei rapporti sui database.

Si prega di leggere l'articolo Sviluppo di rapporti SSRS in parole semplici per comprendere rapidamente come creare un semplice rapporto SSRS.

Imposta un database di esempio (ITSales)

Per iniziare, creiamo un database di esempio chiamato ITSales che contiene i dati sulle vendite IT:

-- 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

Requisiti, analisi e pianificazione

Prima di iniziare a lavorare su questo progetto, diamo un'occhiata ai requisiti aziendali previsti per il nostro rapporto mensile e un'analisi preliminare.

Dichiarazione

Il requisito aziendale per il rapporto mensile può venire a te nel seguente formato:

"Come utente business voglio visualizzare un mensile rapporto sulle vendite”

Suggerimento

Cerca le parole chiave nel requisito aziendale come mensile , ogni giorno o settimanale per capire quale frequenza dovrebbe avere il rapporto risultante.

Analisi preliminare

Poiché si tratta di un rapporto sulle vendite mensili, richiede che i parametri vengano forniti automaticamente in fase di esecuzione o si basa sul codice della procedura memorizzata per calcolare le vendite mensili.

Un rapporto mensile mostra i dati di un mese intero, ciò significa che il rapporto dovrebbe tenere a mente quanto segue:

  1. Il rapporto deve mostrare i dati del mese precedente in base alla data corrente
  2. Il rapporto deve calcolare dinamicamente il mese precedente dell'anno in corso

Infine, dobbiamo scegliere l'oggetto database più adatto. E una procedura memorizzata è l'opzione migliore per far fronte a questo tipo di obbligo di reporting aziendale.

Piano di sviluppo

Il piano di sviluppo è semplice:

  1. Crea una stored procedure per mostrare i dati sulle vendite mensili
  2. Crea un report SSRS per mostrare i dati sulle vendite mensili in base alla stored procedure

Puoi avvicinarti a questo in uno dei seguenti modi:

  1. Una procedura memorizzata senza parametri e la procedura calcola sia il periodo dell'ultimo mese che le vendite
  2. Una procedura memorizzata con parametri, in cui la procedura calcola le vendite e il report calcola il periodo di tempo dell'ultimo mese

Creare e testare una procedura archiviata di report

La prima cosa qui sarebbe creare una stored procedure in grado di soddisfare i requisiti aziendali.

Scelta della procedura senza approccio parametrico

Qui, soddisferemo le specifiche aziendali utilizzando una procedura memorizzata senza parametri. Ciò significa che non solo calcoleremo le vendite utilizzando la stored procedure, ma calcoleremo anche il periodo di vendita mensile in base alla data corrente all'interno della stored procedure anziché farlo in fase di esecuzione.

Comprensione della logica del rapporto mensile

Il rapporto mensile in realtà non significa "un rapporto sulle vendite per il mese corrente" perché il mese corrente non è ancora completo, quindi dobbiamo occuparci dell'ultimo mese completo, ovvero il mese precedente.

Questo è il modo in cui viene creata la maggior parte dei rapporti mensili professionali, se non diversamente indicato.

Ad esempio, se la data corrente è il 06 luglio 2019, ci aspettiamo che il rapporto sulle vendite mensili ci mostri le vendite di giugno 2019 perché giugno è l'ultimo mese completo.

Progettazione della logica del report mensile

Esistono molti modi per progettare la logica dei rapporti mensili in T-SQL.

Il concetto di StartDate e AfterEndDate

Questo è il concetto più importante nel reporting professionale con frequenze giornaliere, mensili, settimanali o annuali.

Dobbiamo interrogare le tabelle di vendita da una data di inizio fino alla data di fine:quest'ultima può anche essere chiamata dopo la data di fine .

Quindi, supponendo che la data corrente sia il 06 luglio 2019, dobbiamo inizializzare la data di inizio (StartDate) con 01 Jun 2019 e dopo la data di fine (AfterEndDate) con 01 Jul 2019, ma questo dovrebbe essere eseguito dinamicamente ogni volta che viene chiamata la procedura.

Calcolo della data di fine successiva

AfterEndDate è il giorno successivo alla fine dell'ultimo mese.

Supponendo che oggi sia il 06 luglio 2019, l'AfterEndDate sarà il 01 luglio 2019.

Il modo più semplice per ottenere ciò è utilizzare DateFromParts() funzione che utilizza i parametri Anno, Mese e Giorno per impostare una data.

Esegui il seguente codice T-SQL per ottenere AfterEndDate utilizzando DateFromParts() funzione:

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

L'output è il seguente:

Calcolo della data di inizio

La data di inizio (StartDate) è il primo giorno dell'ultimo mese. Questo può essere calcolato anche da DATEFROMPARTS() funzione insieme a DATEADD() funzione.

Sottraendo un mese da AfterEndDate utilizzando DATEADD() funzione, otteniamo la data di inizio dell'ultimo mese.

Si prega di consultare il seguente codice 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

L'output è il seguente:

La procedura memorizzata ShowMonthlySales

Codificheremo la procedura memorizzata in modo tale da calcolare il periodo di tempo corretto più le vendite mensili in base ai calcoli precedenti, senza la necessità di parametri.

Creare la procedura memorizzata come segue:

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

Test-esecuzione della procedura memorizzata

Supponendo che la data corrente sia 06 luglio 2019 , eseguiamo la procedura memorizzata sul database di esempio ITSales per vedere i risultati:

--Test-run the ShowMonthlySales procedure
EXEC ShowMonthlySales

L'output è il seguente:

Congratulazioni! Hai creato con successo una procedura memorizzata che può essere eseguita dietro un rapporto di vendita mensile professionale. Finché rimane intatta e i requisiti aziendali non cambiano, la procedura fa il suo lavoro durante tutto l'anno.

Cose da fare

Ora che puoi scrivere procedure archiviate per rapporti mensili, prova le seguenti cose per migliorare ulteriormente le tue competenze:

  1. Crea una stored procedure di report per mostrare i dati sulle vendite giornaliere in base alla data di inizio e dopo la data di fine logica discussa in questo articolo
  2. Tenendo presente la logica delle vendite mensili, prova a creare una procedura di report per i dati sulle vendite annuali
  3. Crea un report SSRS per mostrare le vendite mensili in base alla stored procedure menzionata in questo articolo utilizzando i seguenti articoli come riferimento:
  • Creazione di report SSRS incentrati sul cliente con parametri
  • Sviluppo di rapporti SSRS in termini semplici