sql >> Database >  >> RDS >> Database

Opgeslagen procedures schrijven voor professionele SSRS-rapporten

In dit artikel zullen we het hebben over professionele SQL Server Reporting Services-rapporten, hoe u opgeslagen procedures voor deze rapporten kunt maken om aan de zakelijke vereisten te voldoen, en de voordelen van het gebruik van opgeslagen procedures om achter SSRS-rapporten te draaien.

Over professionele SSRS-rapporten

Laten we eerst vertrouwd raken met professionele SSRS-rapporten.

Eenvoudige definitie

Een professioneel SSRS-rapport is een rapport dat is gemaakt met de standaardpraktijken voor rapportontwikkeling in gedachten en dat grondig is getest om te voldoen aan de zakelijke vereisten.

Met andere woorden, een professioneel SSRS-rapport is zeer zorgvuldig ontworpen, ontwikkeld, getest en geïmplementeerd in de doelomgeving om er zeker van te zijn dat het het doel dient en gunstig is voor het bedrijf.

Voorbeelden

Een eenvoudig voorbeeld van een professioneel SSRS-rapport is een maandelijks verkooprapport dat inzicht geeft in hoe goed het bedrijf het doet wat betreft de verkoop van zijn diensten of producten.

Een ander voorbeeld van een professioneel ontwikkeld SSRS-rapport is een rapport dat dagelijkse zakelijke transacties weergeeft vanuit het zakelijke perspectief.

Frequentie van professionele SSRS-rapporten

De frequentie van een rapport beschrijft hoe vaak dit rapport moet worden uitgevoerd om de laatste cijfers te tonen, die vervolgens kunnen worden verzonden naar gerelateerde afdelingen binnen het bedrijf of naar externe klanten.

De frequentie van een professioneel SSRS-rapport kan een van de volgende zijn:

Dagelijks rapport

Een dagelijks rapport, zoals de naam al aangeeft, moet dagelijks worden uitgevoerd om toegang te krijgen tot of verzonden te worden naar de interne en/of externe abonnees.

Wekelijks rapport

Een rapport dat weekcijfers toont en wekelijks naar de ontvangers wordt gestuurd.

Maandrapport

Een maandrapport bevat gegevens voor de hele maand en is bedoeld om elke maand te worden opgeleverd.

Jaarverslag

Een jaarrapportage geeft meer inzicht in de data door jaarcijfers te berekenen voor haar abonnees en eindgebruikers.

Rapport gebaseerd op een financiële periode

Rapporten die volgen op een andere financiële periode vallen onder deze categorie.

Over de frequentie van rapporten

Houd er rekening mee dat het belangrijkste rapport als het gaat om frequentie, het dagelijkse rapport is.

In feite is het niet alleen het rapport - de gegevens die u dagelijks voorbereidt voor het rapport zijn ook belangrijk.

Als u gegevens voor een dagelijks rapport hebt voorbereid, is het voorbereiden van gegevens voor een weekrapport hetzelfde als het uitvoeren van dagelijkse rapporten voor een hele week. Een maandelijks rapport is op zijn beurt hetzelfde als vier keer een wekelijks rapport uitvoeren.

Als u echter alleen wordt gevraagd om een ​​maandelijks rapport te maken, is het ook acceptabel om maandelijks gegevens voor het rapport op te stellen, en in sommige omstandigheden wordt dit aanbevolen boven het voorbereiden van dagelijkse gegevens.

De details hiervan vallen buiten het bestek van dit artikel, maar de reden dat ik dit hier vermeld, is om het belang te benadrukken van het ontwikkelen van een dagelijks rapport, waarvoor wel dagelijks gegevens voor het rapport moeten worden voorbereid. Dit kan ook laten zien hoe u gegevens voorbereidt voor wekelijkse, maandelijkse en jaarlijkse rapporten.

De rol van een opgeslagen procedure

Opgeslagen procedures spelen een cruciale rol in professionele SSRS-rapporten, omdat ze de vereiste gegevens voor het rapport uit de database halen.

Opgeslagen procedures bieden veel voordelen wanneer ze worden gebruikt voor rapportagedoeleinden.

Zakelijke logica en opgeslagen procedures

Opgeslagen procedures worden ten zeerste aanbevolen om bedrijfslogica voor rapportage te implementeren.

Eenvoudig testen van database-eenheden

