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

So schreiben Sie gespeicherte Prozeduren für professionelle SSRS-Berichte

In diesem Artikel sprechen wir über professionelle SQL Server Reporting Services-Berichte, wie Sie gespeicherte Prozeduren für diese Berichte erstellen, um Geschäftsanforderungen zu erfüllen, und die Vorteile der Verwendung gespeicherter Prozeduren, die hinter SSRS-Berichten ausgeführt werden.

Über professionelle SSRS-Berichte

Machen wir uns zunächst mit professionellen SSRS-Berichten vertraut.

Einfache Definition

Ein professioneller SSRS-Bericht ist ein Bericht, der unter Berücksichtigung der Standardpraktiken der Berichtsentwicklung erstellt wurde und der gründlich getestet wurde, um die Geschäftsanforderungen zu erfüllen.

Mit anderen Worten, ein professioneller SSRS-Bericht wird sehr sorgfältig entworfen, entwickelt, getestet und in der Zielumgebung bereitgestellt, um sicherzustellen, dass er den Zweck erfüllt und für das Unternehmen von Vorteil ist.

Beispiele

Ein einfaches Beispiel für einen professionellen SSRS-Bericht ist ein monatlicher Verkaufsbericht, der Aufschluss darüber gibt, wie gut das Unternehmen seine Dienstleistungen oder Produkte verkauft.

Ein weiteres Beispiel für einen professionell entwickelten SSRS-Bericht ist ein Bericht, der tägliche Geschäftstransaktionen aus der Geschäftsperspektive zeigt.

Häufigkeit professioneller SSRS-Berichte

Die Häufigkeit eines Berichts beschreibt, wie oft dieser Bericht ausgeführt werden sollte, um die neuesten Zahlen anzuzeigen, die dann an die zuständigen Abteilungen innerhalb des Unternehmens oder an externe Kunden gesendet werden können.

Die Häufigkeit eines professionellen SSRS-Berichts kann eine der folgenden sein:

Tagesbericht

Ein Tagesbericht muss, wie der Name schon sagt, täglich ausgeführt werden, damit er abgerufen oder an seine internen und/oder externen Abonnenten gesendet werden kann.

Wochenbericht

Ein Bericht, der wöchentliche Zahlen zeigt und jede Woche an die Empfänger gesendet wird.

Monatsbericht

Ein Monatsbericht enthält Daten für den gesamten Monat und soll jeden Monat geliefert werden.

Jahresbericht

Ein jährlicher Bericht gibt mehr Einblick in die Daten, indem jährliche Zahlen für seine Abonnenten und Endnutzer berechnet werden.

Bericht basierend auf einem beliebigen Finanzzeitraum

Berichte, die auf einen anderen Finanzzeitraum folgen, fallen in diese Kategorie.

Über die Häufigkeit von Berichten

Bitte beachten Sie, dass der wichtigste Bericht in Bezug auf die Häufigkeit der tägliche Bericht ist.

Tatsächlich ist es nicht nur der Bericht – auch die Daten, die Sie täglich für den Bericht aufbereiten, sind wichtig.

Wenn Sie Daten für einen täglichen Bericht vorbereitet haben, ist das Vorbereiten von Daten für einen wöchentlichen Bericht dasselbe wie das Ausführen von täglichen Berichten für eine ganze Woche. Ein monatlicher Bericht ist wiederum dasselbe wie die viermalige Ausführung eines wöchentlichen Berichts.

Wenn Sie jedoch nur gebeten werden, einen monatlichen Bericht zu erstellen, ist die monatliche Datenerstellung für den Bericht ebenfalls akzeptabel und wird unter Umständen der täglichen Datenerstellung vorgezogen.

Die Details dazu würden den Rahmen dieses Artikels sprengen, aber der Grund, warum ich dies hier erwähnt habe, ist, die Bedeutung der Entwicklung eines täglichen Berichts hervorzuheben, der die tägliche Vorbereitung von Daten für den Bericht erfordert. Dies kann auch zeigen, wie Daten für wöchentliche, monatliche und jährliche Berichte vorbereitet werden.

Die Rolle einer gespeicherten Prozedur

Gespeicherte Prozeduren spielen eine wichtige Rolle in professionellen SSRS-Berichten, da sie die erforderlichen Daten für den Bericht aus der Datenbank beziehen.

Gespeicherte Prozeduren bieten viele Vorteile, wenn sie für Berichtszwecke verwendet werden.

Geschäftslogik und gespeicherte Prozeduren

Gespeicherte Prozeduren werden dringend empfohlen, um die Geschäftslogik für die Berichterstellung zu implementieren.

Einfaches Testen von Datenbankeinheiten

