Crystal Reportsを使用した動的なカスタムレポート

この投稿は、レポートまたは分析資料の動的なパーソナライズされた郵送のタスクに直面している人向けです。



会社に支店のネットワークがあり、支店マネージャーへの作業結果を含むレポートを毎週配布する必要があるとします。 レポートには、過去1週間のブランチのアクティビティの結果(表、グラフ、分析情報)が含まれている必要があります。 したがって、ブランチごとに、レポート内の情報は一意です。



すばやく簡単に行う方法を説明します。

この問題を解決するには、 Crystal Reports 2008およびVisual Studio 2010が必要です(以前のバージョンの製品を使用できます)。

レポートの配布を自動化するには、レポートのすべての分析情報がデータベースに含まれている必要があります。 そのため、レポートを送信する前に、1つ以上のデータベースクエリで各ブランチのデータを受信することをお勧めします。

クエリ結果の例:





Crystal Reportsを使用して、個々の支店の売上、費用、その他の指標に関するデータを含むレポートを生成できます。 レポートでは、このクエリの結果をデータソースとして使用し、レコード選択式では、1つのブランチにフィルターを使用します。 たとえば、支店番号は1です。
{data.branch} = 1
      
      







Crystal Reportsは、式やサブアカウントなどのツールを使用した非常に柔軟なツールであるため、単純な1ページのレポートから表やグラフを含む膨大な分析スタディまで、あらゆるドキュメント形式を作成できます。



さらに、レコード選択式を変更すると、レポート内の任意のブランチに関する情報を表示できます。

次に行う必要があるのは、レポートをいずれかの形式(pdf、xls、rtf)にエクスポートし、電子メールで送信することです。



これをどのように自動化できるか見てみましょう。


まず、支店番号とレポート受信者の電子メールを含むテーブルが必要です。 このテーブルの行に沿ってループを実装する必要があります。 次に、各行について、ブランチ番号を取得し、レポートのレコード選択式に代入します。 次に、レポートをPDFファイルにエクスポートし、このファイルをレターに添付します。 適切な住所に手紙を送ります。



Crystal Reportsは、レポート開発環境だけでなく、NETプラットフォームの開発コンポーネントも提供します。

以下は、Visual Basicのサンプルコードです。



 Imports System.Net.Mail Imports System.IO Imports System.Net.NetworkCredential Imports CrystalDecisions Module Module1 Sub Main() '      Dim Rows1 As DataRow Dim Table1 As New myData.MailListDataSet.Query1DataTable Dim myDA As New myData.MailListDataSetTableAdapters.Query1TableAdapter Dim strDate = Format(CDate(Today()), "ddMMyyyy") Dim myBranch As Integer Dim myBranchMail As String Dim myAppPath As String Dim myLogFilePath As String Dim myLogStr As String myAppPath = My.Application.Info.DirectoryPath ' ,      Dim myDirInf As New DirectoryInfo(myAppPath + "\" + strDate) If Not myDirInf.Exists() Then myDirInf.Create() End If '          myLogFilePath = myAppPath + "\" + strDate + "\log.txt" Dim fs As StreamWriter = File.CreateText(myLogFilePath) '   ( ,   ) myDA.Fill(Table1) '  ReportDocument     Dim myReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument myReport.FileName = myAppPath + "\report1.rpt" '   For Each Rows1 In Table1.Rows '     myBranch = Rows1.Item(0) myBranchMail = Rows1.Item(1) ' Record Selection Formula myReport.RecordSelectionFormula = "{data.branch} = " + CStr(myBranch) '  myReport.Refresh() Try '   pdf (   -    ) myReport.ExportToDisk([Shared].ExportFormatType.PortableDocFormat, myAppPath + "\" + strDate + "\Report for Branch " + CStr(myBranch) + " " + strDate + ".pdf") '       myLogStr = CStr(Now()) + ": " + "generate file for Branch " + CStr(myBranch) + Chr(13) + Chr(10) Console.Write(myLogStr) fs.Write(myLogStr) Catch exp As Exception '      Console.WriteLine("Erorr:" & exp.Message) myLogStr = CStr(Now()) + ": Erorr" & exp.Message & " when generate file for Branch " + CStr(myBranch) + Chr(13) + Chr(10) Console.Write(myLogStr) fs.Write(myLogStr) End Try ' Smtp Client      Dim mySmtp As New System.Net.Mail.SmtpClient("company.com") mySmtp.Credentials = New System.Net.NetworkCredential("user", "password") ' ,     Dim myMsg As New System.Net.Mail.MailMessage("mail@example.com", myBranchMail, "   X", _ "   " + CStr(myBranch) + ",      .") '     pdf  Dim myAtt As New System.Net.Mail.Attachment(myAppPath + "\" + strDate + "\Report for Branch " + CStr(myBranch) + " " + strDate + ".pdf") myMsg.Attachments.Add(myAtt) Try '  mySmtp.Send(myMsg) '       myLogStr = CStr(Now()) + ": " + "sending file for Branch " + CStr(myBranch) + ", on " + myBranchMail + Chr(13) + Chr(10) Console.Write(myLogStr) fs.Write(myLogStr) Catch exp As Exception '      Console.WriteLine("Erorr:" & exp.Message) myLogStr = CStr(Now()) + ": Erorr" & exp.Message & " when sending file for Branch " + CStr(myBranch) + Chr(13) + Chr(10) Console.Write(myLogStr) fs.Write(myLogStr) End Try Next Rows1 fs.Close() End Sub End Module
      
      







コードを使用して、コンソールアプリケーションを作成してスケジュールどおりに実行するか、ETISパッケージSSIS(MS SQL Server Integration Services)で使用できます。



All Articles