動的 Web レポートは、オンデマンドで、おそらくユーザーが提供するデータに基づいて作成されます。通常、このタイプのソリューションは、ユーザーにフォームを提示する ASP.NET ページを含み、レポートの作成に必要な情報を収集し、C1Report コンポーネントを作成して、レポートを一時ファイルに表示し、そのファイルの参照を返します。
以下の例は、ユーザーが何らかの情報を入力して、希望するレポートのタイプを選択できる単純な ASP.NET ページです。これに基づいて、ASP コードが NorthWind による「Employee Sales by Country(社員の国別売上高)」レポートのカスタムバージョンを作成し、それを選択した形式でユーザーに提示します.
サンプルは、レポートを格納するサーバー上の一時ファイルを使用しています。実際のアプリケーションでは、ファイルを確認する機会をユーザーに提供する前に、レポートが上書きされないように、独自のファイル名を作成し、一定期間経過後それらを削除する必要がある場合があります。ただし、このサンプルでは、C1Report を含む Web 上でのレポートの配信に関連する主な手法について説明します。
このタイプのアプリケーションを実装するには、以下の手順を実行します。
ページには、以下の5種類のサーバーコントロールがあります。
次のコードを追加します。
Visual Basic コードの書き方
Visual Basic |
コードのコピー
|
---|---|
Imports C1.C1Report ' ユーザークリックを処理します Private Sub _btnHTML_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles _btnHTML.Click RenderReport(FileFormatEnum.HTMLDrillDown) End Sub Private Sub _btnPDF_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles _btnPDF.Click RenderReport(FileFormatEnum.PDF) End Sub |
C# コードの書き方
C# |
コードのコピー
|
---|---|
using C1.C1Report; // ユーザークリックを処理します private void _btnHTML_Click(object sender, System.EventArgs e) { RenderReport(FileFormatEnum.HTMLDrillDown); } private void _btnPDF_Click(object sender, System.EventArgs e) { RenderReport(FileFormatEnum.PDF); } |
これは、ユーザーがいずれかのボタンをクリックしたときにサーバー上で実行されるコードです。
Visual Basic コードの書き方
Visual Basic |
コードのコピー
|
---|---|
Private Sub RenderReport(ByVal fmt As FileFormatEnum) ' ファイル名をビルドします Dim rpt As String = "地域別従業員売上高" Dim fileIn As String = GetDataPath() & "NWind.xml" Dim ext As String = Iif(fmt = FileFormatEnum.PDF, ".pdf", ".htm") Dim fileOut As String = GetOutputPath() & rpt & ext Try ' C1Report コンポーネントを作成します Dim c1r As New C1Report() ' レポートをロードします c1r.Load(fileIn, rpt) ' ユーザーパラメータを取得します Dim year As String = _lstYear.SelectedItem.Text Dim goal As String = _txtGoal.Text ' レポートのデータソースをカスタマイズします Dim sSQL As String = "SELECT DISTINCTROW " & _ "Employees.Country, Employees.LastName, " & _ "Employees.FirstName, Orders.ShippedDate, Orders.OrderID, " & _ " [Order Subtotals].Subtotal AS SaleAmount " & _ "FROM Employees INNER JOIN (Orders INNER JOIN " & _ " [Order Subtotals] ON Orders.OrderID = " & _ " [Order Subtotals].OrderID) " & _ " ON Employees.EmployeeID = Orders.EmployeeID " & _ "WHERE Year(Orders.ShippedDate) = " & year & ";" c1r.DataSource.RecordSource = sSQL ' レポートのイベントハンドラをカスタマイズします Dim sScript As String = _ "If SalespersonTotal > " & goal & " Then" & vbCrLf & _ " ExceededGoalLabel.Visible = True" & vbCrLf & _ " SalespersonLine.Visible = True" & vbCrLf & _ "Else" & vbCrLf & _ " ExceededGoalLabel.Visible = False" & vbCrLf & _ " SalespersonLine.Visible = False" & vbCrLf & _ "End If" c1r.Sections(SectionTypeEnum.GroupHeader2).OnPrint = sScript ' レポートを一時ファイルに表示します c1r.RenderToFile(fileOut, fmt) ' ユーザーをレポートファイルにリダイレクトします Response.Redirect("Temp/" + rpt + ext) Catch x As Exception _lblStatus.Text = "*** " & x.Message End Try End Sub |
C# コードの書き方
C# |
コードのコピー
|
---|---|
// ファイル名をビルドします private void RenderReport(FileFormatEnum fmt) { // build file names string rpt = "地域別従業員売上高"; string fileIn = GetDataPath() + "NWind.xml"; string ext = (fmt == FileFormatEnum.PDF)? ".pdf": ".htm"; string fileOut = GetOutputPath() + rpt + ext; try { // C1Report コンポーネントを作成します C1Report c1r = new C1Report(); // レポートをロードします c1r.Load(fileIn, rpt); // ユーザーパラメータを取得します string year = _lstYear.SelectedItem.Text; string goal = _txtGoal.Text; // レポートのデータソースをカスタマイズします string sSQL = "SELECT DISTINCTROW " + "Employees.Country, Employees.LastName, " + "Employees.FirstName, Orders.ShippedDate, Orders.OrderID, " + " [Order Subtotals].Subtotal AS SaleAmount " + "FROM Employees INNER JOIN (Orders INNER JOIN " + " [Order Subtotals] ON Orders.OrderID = " + " [Order Subtotals].OrderID) " + " ON Employees.EmployeeID = Orders.EmployeeID " + "WHERE Year(Orders.ShippedDate) = " + year + ";"; c1r.DataSource.RecordSource = sSQL; // レポートのイベントハンドラをカスタマイズします string sScript = "If SalespersonTotal > " + goal + " Then \n" + " ExceededGoalLabel.Visible = True\n" + " SalespersonLine.Visible = True\n" + "Else\n" + " ExceededGoalLabel.Visible = False\n" + " SalespersonLine.Visible = False\n" + "End If"; c1r.Sections[SectionTypeEnum.GroupHeader2].OnPrint = sScript; // レポートを一時ファイルに表示します c1r.RenderToFile(fileOut, fmt); // ユーザーをレポートファイルにリダイレクトします Response.Redirect("Temp/" + rpt + ext); } catch (Exception x) { _lblStatus.Text = "*** " + x.Message; } } |
RenderReport ルーチンは長いですが、非常に単純です。入力および出力ファイルの名前の解決から始めます。すべてのファイル名は、現在のアプリケーションディレクトリと関連付けてビルドされます。
次に、ルーチンは C1Report コンポーネントを作成し、「Employee Sales by Country(社員の国別売上高)」レポートをロードします。これは未処理レポートであり、次の手順でカスタマイズします。
ユーザーが入力したパラメータは、_lstYear および _txtGoal サーバー側コントロールで利用できます。コードはこれらの値を読み取り、これらを使用してレポートの RecordSource プロパティをカスタマイズし、OnPrint OnPrint の VBScript ハンドラをビルドします。これらの手順は、前のセクションで取り扱いました。
レポート定義の準備が完了すると、コードが RenderToFile メソッドを呼び出し、この結果 C1Report コンポーネントによって HTML または PDF ファイルが出力ディレクトリに書き込まれます。メソッドが返されると、レポートはユーザーに表示する準備が完了します。
最後の手順では、Response.Redirect を呼び出し、作成したレポートをユーザーのブラウザ上で表示します。
すべてのコードが try/catch ブロックで囲まれていることに注意してください。レポートの生成時に失敗が発生した場合、問題を説明するメッセージがユーザーに対して表示されます。
Visual Basic コードの書き方
Visual Basic |
コードのコピー
|
---|---|
' ファイルのロードおよび保存に使用するディレクトリを取得します Private Function GetDataPath() As String Return Request.PhysicalApplicationPath + "Data\" End Function Private Function GetOutputPath() As String Return Request.PhysicalApplicationPath + "Temp\" End Function |
C# コードの書き方
C# |
コードのコピー
|
---|---|
// ファイルのロードおよび保存に使用するディレクトリを取得します private string GetDataPath() { return Request.PhysicalApplicationPath + @"Data\"; } private string GetOutputPath() { return Request.PhysicalApplicationPath + @"Temp\"; } |
以下のスクリーンショットは、ブラウザに表示される結果を示しています。