sql >> Databasteknik >  >> RDS >> Database

Hur man skriver lagrade procedurer för professionella SSRS-rapporter

I den här artikeln kommer vi att prata om professionella SQL Server Reporting Services-rapporter, hur man skapar lagrade procedurer för dessa rapporter för att möta affärskrav och fördelarna med att använda lagrade procedurer för att köra bakom SSRS-rapporter.

Om professionella SSRS-rapporter

Låt oss först bekanta oss med professionella SSRS-rapporter.

Enkel definition

En professionell SSRS-rapport är en rapport skapad med standardpraxis för rapportutveckling i åtanke och som har testats noggrant för att kunna uppfylla affärskrav.

Med andra ord är en professionell SSRS-rapport mycket noggrant utformad, utvecklad, testad och distribuerad till målmiljön för att säkerställa att den tjänar syftet och är till nytta för verksamheten.

Exempel

Ett enkelt exempel på en professionell SSRS-rapport är en månatlig försäljningsrapport som ger en inblick i hur bra verksamheten går när det gäller att sälja sina tjänster eller produkter.

Ett annat exempel på en professionellt utvecklad SSRS-rapport är en rapport som visar dagliga affärstransaktioner ur ett affärsperspektiv.

Frekvens för professionella SSRS-rapporter

Frekvensen av en rapport beskriver hur ofta denna rapport ska köras för att visa de senaste siffrorna som sedan kan skickas till relaterade avdelningar inom företaget eller till externa kunder.

Frekvensen för en professionell SSRS-rapport kan vara något av följande:

Daglig rapport

En daglig rapport, som namnet anger, måste köras dagligen för att nås eller skickas till dess interna och/eller externa abonnenter.

Veckorapport

En rapport som visar veckosiffror och skickas till mottagarna varje vecka.

Månadsrapport

En månadsrapport innehåller data för hela månaden och är tänkt att levereras varje månad.

Årsrapport

En årsrapport ger mer insikt i data genom att beräkna årliga siffror för dess abonnenter och slutanvändare.

Rapport baserad på valfri räkenskapsperiod

Rapporter som följer någon annan räkenskapsperiod faller under denna kategori.

Om frekvensen av rapporter

Tänk på att den viktigaste rapporten när det kommer till frekvens är den dagliga rapporten.

Faktum är att det inte bara är rapporten – den data du förbereder för rapporten på daglig basis är också viktig.

Om du har förberett data för en daglig rapport, är att förbereda data för en veckorapport detsamma som att köra dagliga rapporter för en hel vecka. En månadsrapport är i sin tur detsamma som att köra en veckorapport fyra gånger.

Men om du bara blir ombedd att skapa en månadsrapport, är det också acceptabelt att förbereda data för rapporten på månadsbasis, och det rekommenderas i vissa fall framför att förbereda dagliga data.

Detaljerna i detta ligger utanför ramen för denna artikel, men anledningen till att jag nämnde detta här är för att belysa vikten av att utveckla en daglig rapport som kräver att man förbereder data för rapporten på en daglig basis. Detta kan också visa hur man förbereder data för vecko-, månads- och årsrapporter.

Rollen för en lagrad procedur

Lagrade procedurer spelar en viktig roll i professionella SSRS-rapporter eftersom de får de nödvändiga uppgifterna för rapporten från databasen.

Lagrade procedurer ger många fördelar när de används för rapporteringsändamål.

Affärslogik och lagrade procedurer

Lagrade procedurer rekommenderas starkt för att implementera affärslogik för rapportering.

Lätt att testa databasenhet

Lagrade procedurer kan enkelt enhetstestas för att säkerställa att de uppfyller affärsspecifikationen och implementerar affärslogik för SSRS-rapporten.

Säkerhet

Att använda lagrade procedurer för att köra en rapport kräver åtkomsträttigheter till den nödvändiga lagrade proceduren – detta kan hanteras med databasanvändare eller roller.

Denna åtkomsthantering för lagrade procedurer skrivna för rapporteringsändamål hjälper till att bygga en säker rapporteringslösning där endast specifika användare kan komma åt och köra rapporterna.

Underhåll

SSRS-rapporter baserade på lagrade procedurer är lätta att underhålla eftersom endast ändringar i den lagrade proceduren krävs, utan att behöva ändra och hålla reda på skript i fritt format för rapportdatauppsättningarna.

Förutsättningar

Den här artikeln förutsätter att läsarna är bekanta med grunderna i T-SQL-skript och databasrapportering.

Läs artikeln SSRS Reports Development in Simple Words för att få en snabb förståelse för hur man skapar en enkel SSRS-rapport.