Opgeslagen procedures kunnen eenvoudig per unit worden getest om ervoor te zorgen dat ze voldoen aan de bedrijfsspecificaties en om bedrijfslogica voor het SSRS-rapport te implementeren.

Beveiliging

Het gebruik van opgeslagen procedures om een ​​rapport uit te voeren vereist toegangsrechten tot de vereiste opgeslagen procedure - dit kan worden beheerd met databasegebruikers of -rollen.

Dit toegangsbeheer voor opgeslagen procedures die zijn geschreven voor rapportagedoeleinden, helpt bij het bouwen van een beveiligde rapportageoplossing waarin alleen specifieke gebruikers toegang hebben tot de rapporten en deze kunnen uitvoeren.

Onderhoud

SSRS-rapporten op basis van opgeslagen procedures zijn eenvoudig te onderhouden, omdat alleen wijzigingen in de opgeslagen procedure nodig zijn, zonder de noodzaak om scripts in vrije vorm voor de rapportgegevenssets aan te passen en bij te houden.

Vereisten

Dit artikel gaat ervan uit dat de lezers bekend zijn met de basisprincipes van T-SQL-scripts en databaserapportage.

Lees het artikel SSRS rapporteert ontwikkeling in eenvoudige woorden om snel inzicht te krijgen in het maken van een eenvoudig SSRS-rapport.

Een voorbeelddatabase instellen (ITSales)

Laten we om te beginnen een voorbeelddatabase maken met de naam ITSales die IT-verkoopcijfers bevat:

-- Maak een voorbeelddatabase (ITSales)CREATE DATABASE ITSales;GOUSE ITSales;-- (1) Maak een maandelijkse verkooptabel in de voorbeelddatabaseCREATE TABLE MonthlySale ( SaleId INT PRIMARY KEY IDENTITY (1, 1) ,SellingDate DATETIME2 , Klant VARCHAR(50) ,Product VARCHAR(150) ,TotalPrice DECIMAL(10,2))GO-- (2) Vul de tabel met maandelijkse verkoopSET IDENTITY_INSERT [dbo].[MonthlySale] ONINSERT INTO [dbo].[MonthlySale] ([ SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) WAARDEN (1, N'2019-05-01 00:00:00', N'Asif', N'Dell Laptop', CAST( 300.00 AS decimaal(10, 2)))INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) WAARDEN (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], [ Klant], [Product], [Totale Prijs]) WAARDEN (3, N'2019-05-02 00:00:00', N'Adil', N'Lenovo Laptop', CAST(350.00 AS Decimaal(10, 2) ))INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Cu stomer], [Product], [TotalPrice]) WAARDEN (4, N'2019-05-03 00:00:00', N'Sarah', N'HP Laptop', CAST(250.00 AS Decimaal(10, 2) ))INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) WAARDEN (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]) WAARDEN (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]) WAARDEN (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]) WAARDEN (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 ], [Klant], [Product], [Totale prijs]) WAARDEN (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]) WAARDEN (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]) WAARDEN (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], [Totale Prijs]) WAARDEN (13, N'2019-06-10 00:00:00', N'Akeel', N'Acer Laptop', CAST (300.00 AS Decimaal (10, 2)))INVOEG IN [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) WAARDEN (14, N'2019-06-12 00:00:00', N'Asif' , N'iPad', CAST(400.00 AS decimaal(10, 2)))INSERT INTO [dbo].[MonthlySale] ([Sal eId], [SellingDate], [Customer], [Product], [TotalPrice]) VALUES (15, N'2019-06-14 00:00:00', N'Sarah', N'Lenovo Desktop', CAST( 400.00 AS decimaal(10, 2)))INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) WAARDEN (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], [ Klant], [Product], [Totale Prijs]) WAARDEN (17, N'2019-06-20 00:00:00', N'Akeel', N'iPad', CAST(350.00 AS Decimaal(10, 2)) )INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice]) WAARDEN (18, N'2019-06-24 00:00:00', N 'Mike', N'Dell Desktop', CAST (300.00 AS decimaal (10, 2)))INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Product], [TotalPrice ]) WAARDEN (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]) WAARDE S (20, N'2019-06-26 00:00:00', N'Peter', N'Acer Laptop', CAST(350.00 AS Decimal(10, 2)))SET IDENTITY_INSERT [dbo].[MaandelijkseSale] UIT

Vereisten, analyse en planning

Laten we, voordat u aan dit project begint, eens kijken naar de verwachte zakelijke vereisten voor ons maandelijkse rapport en een voorlopige analyse.