Gespeicherte Prozeduren können einfach Unit-Tests unterzogen werden, um sicherzustellen, dass sie die Geschäftsspezifikationen erfüllen und die Geschäftslogik für den SSRS-Bericht implementieren.

Sicherheit

Die Verwendung gespeicherter Prozeduren zum Ausführen eines Berichts erfordert Zugriffsrechte auf die erforderliche gespeicherte Prozedur – dies kann mit Datenbankbenutzern oder -rollen verwaltet werden.

Diese Zugriffsverwaltung für gespeicherte Prozeduren, die für Berichtszwecke geschrieben wurden, hilft beim Aufbau einer sicheren Berichtslösung, in der nur bestimmte Benutzer auf die Berichte zugreifen und diese ausführen können.

Wartung

SSRS-Berichte, die auf gespeicherten Prozeduren basieren, sind einfach zu verwalten, da nur Änderungen in der gespeicherten Prozedur erforderlich sind, ohne dass Freiformskripts für die Berichtsdatensätze geändert und nachverfolgt werden müssen.

Voraussetzungen

Dieser Artikel geht davon aus, dass die Leser mit den Grundlagen von T-SQL-Skripten und Datenbankberichten vertraut sind.

Bitte lesen Sie den Artikel Entwicklung von SSRS-Berichten in einfachen Worten um schnell zu verstehen, wie man einen einfachen SSRS-Bericht erstellt.

Eine Beispieldatenbank einrichten (ITSales)

Lassen Sie uns zu Beginn eine Beispieldatenbank mit dem Namen ITSales erstellen die IT-Verkaufszahlen enthält:

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

Anforderungen, Analyse und Planung

Bevor Sie mit der Arbeit an diesem Projekt beginnen, werfen wir einen Blick auf die erwarteten Geschäftsanforderungen für unseren monatlichen Bericht und eine vorläufige Analyse.

Erklärung

Die Geschäftsanforderung für den monatlichen Bericht kann in folgender Form zu Ihnen kommen:

„Als geschäftlicher Benutzer möchte ich monatlich einsehen Verkaufsbericht“

Hinweis

Bitte suchen Sie nach den Schlüsselwörtern in der Geschäftsanforderung, z. B. monatlich , täglich oder wöchentlich um zu verstehen, welche Häufigkeit der resultierende Bericht haben sollte.

Vorläufige Analyse

Da es sich um einen monatlichen Umsatzbericht handelt, müssen entweder zur Laufzeit automatisch Parameter bereitgestellt werden, oder es wird auf den Code der gespeicherten Prozedur zurückgegriffen, um die monatlichen Umsätze zu berechnen.

Ein Monatsbericht zeigt Zahlen für einen kompletten Monat – das bedeutet, dass der Bericht folgende Dinge berücksichtigen sollte:

  1. Der Bericht muss Zahlen des Vormonats basierend auf dem aktuellen Datum anzeigen
  2. Der Bericht muss den Vormonat des laufenden Jahres dynamisch berechnen

Schließlich müssen wir das am besten geeignete Datenbankobjekt auswählen. Und eine gespeicherte Prozedur ist die beste Option, um mit dieser Art von Geschäftsberichtsanforderungen umzugehen.

Entwicklungsplan

Der Entwicklungsplan ist einfach:

  1. Erstellen Sie eine gespeicherte Prozedur, um monatliche Verkaufszahlen anzuzeigen
  2. Erstellen Sie einen SSRS-Bericht, um die monatlichen Verkaufszahlen basierend auf der gespeicherten Prozedur anzuzeigen

Sie können dies auf eine der folgenden Arten angehen:

  1. Eine gespeicherte Prozedur ohne Parameter, und die Prozedur berechnet sowohl den Zeitraum des letzten Monats als auch die Verkäufe
  2. Eine gespeicherte Prozedur mit Parametern, bei der die Prozedur den Umsatz berechnet und der Bericht den Zeitraum des letzten Monats berechnet

Erstellen und Testen einer gespeicherten Berichtsprozedur

Das erste, was hier wäre, wäre, eine gespeicherte Prozedur zu erstellen, die die Geschäftsanforderungen erfüllen kann.

Auswahl des Verfahrens ohne Parameteransatz

Hier werden wir die Geschäftsspezifikation erfüllen, indem wir eine gespeicherte Prozedur ohne Parameter verwenden. Das bedeutet, dass wir den Umsatz nicht nur mit der gespeicherten Prozedur berechnen, sondern auch den monatlichen Verkaufszeitraum basierend auf dem aktuellen Datum innerhalb der gespeicherten Prozedur berechnen, anstatt dies zur Laufzeit zu tun.

Untertreibung der monatlichen Berichtslogik

