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

Sådan skriver du lagrede procedurer til professionelle SSRS-rapporter

I denne artikel vil vi tale om professionelle SQL Server Reporting Services-rapporter, hvordan man opretter lagrede procedurer til disse rapporter for at opfylde forretningskrav og fordelene ved at bruge lagrede procedurer til at køre bag SSRS-rapporter.

Om professionelle SSRS-rapporter

Lad os først blive fortrolige med professionelle SSRS-rapporter.

Simpel definition

En professionel SSRS-rapport er en rapport, der er oprettet med standardpraksis for rapportudvikling i tankerne, og som er blevet grundigt testet for at kunne opfylde forretningskrav.

Med andre ord er en professionel SSRS-rapport meget omhyggeligt designet, udviklet, testet og implementeret til målmiljøet for at sikre, at den tjener formålet og er til gavn for virksomheden.

Eksempler

Et simpelt eksempel på en professionel SSRS-rapport er en månedlig salgsrapport, som giver et indblik i, hvor godt virksomheden klarer sig i forhold til at sælge sine tjenester eller produkter.

Et andet eksempel på en professionelt udviklet SSRS-rapport er en rapport, der viser daglige forretningstransaktioner fra et forretningsperspektiv.

Hyppighed af professionelle SSRS-rapporter

Hyppigheden af ​​en rapport beskriver, hvor ofte denne rapport skal køres for at vise de seneste tal, som derefter kan sendes til relaterede afdelinger i virksomheden eller til eksterne kunder.

En professionel SSRS-rapports frekvens kan være en af ​​følgende:

Daglig rapport

En daglig rapport, som navnet angiver, skal køre på daglig basis for at blive tilgået eller sendt til dens interne og/eller eksterne abonnenter.

Ugentlig rapport

En rapport som viser ugentlige tal og sendes til modtagerne hver uge.

Månedlig rapport

En månedlig rapport indeholder data for hele måneden og er beregnet til at blive leveret hver måned.

Årsrapport

En årlig rapport giver mere indsigt i dataene ved at beregne årlige tal for dets abonnenter og slutbrugere.

Rapport baseret på enhver regnskabsperiode

Rapporter, der følger efter enhver anden regnskabsperiode, falder ind under denne kategori.

Om hyppigheden af ​​rapporter

Husk, at den vigtigste rapport, når det kommer til hyppighed, er den daglige rapport.

Faktisk er det ikke kun rapporten – de data, du forbereder til rapporten på daglig basis, er også vigtige.

Hvis du har forberedt data til en daglig rapport, så er forberedelse af data til en ugentlig rapport det samme som at køre daglige rapporter for en hel uge. En månedlig rapport er på sin side det samme som at køre en ugentlig rapport fire gange.

Men hvis du kun bliver bedt om at oprette en månedlig rapport, er det også acceptabelt at forberede data til rapporten på månedsbasis, og det anbefales i nogle tilfælde frem for at forberede daglige data.

Detaljerne i dette ligger uden for rammerne af denne artikel, men grunden til, at jeg nævnte dette her, er for at fremhæve vigtigheden af ​​at udvikle en daglig rapport, som kræver udarbejdelse af data til rapporten på daglig basis. Dette kan også vise, hvordan man forbereder data til ugentlige, månedlige og årlige rapporter.

En lagret procedures rolle

Lagrede procedurer spiller en afgørende rolle i professionelle SSRS-rapporter, da de henter de nødvendige data til rapporten fra databasen.

Lagrede procedurer giver mange fordele, når de bruges til rapporteringsformål.

Forretningslogik og lagrede procedurer

Lagrede procedurer anbefales stærkt til at implementere rapporteringsforretningslogik.

Nemhed ved test af databaseenhed

Lagrede procedurer kan nemt enhedstestes for at sikre, at de opfylder forretningsspecifikationen og implementerer forretningslogik for SSRS-rapporten.

Sikkerhed

Brug af lagrede procedurer til at køre en rapport kræver adgangsrettigheder til den nødvendige lagrede procedure – dette kan administreres med databasebrugere eller roller.

Denne adgangsstyring til lagrede procedurer skrevet til rapporteringsformål hjælper med at opbygge en sikker rapporteringsløsning, hvor kun specifikke brugere kan få adgang til og køre rapporterne.