Verklaring

De zakelijke vereisten voor het maandelijkse rapport kunnen in de volgende vorm naar u toe komen:

"Als zakelijke gebruiker wil ik een maandelijks verkooprapport”

Hint

Zoek de zoekwoorden in de zakelijke vereisten, zoals maandelijks , dagelijks of wekelijks om te begrijpen welke frequentie het resulterende rapport zou moeten hebben.

Voorlopige analyse

Aangezien dit een maandelijks verkooprapport is, vereist het ofwel dat parameters automatisch worden opgegeven tijdens runtime, ofwel is het afhankelijk van de code van de opgeslagen procedure om de maandelijkse verkoop te berekenen.

Een maandelijks rapport toont cijfers voor een volledige maand - dit betekent dat het rapport de volgende dingen in gedachten moet houden:

  1. Het rapport moet cijfers van de vorige maand tonen op basis van de huidige datum
  2. Het rapport moet de vorige maand van het huidige jaar dynamisch berekenen

Ten slotte moeten we het meest geschikte database-object kiezen. En een opgeslagen procedure is de beste optie om met dit soort zakelijke rapportagevereisten om te gaan.

Ontwikkelingsplan

Het ontwikkelingsplan is eenvoudig:

  1. Maak een opgeslagen procedure om maandelijkse verkoopcijfers weer te geven
  2. Maak een SSRS-rapport om maandelijkse verkoopcijfers te tonen op basis van de opgeslagen procedure

U kunt dit op een van de volgende manieren benaderen:

  1. Een opgeslagen procedure zonder parameters, en de procedure berekent zowel de periode van de afgelopen maand als de verkoop
  2. Een opgeslagen procedure met parameters, waarbij de procedure de verkoop berekent en het rapport de periode van de afgelopen maand berekent

Een in een rapport opgeslagen procedure maken en testen

Het eerste wat hier zou moeten zijn, is een opgeslagen procedure maken die aan de zakelijke vereisten kan voldoen.

De procedure kiezen zonder parameterbenadering

Hier zullen we voldoen aan de bedrijfsspecificatie door een opgeslagen procedure zonder parameters te gebruiken. Dit betekent dat we niet alleen de verkoop gaan berekenen met behulp van de opgeslagen procedure, maar dat we ook de maandelijkse verkoopperiode berekenen op basis van de huidige datum in de opgeslagen procedure in plaats van dit tijdens runtime te doen.

De logica van het maandelijkse rapport onderschatten

Het maandrapport betekent niet echt 'een verkooprapport voor de huidige maand' omdat de huidige maand nog niet compleet is, dus we hebben te maken met de laatste volledige maand, dat wil zeggen de vorige maand.

Dit is hoe de meeste professionele maandelijkse rapporten zijn opgebouwd, tenzij anders vermeld.

Als de huidige datum bijvoorbeeld 6 juli 2019 is, verwachten we dat het maandelijkse verkooprapport ons de verkopen voor juni 2019 laat zien, omdat juni de laatste volledige maand is.

De logica van het maandelijkse rapport ontwerpen

Er zijn veel manieren om maandelijkse rapportlogica in T-SQL te ontwerpen.

Het concept van StartDate en AfterEndDate

Dit is het belangrijkste concept in professionele rapportage met dagelijkse, maandelijkse, wekelijkse of jaarlijkse frequenties.

We moeten de verkooptabellen opvragen vanaf een startdatum tot en met de einddatum - de laatste kan ook na einddatum worden genoemd .

Dus, ervan uitgaande dat de huidige datum 06 juli 2019 is, moeten we de startdatum (StartDate) initialiseren met 01 Jun 2019 en na de einddatum (AfterEndDate) met 01 Jul 2019, maar dit moet dynamisch worden uitgevoerd telkens wanneer de procedure wordt aangeroepen.

De na-einddatum berekenen

AfterEndDate is de volgende dag nadat de laatste maand is afgelopen.

Ervan uitgaande dat het vandaag 06 juli 2019 is, zal de AfterEndDate 01 juli 2019 zijn.

De eenvoudigste manier om dit te bereiken is door DateFromParts() . te gebruiken functie die de parameters Jaar, Maand en Dag nodig heeft om een ​​datum in te stellen.

Voer de volgende T-SQL-code uit om AfterEndDate te krijgen met behulp van de DateFromParts() functie:

