- - PR -
サブレポートにDataSetを動的に渡した時にエラー
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-02-27 23:19
初めまして、dewと申します。
以前からこちらの掲示板で勉強させて頂いています。 過去ログから似た現象はあったのですが、解決に至りませんでしたので、 スレッドを立てさせて頂きます。 <現象> サブレポートにDataSetを動的に渡した時に、Exportで下記エラーが発現します。 「アプリケーションでサーバー エラーが発生しました。 クエリー エンジン エラー : 'c:\inetpub\wwwroot\XXX\AAA.rpt'」 <開発環境> ・OS:Windows XP Professional ・開発言語:Visual Studio .NET 2003(ASP.NET+VB.NET) サブレポートのDataSetを設定するロジックの crCurSubRepDoc.Database.Tables(0).SetDataSource(dsReportSource) をコメントアウトし、メインレポートのDataSetを動的に渡しただけのプログラムにすると、 サブレポートのデータは更新されませんが(勿論ですが)、エラーもなくなります。 社内で似たようなソースで出力している帳票もあり、それを参考にしているのですが、 どうしても解決できません。 下記にソースを記載しますので、原因になりそうな箇所が判りましたらご教授下さい。 何卒よろしくお願いします。m(_~_)m -----------------------------------<以下ソース>----------------------------------- Dim crReportDocument As CrystalDecisions.CrystalReports.Engine.ReportDocument Dim dsReportSource As New DataSet Dim crExportOptions As CrystalDecisions.Shared.ExportOptions Dim crDiskFileDestinationOptions As CrystalDecisions.Shared.DiskFileDestinationOptions Dim crCurSection As CrystalDecisions.CrystalReports.Engine.Section Dim crCurReportObjct As CrystalDecisions.CrystalReports.Engine.ReportObject Dim crCurSubRepObjct As CrystalDecisions.CrystalReports.Engine.SubreportObject Dim crCurSubRepDoc As CrystalDecisions.CrystalReports.Engine.ReportDocument Dim ArrayCount As Integer Dim i As Integer '******************** ' レポートをロードします。 crReportDocument = New CrystalDecisions.CrystalReports.Engine.ReportDocument crReportDocument.Load("rptファイルフルパス") '******************** ' メインレポートのデータセットを設定 If psXmlPath(0) <> "" Then dsReportSource.ReadXml("メインレポート用XMLファイルフルパス") crReportDocument.Database.Tables(0).SetDataSource(dsReportSource) End If '******************** ' サブレポートのドキュメントオブジェクト取得 ' psSubRepNameを取得して、SubreportObject型としてキャストします。 crCurSubRepObjct = crReportDocument.ReportDefinition.ReportObjects.Item("サブレポート項目名") crCurSubRepDoc = crCurSubRepObjct.OpenSubreport(crCurSubRepObjct.SubreportName) '******************** ' サブレポートのデータセットを設定 dsReportSource.ReadXml(サブレポート用XMLファイルフルパス) crCurSubRepDoc.Database.Tables(0).SetDataSource(dsReportSource) '←★ここをはずすと、エラーが出ない。 '******************** '出力ファイル名指定 crDiskFileDestinationOptions = New CrystalDecisions.Shared.DiskFileDestinationOptions crDiskFileDestinationOptions.DiskFileName = "PDFファイルフルパス" '******************** '出力オプション crExportOptions = crReportDocument.ExportOptions With crExportOptions .DestinationOptions = crDiskFileDestinationOptions .ExportDestinationType = CrystalDecisions.Shared.ExportDestinationType.DiskFile .ExportFormatType = CrystalDecisions.Shared.ExportFormatType.PortableDocFormat End With 'DB接続 crReportDocument.SetDatabaseLogon("ユーザID", "PassWord") 'ファイル出力 crReportDocument.Export() | ||||||||
|
投稿日時: 2006-03-14 17:01
自己解決しました。
Dim dsReportSource As New DataSet を配列で宣言して、メインレポート、サブレポートと 別の変数でデータセットを作成したら問題なく動作しました。 私の場合、配列を使わざるを得ない状況ですが、 別名で宣言しても動作すると思います。 --<以下、お役に立つかどうかわかりませんが、変更した箇所です>-- Dim dsReportSource() As DataSet : ReDim dsReportSource(2) : dsReportSource(0) = New Dataset dsReportSource(0).ReadXml("メインレポート用XMLファイルフルパス") crReportDocument.Database.Tables(0).SetDataSource(dsReportSource(0)) : dsReportSource(1) = New Dataset dsReportSource(1).ReadXml(サブレポート用XMLファイルフルパス) crCurSubRepDoc.Database.Tables(0).SetDataSource(dsReportSource(1)) | ||||||||
|
投稿日時: 2006-03-14 17:19
# 解決されたようなので、ざっくり解決策を削除。(>_<)
DataSet は参照型なので、別の DataSet を生成しちゃえば当然上書きされます。
使わざるをえない状況が想定できませんが、別名でやるべきだと思います。 配列にするのは「配列にすべき概念」がある場合のみです。 個々に別の役割 (渡す先) があるのであれば、別名の方が意味がわかりやすいです。 ソースコードを追っていて思ったのですが、 変数は「使う直前に宣言 + 初期化」するのが望ましいです。 配列の確保も同様です。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |
1