Konfigurera en exempeldatabas (ITSales)

För att komma igång, låt oss skapa en exempeldatabas med namnet ITSales som innehåller IT-försäljningssiffror:

-- Skapa en exempeldatabas (ITSales)CREATE DATABASE ITSales;GOUSE ITSales;-- (1) Skapa en månatlig försäljningstabell i exempeldatabasenCREATE TABLE MonthlySale ( SaleId INT PRIMÄRNYCKELIDENTITET (1, 1) ,Säljdatum DATUMTIME2 , Kund VARCHAR(50) ,Produkt VARCHAR(150) ,TotalPrice DECIMAL(10,2))GO-- (2) Fyll i månadsförsäljningstabellenSET IDENTITY_INSERT [dbo].[Månadsrea] ONINSERT INTO [dbo].[Månadsrea] ([ 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].[Månadsrea] ([SaleId], [Säljdatum], [Kund], [Produkt], [TotalPrice]) VÄRDEN (2, N'2019-05- 02 00:00:00', N'Mike', N'Dell Laptop', CAST(300,00 AS Decimal(10, 2)))INSERT INTO [dbo].[Månadsrea] ([SaleId], [SellingDate], [ Kund], [Produkt], [TotalPrice]) VÄRDEN (3, N'2019-05-02 00:00:00', N'Adil', N'Lenovo Laptop', CAST(350,00 AS Decimal(10, 2) ))INSERT INTO [dbo].[Månadsrea] ([SaleId], [SellingDate], [Cu stomer], [Produkt], [TotalPrice]) VÄRDEN (4, N'2019-05-03 00:00:00', N'Sarah', N'HP Laptop', CAST(250,00 AS Decimal(10, 2) ))INSERT INTO [dbo].[Månadsrea] ([SaleId], [SellingDate], [Kund], [Produkt], [TotalPrice]) VÄRDEN (5, N'2019-05-05 00:00:00', N'Asif', N'Dell Desktop', CAST(200.00 AS Decimal(10, 2)))INSERT INTO [dbo].[Månadsrea] ([SaleId], [Säljdatum], [Kund], [Produkt], [ TotalPrice]) VÄRDEN (6, N'2019-05-10 00:00:00', N'Sam', N'HP Desktop', CAST(300,00 AS Decimal(10, 2)))INSERT INTO [dbo]. [Monthly Sale] ([SaleId], [SellingDate], [Kund], [Produkt], [TotalPrice]) VÄRDEN (7, N'2019-05-12 00:00:00', N'Mike', N'iPad ', CAST(250,00 AS Decimal(10, 2)))INSERT INTO [dbo].[Månadsrea] ([SaleId], [Säljdatum], [Kund], [Produkt], [TotalPrice]) VÄRDEN (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] ], [Kund], [Produkt], [TotalPrice]) VÄRDEN (9, N'2019-05-20 00:00:00', N'Peter', N'Dell Laptop', CAST(350,00 AS Decimal(10, 2)))INSERT INTO [dbo].[Månadsrea] ([SaleId], [Säljdatum], [Kund], [Produkt], [TotalPrice]) VÄRDEN (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], [Säljdatum], [Kund], [Produkt], [TotalPrice]) VÄRDEN (11, N'2019-06-03 00:00:00', N'Sarah', N'iPad', CAST(300.00 AS Decimal( 10, 2)))INSERT I [dbo].[Månadsrea] ([SaleId], [Säljdatum], [Kund], [Produkt], [TotalPrice]) VÄRDEN (12, N'2019-06-05 00:00 :00', N'Sam', N'Dell Laptop', CAST(350.00 AS Decimal(10, 2)))INSERT INTO [dbo].[Månadsrea] ([SaleId], [SellingDate], [Kund], [ Produkt], [TotalPrice]) VÄRDEN (13, N'2019-06-10 00:00:00', N'Akeel', N'Acer Laptop', CAST(300,00 AS Decimal(10, 2)))INSERT INTO [dbo].[Månadsrea] ([SaleId], [Säljdatum], [Kund], [Produkt], [TotalPrice]) VÄRDEN (14, N'2019-06-12 00:00:00', N'Asif' , N'iPad', CAST(400,00 AS Decimal(10, 2)))INSERT INTO [dbo].[Månadsrea] ([Sal eId], [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].[Månadsrea] ([SaleId], [Säljdatum], [Kund], [Produkt], [TotalPrice]) VÄRDEN (16, N'2019-06- 15 00:00:00', N'Sahil', N'HP Desktop', CAST(500.00 AS Decimal(10, 2)))INSERT INTO [dbo].[Månadsrea] ([SaleId], [SellingDate], [ Kund], [Produkt], [TotalPrice]) VÄRDEN (17, N'2019-06-20 00:00:00', N'Akeel', N'iPad', CAST(350,00 AS Decimal(10, 2)) )INSERT I [dbo].[Månadsrea] ([SaleId], [Säljdatum], [Kund], [Produkt], [TotalPrice]) VÄRDEN (18, N'2019-06-24 00:00:00', N 'Mike', N'Dell Desktop', CAST(300,00 AS Decimal(10, 2)))INSERT INTO [dbo].[Månadsrea] ([SaleId], [Säljdatum], [Kund], [Produkt], [TotalPrice] ]) VÄRDEN (19, N'2019-06-25 00:00:00', N'Sahil', N'Lenovo Laptop', CAST(500,00 AS Decimal(10, 2)))INSERT INTO [dbo].[ Monthly Sale] ([SaleId], [SellingDate], [Kund], [Produkt], [TotalPrice]) VÄRDE 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].[Månadsrea] AV

