会社に支店のネットワークがあり、支店マネージャーへの作業結果を含むレポートを毎週配布する必要があるとします。 レポートには、過去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)で使用できます。