Vedligeholdelse

SSRS-rapporter baseret på lagrede procedurer er nemme at vedligeholde, da kun ændringer i den lagrede procedure er nødvendige, uden at det er nødvendigt at ændre og holde styr på scripts i frit format til rapportdatasættene.

Forudsætninger

Denne artikel antager, at læserne er fortrolige med det grundlæggende i T-SQL-scripts og databaserapportering.

Læs venligst artiklen SSRS Reports Development in Simple Words for at få en hurtig forståelse af, hvordan man laver en simpel SSRS-rapport.

Opsæt en prøvedatabase (ITSales)

For at starte tingene, lad os oprette en prøvedatabase med navnet ITSales som indeholder IT-salgstal:

-- Opret en prøvedatabase (ITSales)CREATE DATABASE ITSales;GOUSE ITSales;-- (1) Opret en månedlig salgstabel i eksempeldatabasenCREATE TABLE MonthlySale ( SaleId INT PRIMARY KEY IDENTITY (1, 1) ,Sælgesdato DATOTIME2 , Kunde VARCHAR(50) ,Produkt VARCHAR(150) ,TotalPrice DECIMAL(10,2))GO-- (2) Udfyld den månedlige salgstabelSET IDENTITY_INSERT [dbo].[MonthlySale] ONINSERT 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)))INDSÆT I [dbo].[Månedligt udsalg] ([SaleId], [Sælgesdato], [Kunde], [Produkt], [TotalPrice]) VÆRDI (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], [ Kunde], [Produkt], [TotalPrice]) VALUES (3, N'2019-05-02 00:00:00', N'Adil', N'Lenovo Laptop', CAST(350,00 AS Decimal(10, 2) ))INDSÆT I [dbo].[Monthly Sale] ([SaleId], [SellingDate], [Cu stomer], [Produkt], [TotalPrice]) VALUES (4, N'2019-05-03 00:00:00', N'Sarah', N'HP Laptop', CAST(250,00 AS Decimal(10, 2) ))INDSÆT I [dbo].[Månedligt udsalg] ([SaleId], [Salgdato], [Kunde], [Produkt], [TotalPrice]) VÆRDI (5, N'2019-05-05 00:00:00', N'Asif', N'Dell Desktop', CAST(200,00 AS Decimal(10, 2)))INSERT INTO [dbo].[Månedligt udsalg] ([SaleId], [Sælgesdato], [Kunde], [Produkt], [ 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], [Kunde], [Produkt], [TotalPrice]) VÆRDI (7, N'2019-05-12 00:00:00', N'Mike', N'iPad ', CAST(250,00 AS Decimal(10, 2)))INSERT INTO [dbo].[Månedligt udsalg] ([SaleId], [Salgsdato], [Kunde], [Produkt], [TotalPrice]) VÆRDIER (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] ], [Kunde], [Produkt], [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].[Månedligt udsalg] ([SaleId], [Sælgesdato], [Kunde], [Produkt], [TotalPrice]) VÆRDIER (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ælgesdato], [Kunde], [Produkt], [TotalPrice]) VÆRDIER (11, N'2019-06-03 00:00:00', N'Sarah', N'iPad', CAST(300,00 AS Decimal( 12 :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].[Månedligt udsalg] ([SaleId], [Sælgsdato], [Kunde], [Produkt], [TotalPrice]) VÆRDIER (14, N'2019-06-12 00:00:00', N'Asif' , N'iPad', CAST(400,00 AS Decimal(10, 2)))INSERT INTO [dbo].[Månedligt udsalg] ([Sal eId], [Salgdato], [Kunde], [Produkt], [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ånedligt udsalg] ([SaleId], [Salgsdato], [Kunde], [Produkt], [TotalPrice]) VÆRDI (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], [ Kunde], [Produkt], [TotalPrice]) VÆRDIER (17, N'2019-06-20 00:00:00', N'Akeel', N'iPad', CAST(350,00 AS Decimal(10, 2)) )INDSÆT I [dbo].[Månedligt udsalg] ([SaleId], [Salgsdato], [Kunde], [Produkt], [TotalPrice]) VÆRDIER (18, N'2019-06-24 00:00:00', N 'Mike', N'Dell Desktop', CAST(300,00 AS Decimal(10, 2)))INSERT INTO [dbo].[Månedligt udsalg] ([SaleId], [Sælgsdato], [Kunde], [Produkt], [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], [Kunde], [Produkt], [TotalPrice]) VÆRDI 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].[Monthly Sale] FRA

Krav, analyse og planlægning

Før du begynder at arbejde på dette projekt, lad os se på det forventede forretningsbehov for vores månedlige rapport og en foreløbig analyse.

Erklæring

Den månedlige rapport forretningskrav kan komme til dig i følgende form:

"Som forretningsbruger vil jeg se en månedlig salgsrapport”

Tip

Se venligst efter søgeordene i forretningskravet, såsom månedlig , dagligt eller ugentlig for at forstå, hvilken frekvens den resulterende rapport skal have.

Foreløbig analyse

Da dette er en månedlig salgsrapport, kræver den enten, at parametre leveres automatisk ved kørselstidspunktet, eller den er afhængig af koden for den lagrede procedure til at beregne det månedlige salg.

En månedlig rapport viser tal for en hel måned – det betyder, at rapporten skal have følgende ting for øje:

  1. Rapporten skal vise tal fra den foregående måned baseret på den aktuelle dato
  2. Rapporten skal dynamisk beregne den foregående måned i det aktuelle år

Til sidst skal vi vælge det bedst egnede databaseobjekt. Og en lagret procedure er den bedste mulighed for at håndtere denne form for virksomhedsrapporteringskrav.

Udviklingsplan

Udviklingsplanen er enkel:

  1. Opret en lagret procedure for at vise månedlige salgstal
  2. Opret en SSRS-rapport for at vise månedlige salgstal baseret på den lagrede procedure

Du kan gribe dette an på en af ​​følgende måder:

  1. En lagret procedure uden parametre, og proceduren beregner både den sidste måneds periode og salget
  2. En lagret procedure med parametre, hvor proceduren beregner salg, og rapporten beregner den sidste måneds periode

Opret og test-kør en rapport lagret procedure

Den første ting her ville være at oprette en lagret procedure, som kan opfylde forretningskravet.

Valg af procedure uden parametertilgang

Her vil vi opfylde forretningsspecifikationen ved at bruge en lagret procedure uden parametre. Det betyder, at vi ikke kun beregner salg ved hjælp af den lagrede procedure, men vi beregner også den månedlige salgsperiode baseret på den aktuelle dato i den lagrede procedure i stedet for at gøre det på kørselstidspunktet.

Underdrivelse af månedsrapportlogikken

Den månedlige rapport betyder egentlig ikke 'en salgsrapport for den aktuelle måned', fordi den aktuelle måned ikke er færdig endnu, så vi skal forholde os til den seneste komplette måned - altså den foregående måned.

Sådan er de fleste af de professionelle månedlige rapporter opbygget, medmindre andet er angivet.

Hvis den aktuelle dato f.eks. er 6. juli 2019, forventer vi, at den månedlige salgsrapport viser os salg for juni 2019, fordi juni er den sidste hele måned.

Design af månedsrapportlogikken

Der er mange måder at designe månedlig rapportlogik i T-SQL.

Begrebet Startdato og AfterEndDate

Dette er det vigtigste koncept i professionel rapportering med daglige, månedlige, ugentlige eller årlige frekvenser.

Vi skal forespørge salgstabellerne fra en startdato til og med slutdatoen – sidstnævnte kan også kaldes efter slutdato .

Så forudsat at den aktuelle dato er 06. juli 2019, skal vi initialisere startdatoen (StartDate) med 01. juni 2019 og efter slutdatoen (AfterEndDate) med 01. juli 2019, men dette skal udføres dynamisk hver gang proceduren kaldes.

Beregning af efter-slutdatoen

AfterEndDate er den næste dag efter den sidste måned er slut.

Forudsat at i dag er den 6. juli 2019, vil AfterEndDate være den 1. juli 2019.

Den nemmeste måde at opnå dette på er at bruge DateFromParts() funktion som tager år, måned og dag parametre for at indstille en dato.

Kør følgende T-SQL-kode for at få AfterEndDate ved at bruge DateFromParts() funktion:

ERKLÆR @CurrentYear INT,@CurrentMonth INT, @AfterEndDate DATETIMESET @CurrentYear=YEAR(GETDATE())SET @CurrentMontH=Month(GETDATE())SET @AfterEndDate=DATEFROMPARTS(@CurrentYear SELECT@CurrentYear,Current () AS CurrentDate,@AfterEndDate som Next_Day_After_Last_Complete_Month

Outputtet er som følger:

Beregning af startdatoen

Startdatoen (StartDate) er den første dag i den sidste måned. Dette kan også beregnes ved hjælp af DATEFROMPARTS() funktion sammen med DATEADD() funktion.

At trække en måned fra AfterEndDate ved at bruge DATEADD() funktion, får vi startdatoen for den sidste måned.

Se venligst følgende T-SQL-kode:

-- Beregning af startdato og efterslutdato for den månedlige rapportDECLARE @CurrentYear INT,@CurrentMonth INT, @AfterEndDate DATETIME, @StartDate DATETIMESET @CurrentYear=YEAR(GETDATE())SET @CurrentMontH=Month(EndDate)SETDATE @GETAfterDate(GETAfterDATE) =DATEFROMPARTS(@CurrentYear,@CurrentMonth,1)SET @StartDate=DATEADD(MM,-1,@AfterEndDate) -- subtrahering af en måned fra AfterEndDateSELECT GETDATE() AS CurrentDate,@StartDate AS StartDate,@AfterEndDate as Next_LDay_AfternMost.> 

Outputtet er som følger:

Den lagrede procedure for ShowMonthlySales

Vi skal kode den lagrede procedure på en sådan måde, at den beregner den korrekte tidsperiode plus det månedlige salg baseret på ovenstående beregninger uden behov for parametre.

Opret den lagrede procedure som følger:

OPRET PROCEDURE Vis Månedligt SalgsAKTI NOCOUNT ONBEGIN DECLARE @CurrentYear INT,@CurrentMonth INT, @AfterEndDate DATETIME, @StartDate DATETIMESET @CurrentYear=YEAR(GETDATE())SET @CurrentMonthDATE()-GET of the Calculating the Month nuværende månedSET @AfterEndDate=DATEFROMPARTS(@CurrentYear,@CurrentMonth,1)-- Beregning af den første dag i den sidste månedSET @StartDate=DATEADD(MM,-1,@AfterEndDate) -- Fratræk en måned fra AfterEndDate-- Vis salg fra den første dag i sidste måned til og med den første dag i indeværende måned.VÆLG s.Sælgsdato,s.Kunde,s.Produkt,s.TotalPrice FROM MonthlySale shvor s.Sellingsdato>[email protected] og s.Sælgsdato<@AfterEndDateordre by s .SælgesdatoEND

Test-kørsel af den lagrede procedure

Det antages, at den aktuelle dato er 06. juli 2019 , lad os køre den lagrede procedure mod eksempeldatabasen ITSales for at se resultaterne:

--Testkør ShowMonthlySales procedureEXEC ShowMonthlySales

Outputtet er som følger:

Tillykke! Du har med succes oprettet en lagret procedure, der kan køre bag en professionel månedlig salgsrapport. Så længe det forbliver urørt, og forretningskravene ikke ændres, klarer proceduren arbejdet hele året.

Ting at gøre

Nu hvor du kan skrive lagrede procedurer til månedlige rapporter, prøv venligst følgende ting for at forbedre dine færdigheder yderligere:

  1. Opret en rapport lagret procedure for at vise daglige salgstal baseret på startdatoen og efter slutdato logik diskuteret i denne artikel
  2. Med den månedlige salgslogik i tankerne, prøv venligst at oprette en rapportprocedure for årlige salgstal
  3. Opret en SSRS-rapport for at vise månedlige salg baseret på den lagrede procedure, der er nævnt i denne artikel, mens du bruger følgende artikler til reference:
  • Oprettelse af kundefokuserede SSRS-rapporter med parametre
  • SSRS rapporterer udvikling i enkle vendinger

  1. NVL2() Funktion i Oracle

  2. Ting at vide om databasedrevne websteder

  3. Ydeevneværdi af COMB guider

  4. Brug COL_LENGTH() til at få en kolonnes længde i SQL Server