Krav, analys och planering

Innan du börjar arbeta med det här projektet, låt oss ta en titt på det förväntade affärsbehovet för vår månadsrapport och en preliminär analys.

Uttalande

Månadsrapportens affärskrav kan komma till dig i följande form:

"Som företagsanvändare vill jag se en månadsbok försäljningsrapport”

Tips

Leta efter nyckelorden i affärskravet som månadsvis , dagligen eller veckovis för att förstå vilken frekvens den resulterande rapporten ska ha.

Preliminär analys

Eftersom detta är en månatlig försäljningsrapport kräver den antingen att parametrar tillhandahålls automatiskt vid körning eller förlitar sig på koden för den lagrade proceduren för att beräkna månatlig försäljning.

En månadsrapport visar siffror för en hel månad – det betyder att rapporten bör ha följande saker i åtanke:

  1. Rapporten måste visa siffror från föregående månad baserat på det aktuella datumet
  2. Rapporten måste dynamiskt beräkna föregående månad av innevarande år

Slutligen måste vi välja det bäst lämpade databasobjektet. Och en lagrad procedur är det bästa alternativet för att hantera denna typ av affärsrapporteringskrav.

Utvecklingsplan

Utvecklingsplanen är enkel:

  1. Skapa en lagrad procedur för att visa månatliga försäljningssiffror
  2. Skapa en SSRS-rapport för att visa månatliga försäljningssiffror baserat på den lagrade proceduren

Du kan närma dig detta på något av följande sätt:

  1. En lagrad procedur utan parametrar, och proceduren beräknar både den senaste månadens tidsperiod och försäljningen
  2. En lagrad procedur med parametrar, där proceduren beräknar försäljningen och rapporten beräknar den senaste månadens tidsperiod

Skapa och testkör en lagrad rapportprocedur

Det första här skulle vara att skapa en lagrad procedur som kan uppfylla affärskravet.

Välja procedur utan parametermetod

Här kommer vi att uppfylla affärsspecifikationen genom att använda en lagrad procedur utan parametrar. Det betyder att vi inte bara kommer att beräkna försäljningen med den lagrade proceduren, utan vi kommer också att beräkna den månatliga försäljningsperioden baserat på det aktuella datumet i den lagrade proceduren istället för att göra det vid körning.

Underskatta månadsrapportlogiken

Månadsrapporten betyder egentligen inte "en försäljningsrapport för innevarande månad" eftersom den aktuella månaden inte är klar ännu, så vi måste ta itu med den senaste fullständiga månaden - det vill säga föregående månad.

Så här är de flesta professionella månadsrapporter uppbyggda om inte annat anges.

Till exempel, om det aktuella datumet är 6 juli 2019, förväntar vi oss att den månatliga försäljningsrapporten visar oss försäljningen för juni 2019 eftersom juni är den sista hela månaden.

Utforma månadsrapportlogiken

Det finns många sätt att designa månadsrapportlogik i T-SQL.

Konceptet StartDate och AfterEndDate

Detta är det viktigaste konceptet inom professionell rapportering med dagliga, månatliga, veckovisa eller årliga frekvenser.

Vi måste fråga försäljningstabellerna från ett startdatum till och med slutdatumet – det senare kan också kallas efter slutdatum .

Så, förutsatt att det aktuella datumet är 06 juli 2019, måste vi initiera startdatumet (StartDate) med 01 juni 2019 och efter slutdatum (AfterEndDate) med 01 juli 2019, men detta bör utföras dynamiskt varje gång proceduren anropas.

Beräkna efter slutdatumet