Der Monatsbericht bedeutet nicht wirklich „ein Umsatzbericht für den aktuellen Monat“, da der aktuelle Monat noch nicht vollständig ist, sodass wir uns mit dem letzten vollständigen Monat – also dem Vormonat – befassen müssen.

So werden die meisten professionellen Monatsberichte erstellt, sofern nicht anders angegeben.

Wenn das aktuelle Datum beispielsweise der 6. Juli 2019 ist, erwarten wir, dass der monatliche Umsatzbericht uns die Umsätze für Juni 2019 anzeigt, da Juni der letzte vollständige Monat ist.

Entwurf der monatlichen Berichtslogik

Es gibt viele Möglichkeiten, die Logik für monatliche Berichte in T-SQL zu entwerfen.

Das Konzept von StartDate und AfterEndDate

Dies ist das wichtigste Konzept in der professionellen Berichterstattung mit täglichen, monatlichen, wöchentlichen oder jährlichen Frequenzen.

Wir müssen die Verkaufstabellen von einem Startdatum bis zum Enddatum abfragen – letzteres kann auch nach Enddatum genannt werden .

Unter der Annahme, dass das aktuelle Datum der 06. Juli 2019 ist, müssen wir das Startdatum (StartDate) mit dem 01. Juni 2019 und nach dem Enddatum (AfterEndDate) mit dem 01. Juli 2019 initialisieren, dies sollte jedoch bei jedem Aufruf der Prozedur dynamisch durchgeführt werden.

Berechnung des Nach-Enddatums

AfterEndDate ist der nächste Tag nach Ablauf des letzten Monats.

Unter der Annahme, dass heute der 6. Juli 2019 ist, ist das AfterEndDate der 1. Juli 2019.

Der einfachste Weg, dies zu erreichen, ist die Verwendung von DateFromParts() Funktion, die die Parameter Jahr, Monat und Tag verwendet, um ein Datum einzurichten.

Führen Sie den folgenden T-SQL-Code aus, um AfterEndDate mithilfe von DateFromParts() abzurufen Funktion:

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

Die Ausgabe sieht wie folgt aus:

Startdatum berechnen

Das Startdatum (StartDate) ist der erste Tag des letzten Monats. Dies kann auch durch DATEFROMPARTS() berechnet werden Funktion zusammen mit DATEADD() Funktion.

Subtrahieren eines Monats von AfterEndDate durch Verwendung von DATEADD() Funktion erhalten wir das Startdatum für den letzten Monat.

Bitte sehen Sie sich den folgenden T-SQL-Code an:

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

Die Ausgabe sieht wie folgt aus:

Die gespeicherte ShowMonthlySales-Prozedur

Wir werden die gespeicherte Prozedur so codieren, dass sie den korrekten Zeitraum plus die monatlichen Verkäufe basierend auf den obigen Berechnungen ohne die Notwendigkeit von Parametern berechnet.

Erstellen Sie die gespeicherte Prozedur wie folgt:

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-Ausführen der gespeicherten Prozedur

Angenommen, das aktuelle Datum ist der 06. Juli 2019 , führen wir die gespeicherte Prozedur für die Beispieldatenbank ITSales aus um die Ergebnisse zu sehen:

--Test-run the ShowMonthlySales procedure
EXEC ShowMonthlySales

Die Ausgabe sieht wie folgt aus:

Herzliche Glückwünsche! Sie haben erfolgreich eine gespeicherte Prozedur erstellt, die hinter einem professionellen monatlichen Verkaufsbericht ausgeführt werden kann. Solange es unangetastet bleibt und sich die geschäftlichen Anforderungen nicht ändern, funktioniert das Verfahren das ganze Jahr über.

Dinge zu tun

Da Sie nun gespeicherte Prozeduren für monatliche Berichte schreiben können, versuchen Sie bitte Folgendes, um Ihre Fähigkeiten weiter zu verbessern:

  1. Erstellen Sie eine gespeicherte Berichtsprozedur, um die täglichen Verkaufszahlen basierend auf dem Startdatum anzuzeigen und nach Enddatum Logik, die in diesem Artikel diskutiert wird
  2. Beachten Sie die monatliche Umsatzlogik und versuchen Sie, ein Berichtsverfahren für jährliche Umsatzzahlen zu erstellen
  3. Erstellen Sie einen SSRS-Bericht, um die monatlichen Verkäufe basierend auf der in diesem Artikel erwähnten gespeicherten Prozedur anzuzeigen, und verwenden Sie dabei die folgenden Artikel als Referenz:
  • Erstellen kundenorientierter SSRS-Berichte mit Parametern
  • SSRS meldet Entwicklung in einfachen Worten