この記事では、プロフェッショナルなSQL Server Reporting Servicesレポート、ビジネス要件を満たすためにこれらのレポートのストアドプロシージャを作成する方法、およびストアドプロシージャを使用してSSRSレポートの背後で実行する利点について説明します。
プロフェッショナルSSRSレポートについて
まず、プロのSSRSレポートについて理解しましょう。
簡単な定義
プロフェッショナルSSRSレポートは、レポート開発の標準的な手法を念頭に置いて作成されたレポートであり、ビジネス要件を満たすことができるように徹底的にテストされています。
言い換えれば、プロのSSRSレポートは、非常に注意深く設計、開発、テストされ、ターゲット環境に展開されて、目的を果たし、ビジネスに有益であることを確認します。
例
プロフェッショナルなSSRSレポートの簡単な例は、月次の売上レポートです。これは、サービスや製品の販売に関してビジネスがどれだけ優れているかについての洞察を提供します。
専門的に作成されたSSRSレポートの別の例は、ビジネスの観点から毎日のビジネストランザクションを示すレポートです。
プロのSSRSレポートの頻度
レポートの頻度は、このレポートを実行して最新の数値を表示し、社内の関連部門または外部クライアントに送信できる頻度を示します。
プロのSSRSレポートの頻度は、次のいずれかになります。
日報
日次レポートは、その名前が示すように、内部および/または外部のサブスクライバーにアクセスまたは送信するために、毎日実行する必要があります。
週報
週ごとの数値を示し、毎週受信者に送信されるレポート。
月次レポート
月次レポートには、1か月全体のデータが含まれており、毎月配信されることを目的としています。
年次報告書
年次レポートは、サブスクライバーとエンドユーザーの年次数値を計算することにより、データに関するより多くの洞察を提供します。
任意の会計期間に基づくレポート
他の会計期間に続くレポートは、このカテゴリに分類されます。
レポートの頻度について
頻度に関して最も重要なレポートは日次レポートであることを覚えておいてください。
実際、それはレポートだけではありません。毎日レポート用に準備するデータも重要です。
日次レポートのデータを準備した場合、週次レポートのデータを準備することは、1週間の日次レポートを実行することと同じです。月次レポートは、週次レポートを4回実行するのと同じです。
ただし、月次レポートの作成のみを求められている場合は、月次ベースでレポートのデータを準備することもできます。状況によっては、日次データの作成よりも推奨されます。
詳細はこの記事の範囲を超えていますが、ここで言及した理由は、レポートのデータを毎日準備する必要がある日次レポートを作成することの重要性を強調するためです。これは、週次、月次、年次のレポートのデータを準備する方法も示しています。
ストアドプロシージャの役割
ストアドプロシージャは、データベースからレポートに必要なデータを取得するため、プロのSSRSレポートで重要な役割を果たします。
ストアドプロシージャは、レポートの目的で使用すると多くの利点があります。
ビジネスロジックとストアドプロシージャ
レポートビジネスロジックを実装するには、ストアドプロシージャを強くお勧めします。
データベースの単体テストのしやすさ
ストアドプロシージャは、ビジネス仕様を満たし、SSRSレポートのビジネスロジックを実装していることを確認するために、簡単に単体テストを行うことができます。
セキュリティ
ストアドプロシージャを使用してレポートを実行するには、必要なストアドプロシージャへのアクセス権が必要です。これは、データベースのユーザーまたはロールで管理できます。
レポート用に作成されたストアドプロシージャのこのアクセス管理は、特定のユーザーのみがレポートにアクセスして実行できる安全なレポートソリューションを構築するのに役立ちます。
メンテナンス
ストアドプロシージャに基づくSSRSレポートは、ストアドプロシージャの変更のみが必要であり、レポートデータセットの自由形式のスクリプトを変更および追跡する必要がないため、保守が容易です。
前提条件
この記事は、読者がT-SQLスクリプトとデータベースレポートの基本に精通していることを前提としています。
記事SSRSレポートの簡単な言葉での開発をお読みください 簡単なSSRSレポートを作成する方法をすばやく理解するため。
サンプルデータベースのセットアップ(ITSales)
まず、 ITSalesという名前のサンプルデータベースを作成しましょう。 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
要件、分析、および計画
このプロジェクトに取り掛かる前に、月次レポートと予備分析で予想されるビジネス要件を見てみましょう。
ステートメント
月次報告書のビジネス要件は、次の形式で提供される場合があります。
「ビジネスユーザーとして、毎月を表示したい 売上レポート」
ヒント
毎月などのビジネス要件のキーワードを探してください 、毎日 または毎週 結果のレポートの頻度を理解するため。
予備分析
これは月次売上レポートであるため、実行時にパラメータを自動的に指定するか、ストアドプロシージャのコードに基づいて月次売上を計算する必要があります。
月次レポートには、1か月全体の数値が表示されます。つまり、レポートでは次の点に注意する必要があります。
- レポートには、現在の日付に基づいた前月の数値を表示する必要があります
- レポートは、今年の前月を動的に計算する必要があります
最後に、最適なデータベースオブジェクトを選択する必要があります。そして、ストアドプロシージャは、この種のビジネスレポーティング要件に対処するための最良のオプションです。
開発計画
開発計画は単純です:
- 月間売上高を表示するためのストアドプロシージャを作成する
- SSRSレポートを作成して、ストアドプロシージャに基づいた月間売上高を表示します
次のいずれかの方法でこれにアプローチできます。
- パラメータのないストアドプロシージャ。プロシージャは先月の期間と売上の両方を計算します
- パラメータ付きのストアドプロシージャ。プロシージャは売上を計算し、レポートは先月の期間を計算します
レポートストアドプロシージャの作成とテスト-実行
ここで最初に行うことは、ビジネス要件を満たすことができるストアドプロシージャを作成することです。
パラメータアプローチなしで手順を選択する
ここでは、パラメータなしのストアドプロシージャを使用して、ビジネス仕様を満たします。つまり、ストアドプロシージャを使用して売上を計算するだけでなく、実行時に実行するのではなく、ストアドプロシージャ内の現在の日付に基づいて月間売上期間も計算します。
月次レポートロジックの過小評価
月次レポートは、今月がまだ完了していないため、実際には「当月の売上レポート」を意味するわけではありません。したがって、最新の完全な月、つまり前月を処理する必要があります。
これは、特に明記されていない限り、ほとんどの専門的な月次レポートが作成される方法です。
たとえば、現在の日付が2019年7月6日の場合、6月が最後の完全な月であるため、月次売上レポートには2019年6月の売上が表示されると予想されます。
月次レポートロジックの設計
T-SQLで月次レポートロジックを設計する方法はたくさんあります。
StartDateとAfterEndDateの概念
これは、日次、月次、週次、または年次の頻度での専門的なレポート作成において最も重要な概念です。
開始日から終了日までの販売テーブルを照会する必要があります。後者は、終了日後と呼ぶこともできます。 。
したがって、現在の日付が2019年7月6日であると仮定すると、開始日(StartDate)を2019年6月1日で初期化し、終了日(AfterEndDate)を2019年7月1日で初期化する必要がありますが、これはプロシージャが呼び出されるたびに動的に実行する必要があります。
終了後の日付の計算
AfterEndDateは、先月が終了した翌日です。
今日が2019年7月6日であるとすると、AfterEndDateは2019年7月1日になります。
これを実現する最も簡単な方法は、 DateFromParts()を使用することです。 年、月、日のパラメータを使用して日付を設定する関数。
次のT-SQLコードを実行して、 DateFromParts()を使用してAfterEndDateを取得します。 機能:
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
出力は次のとおりです。
開始日の計算
開始日(StartDate)は、先月の最初の日です。これは、 DATEFROMPARTS()でも計算できます。 DATEADD()と一緒に関数 機能。
AfterEndDateから1か月を引く DATEADD()を使用する 関数、先月の開始日を取得します。
次の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>
出力は次のとおりです。
ShowMonthlySalesストアドプロシージャ
パラメータを必要とせずに、上記の計算に基づいて正しい期間と月間売上高を計算するように、ストアドプロシージャをコーディングします。
次のようにストアドプロシージャを作成します。
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
テスト-ストアドプロシージャの実行
現在の日付が2019年7月6日であると仮定します 、サンプルデータベース ITSalesに対してストアドプロシージャを実行してみましょう 結果を確認するには:
--Test-run the ShowMonthlySales procedure EXEC ShowMonthlySales
出力は次のとおりです。
おめでとう!これで、プロの月次売上レポートの背後で実行できるストアドプロシージャが正常に作成されました。手つかずのままで、ビジネス要件が変わらない限り、この手順は1年を通して機能します。
やるべきこと
月次レポートのストアドプロシージャを作成できるようになったので、スキルをさらに向上させるために次のことを試してください。
- 開始日に基づいて毎日の売上高を表示するレポートストアドプロシージャを作成します および終了日後 この記事で説明するロジック
- 月間売上高の論理を念頭に置いて、年間売上高のレポート手順を作成してみてください
- SSRSレポートを作成して、次の記事を参照しながら、この記事に記載されているストアドプロシージャに基づいて月間売上高を表示します。
- パラメータを使用した顧客重視のSSRSレポートの作成
- SSRSは簡単な用語で開発を報告します