AfterEndDate är nästa dag efter att den sista månaden är slut.

Om vi ​​antar att idag är den 6 juli 2019 kommer AfterEndDate att vara den 1 juli 2019.

Det enklaste sättet att uppnå detta är att använda DateFromParts() funktion som tar parametrarna År, Månad och Dag för att ställa in ett datum.

Kör följande T-SQL-kod för att få AfterEndDate genom att använda DateFromParts() funktion:

DECLARE @CurrentYear INT,@CurrentMonth INT, @AfterEndDate DATETIMESET @CurrentYear=YEAR(GETDATE())SET @CurrentMonth=Month(GETDATE())SET @AfterEndDate=DATEFROMPARTS(@CurrentYear SELECT@Current () AS CurrentDate,@AfterEndDate as Next_Day_After_Last_Complete_Month

Utgången är som följer:

Beräkning av startdatum

Startdatumet (StartDate) är den första dagen i den sista månaden. Detta kan också beräknas med DATEFROMPARTS() fungerar tillsammans med DATEADD() funktion.

Subtraherar en månad från AfterEndDate genom att använda DATEADD() funktion får vi startdatumet för den senaste månaden.

Se följande T-SQL-kod:

-- Beräknar startdatum och efterslutdatum för månadsrapportenDECLARE @CurrentYear INT,@CurrentMonth INT, @AfterEndDate DATETIME, @StartDate DATETIMESET @CurrentYear=YEAR(GETDATE())SET @CurrentMonth=Month(End)SETDATE(GETDATE) =DateFromParts (@currentyear,@currentmonth, 1) Set@StartDate =DateAdd (MM, -1,@Afterenddate)-Subtrahera en månad från AfterendDateSelect GetDate () som CurrentDate,@StartDate som StartDate,@Afterenddate AS Next_Day_AFTER_LAST_CONPLET> 

Utgången är som följer:

ShowMonthlySales lagrade procedur

Vi kommer att koda den lagrade proceduren på ett sådant sätt att den beräknar rätt tidsperiod plus månadsförsäljningen baserat på ovanstående beräkningar, utan behov av parametrar.

Skapa den lagrade proceduren enligt följande:

SKAPA PROCEDUR Visa Monthly SalesASSET NOCOUNT ONBEGINDECLARE @CurrentYear INT,@CurrentMonth INT, @AfterEndDate DATETIME, @StartDate DATETIMESET @CurrentYear=YEAR(GETDATE())SET @CurrentMonthDATE()-GET the Calculating the Month()-GET the day aktuell månadSET @AfterEndDate=DATEFROMPARTS(@CurrentYear,@CurrentMonth,1)-- Beräknar den första dagen i senaste månadSET @StartDate=DATEADD(MM,-1,@AfterEndDate) -- Subtraherar en månad från AfterEndDate-- Visa försäljning från den första dagen i förra månaden till och med den första dagen i innevarande månad.VÄLJ s.SellingDate,s.Customer,s.Product,s.TotalPrice FROM MonthlySale sdär s.SellingDate>[email protected] och s.SellingDate<@AfterEndDateorder by s .SellingDateEND

Testkör den lagrade proceduren

Förutsatt att det aktuella datumet är 6 juli 2019 , låt oss köra den lagrade proceduren mot exempeldatabasen ITSales för att se resultaten:

--Testkör ShowMonthlySales-procedurenEXEC ShowMonthlySales

Utgången är som följer:

Grattis! Du har framgångsrikt skapat en lagrad procedur som kan köras bakom en professionell månatlig försäljningsrapport. Så länge den förblir orörd och affärskraven inte ändras, gör proceduren jobbet under hela året.

Saker att göra

Nu när du kan skriva lagrade procedurer för månatliga rapporter, försök med följande saker för att förbättra dina färdigheter ytterligare:

  1. Skapa en rapport lagrad procedur för att visa dagliga försäljningssiffror baserade på startdatum och efter slutdatum logik som diskuteras i den här artikeln
  2. Med tanke på den månatliga försäljningslogiken, försök skapa en rapportprocedur för årliga försäljningssiffror
  3. Skapa en SSRS-rapport för att visa månatlig försäljning baserat på den lagrade proceduren som nämns i den här artikeln samtidigt som du använder följande artiklar som referens:
  • Skapa kundfokuserade SSRS-rapporter med parametrar
  • SSRS rapporterar utveckling i enkla termer

  1. Dålig praxis i databasdesign

  2. Hur FROM_DAYS() fungerar i MariaDB

  3. SQL Server-utgångsklausul till en skalär variabel

  4. Vilka är fördelarna med ett datahanteringssystem?