DECLARE @CurrentYear INT,@CurrentMonth INT, @AfterEndDate DATETIMESET @CurrentYear=YEAR(GETDATE())SET @CurrentMontH=Maand(GETDATE())SET @AfterEndDate=DATEFROMPARTS(@CurrentTDATE,1)SELECT () AS CurrentDate,@AfterEndDate als Next_Day_After_Last_Complete_Month

De uitvoer is als volgt:

De startdatum berekenen

De Startdatum (StartDate) is de eerste dag van de laatste maand. Dit kan ook worden berekend door de DATEFROMPARTS() functie samen met de DATEADD() functie.

Een maand aftrekken van AfterEndDate door de DATEADD() . te gebruiken functie, krijgen we de startdatum van de afgelopen maand.

Zie de volgende T-SQL-code:

-- StartDate en AfterEndDate berekenen voor het maandelijkse rapportDECLARE @CurrentYear INT,@CurrentMonth INT, @AfterEndDate DATETIME, @StartDate DATETIMESET @CurrentYear=YEAR(GETDATE())SET @CurrentMontH=Month(GETDATEEndDate @ =DATEFROMPARTS(@CurrentYear,@CurrentMonth,1)SET @StartDate=DATEADD(MM,-1,@AfterEndDate) -- Een maand aftrekken van AfterEndDateSELECT GETDATE() AS CurrentDate,@StartDate AS StartDate,@AfterEndDate als Next_Day_AfterEnd_Last_Complete 

De uitvoer is als volgt:

De opgeslagen procedure ShowMonthlySales

We gaan de opgeslagen procedure zo coderen dat deze de juiste tijdsperiode plus de maandelijkse verkopen berekent op basis van de bovenstaande berekeningen, zonder dat er parameters nodig zijn.

Maak de opgeslagen procedure als volgt:

PROCEDURE MAKEN ShowMonthlySalesASSET NOCOUNT ONBEGINDECLARE @CurrentYear INT,@CurrentMonth INT, @AfterEndDate DATETIME, @StartDate DATETIMESET @CurrentYear=YEAR(GETDATE())SET @CurrentMontH=Maand)-GETDATE() huidige maandSET @AfterEndDate=DATEFROMPARTS(@CurrentYear,@CurrentMonth,1)-- De eerste dag van de laatste maand berekenenSET @StartDate=DATEADD(MM,-1,@AfterEndDate) -- Een maand aftrekken van AfterEndDate-- Verkoop weergeven van de eerste dag van de vorige maand tot en met de eerste dag van de huidige maandSELECT s.SellingDate,s.Customer,s.Product,s.TotalPrice FROM MonthlySale swhere s.SellingDate>[email protected] en s.SellingDate<@AfterEndDateorder by s .VerkoopdatumEND

Test uitvoeren van de opgeslagen procedure

Ervan uitgaande dat de huidige datum 06 juli 2019 is , laten we de opgeslagen procedure uitvoeren op de voorbeelddatabase ITSales om de resultaten te zien:

--Test-run de ShowMonthlySales procedureEXEC ShowMonthlySales

De uitvoer is als volgt:

Gefeliciteerd! U hebt met succes een opgeslagen procedure gemaakt die kan worden uitgevoerd achter een professioneel maandelijks verkooprapport. Zolang het onaangeroerd blijft en de zakelijke vereisten niet veranderen, werkt de procedure het hele jaar door.

Dingen om te doen

Nu u opgeslagen procedures voor maandelijkse rapporten kunt schrijven, kunt u het volgende proberen om uw vaardigheden verder te verbeteren:

  1. Maak een in het rapport opgeslagen procedure om dagelijkse verkoopcijfers te tonen op basis van de startdatum en na einddatum logica besproken in dit artikel
  2. Houd de logica van de maandelijkse verkoop in gedachten en probeer een rapportprocedure te maken voor jaarlijkse verkoopcijfers
  3. Maak een SSRS-rapport om de maandelijkse verkopen weer te geven op basis van de opgeslagen procedure die in dit artikel wordt genoemd, terwijl u de volgende artikelen als referentie gebruikt:
  • Klantgerichte SSRS-rapporten maken met parameters
  • SSRS rapporteert ontwikkeling in eenvoudige bewoordingen

  1. Impact van EM SQL-monitor

  2. Oracle reguliere expressies. Gevaarlijk bereik

  3. Django cache.set() veroorzaakt dubbele sleutelfout

  4. Hoe de MySQL-gegevensmap wijzigen?