Antoine.st About Crystal Reports

How to use DataSet in Crystal Reports.

どうも、Crystal Reports のネタばっかり。ま、いいんだけど。

ADO.NET と Crystal Reports の場合、ヘルプには「Push 型のみの利用」と書かれて ます。でも、どうも下手をすると「Pull 型」になってしまうみたいです。どういう ことかというと、DataSet が空の場合、自動的にログオンしてデータを取得してこ ようとするようです。その際に、ログオン情報がきちんと設定されていないと、 ログオンできなくてエラーになります。

他の用途に DataSet を使うことを考えると、「Push 型」の方が使い回しが効くわけ で、たとえば DataGrid に設定した DataSet をそのまま使って印刷、とか。しかし、 これをやるときに、ちょっとしたポイントがありました。

Crystal Decisions の Knowledge Base にも情報がありますが、DataSet の TableName を設定しておかないと「Logon Failed」エラーが発生します。また、 レポートに DataSet を設定するときに、以下のようにしないといけないようです。


  rpt.Database.Tables(0).SetDataSource(ds)

Passing value to Crystal Reports.

単純に値を設定するだけなら、こんな感じでいいみたいです。フィールド名を指定し て、そのフィールドを取得し、Text プロパティに値を設定する、と。


  Dim txtOutputField As TextObject

  txtOutputField = _
    rpt.ReportDefinition.ReportObjects.Item("txtOutputFieldName")
  txtOutputField.Text = "Some Value"

How to use Crystal Reports on ASP.NET.

  1. まずは、レポートを作成するんですが、その前にデータセットを作成しておきます。
  2. 作成したデータセットを元に、レポートを作成します。このとき、なぜか 「Manifest がどうこう」いうエラーが出るので、先ほど作成した XML スキーマ を指定します。(追記: 「プロジェクトデータ」から選択するのではなく、 「その他のデータソース」-「ADO.NET(XML)」を選ぶと、直接 XML スキーマが 指定できます)
  3. おわり。後は、コードを書きます。こんな感じ。これで、PDF ファイルを作らず (裏でテンポラリのファイルはできちゃうけど) に、直接ブラウザに PDF を出力する ことができます。

  Public Overloads Sub ShowReportDirect( _
    ByVal rpt As ReportDocument, _
    ByVal pg As Page, _
    ByVal ds As DataSet _
  )
    Dim exp As ExportOptions
    Dim req As ExportRequestContext
    Dim st As System.IO.Stream
    Dim b() As Byte

    rpt.Database.Tables(0).SetDataSource(ds)

    exp = New ExportOptions()
    exp.ExportFormatType = _
      ExportFormatType.PortableDocFormat

    exp.FormatOptions = New PdfRtfWordFormatOptions()
    req = New ExportRequestContext()
    req.ExportInfo = exp

    With rpt.FormatEngine.PrintOptions
      .PaperSize = PaperSize.PaperA4
      .PaperOrientation = PaperOrientation.Landscape
    End With
    st = rpt.FormatEngine.ExportToStream(req)

    pg.Response.ClearHeaders()
    pg.Response.ClearContent()
    pg.Response.ContentType = "application/pdf"

    ReDim b(st.Length)
    st.Read(b, 0, CInt(st.Length))
    pg.Response.BinaryWrite(b)
    pg.Response.End()

  End Sub