ReportViewer for ASP.NET Web Forms
動的 Web レポート
C1Report の使い方 > Web アプリケーションの開発 > 動的 Web レポート

動的 Web レポートは、オンデマンドで、おそらくユーザーが提供するデータに基づいて作成されます。通常、このタイプのソリューションは、ユーザーにフォームを提示する ASP.NET ページを含み、レポートの作成に必要な情報を収集し、C1Report コンポーネントを作成して、レポートを一時ファイルに表示し、そのファイルの参照を返します。

以下の例は、ユーザーが何らかの情報を入力して、希望するレポートのタイプを選択できる単純な ASP.NET ページです。これに基づいて、ASP コードが NorthWind による「Employee Sales by Country(社員の国別売上高)」レポートのカスタムバージョンを作成し、それを選択した形式でユーザーに提示します.

サンプルは、レポートを格納するサーバー上の一時ファイルを使用しています。実際のアプリケーションでは、ファイルを確認する機会をユーザーに提供する前に、レポートが上書きされないように、独自のファイル名を作成し、一定期間経過後それらを削除する必要がある場合があります。ただし、このサンプルでは、C1Report を含む Web 上でのレポートの配信に関連する主な手法について説明します。

このタイプのアプリケーションを実装するには、以下の手順を実行します。

  1. 以下のような Web ページを含む新しい Web アプリケーションを作成から始めます。

    ページには、以下の5種類のサーバーコントロールがあります。

    • _1stYear: データ(1994、1995、および 1996)が存在する有効な年度のリストを含みます。スマートタグ()をクリックし、メニューから[項目の編集]を選択して、項目を追加できることに注意してください。[ListItem コレクションエディタ]から、3つの新しい項目を追加します。
    • _txtGoal: 各社員の年次販売目標を含みます。
    • _btnHTML, _btnPDF: レポートを HTML または PDF に表示するために使用するボタンを含み、結果を表示します。
    • _lblStatus: 失敗が発生した場合、エラー情報を表示します。
    メモ:このアプリケーションを C1Report コンポーネントのデモ版またはベータ版で実行する場合、コントロールがサーバー上で[バージョン情報]ダイアログボックスを表示しようとしたときにエラーが発生します。この場合、単にページをリロードすると問題は解決します。
  2. ページを設定した後で、C1Report への参照をプロジェクトに 追加する必要があります。ソリューションエクスプローラウィンドウでプロジェクトを右クリックし、[参照の追加]を選択して、C1Report コンポーネントを選択します。
  3. Data フォルダ内のプロジェクトに Nwind.xml を追加します。ソリューションエクスプローラウィンドウでプロジェクトを右クリックし、[新規フォルダ]を選択して、Data フォルダの名前を変更します。次に、フォルダを右クリックし、[既存項目の追加]を選択して、デフォルトで C:\Users\Documents\ComponentOne Samples\Common ディレクトリにインストールされる Nwind.xml 定義ファイルを参照します。
  4. プロジェクトに Temp フォルダを追加します。ソリューションエクスプローラウィンドウでプロジェクトを右クリックし、[新規フォルダ]を選択して、Temp フォルダの名前を変更します。
  5. 従来の ASP を使用している場合、ここから興味深いことが始まります。コントロールをダブルクリックすると、Windows フォームプロジェクトの記述に使用する同じエディタと環境を使用して、イベントを処理する本格的なコードを記述できるコードウィンドウが表示されます。

    次のコードを追加します。

    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);        
    }
    

    これは、ユーザーがいずれかのボタンをクリックしたときにサーバー上で実行されるコードです。

  6. 次のコードは、作業をメインルーチンの RenderReport に委任します。

    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 ブロックで囲まれていることに注意してください。レポートの生成時に失敗が発生した場合、問題を説明するメッセージがユーザーに対して表示されます。

  7. 最後に、いくつかの単純なヘルパールーチンを追加する必要があります。

    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\";        
    }
    
  8. このコードを入力したら、アプリケーションを使用する準備が完了します。[F5]キーを押して、Visual Studio 内でその実行を追跡します。

以下のスクリーンショットは、ブラウザに表示される結果を示しています。