- PR -

サブレポートにDataSetを動的に渡した時にエラー

1
投稿者投稿内容
dew
会議室デビュー日: 2006/02/27
投稿数: 2
投稿日時: 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()
dew
会議室デビュー日: 2006/02/27
投稿数: 2
投稿日時: 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))
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-14 17:19
# 解決されたようなので、ざっくり解決策を削除。(>_<)

引用:

dewさんの書き込み (2006-03-14 17:01) より:

Dim dsReportSource As New DataSet
を配列で宣言して、メインレポート、サブレポートと
別の変数でデータセットを作成したら問題なく動作しました。


DataSet は参照型なので、別の DataSet を生成しちゃえば当然上書きされます。

引用:

私の場合、配列を使わざるを得ない状況ですが、
別名で宣言しても動作すると思います。


使わざるをえない状況が想定できませんが、別名でやるべきだと思います。
配列にするのは「配列にすべき概念」がある場合のみです。
個々に別の役割 (渡す先) があるのであれば、別名の方が意味がわかりやすいです。

ソースコードを追っていて思ったのですが、
変数は「使う直前に宣言 + 初期化」するのが望ましいです。
配列の確保も同様です。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

スキルアップ/キャリアアップ(JOB@IT)