動的 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\";
}
|
|
以下のスクリーンショットは、ブラウザに表示される結果を示しています。
