- PR -

CrystalReports で ArgumentOutOfRangeException

1
投稿者投稿内容
Taro
会議室デビュー日: 2005/11/01
投稿数: 10
投稿日時: 2005-11-02 21:44
VB.NET + Crystal Reports for Visual Studio .NET で
Windows アプリを開発しています。

CrystalReports で複数の「式」を使用しているのですが
ある一定数以上の式に処理を記述し実行すると
下記のException が発生します。
式に記述している処理を一定数まで削除すると再び正常に動きます。
(式に記述している処理で配列は使用していません。)
サービスパック2をあてても現象は変わりませんでした。
式に容量とかがあるのでしょうか?

「'System.ArgumentOutOfRangeException' の初回例外が mscorlib.dll で発生しました。
追加情報 : インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。」

どなたか同じ経験をされた方
いらっしゃいませんでしょうか?

開発環境
OS WinXP SP1
VisualStudio2003 Version 7.1.3091
.Net FrameWork 1.1.43322 SP1
Crystal Reports for Visual Studio .NET 2003 SP2

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-02 23:30
とりあえず、どのような式なのかを教えて頂けないでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Taro
会議室デビュー日: 2005/11/01
投稿数: 10
投稿日時: 2005-11-03 15:13
じゃんぬねっとさん、お世話になります。

式フィールドに
------------------------------------------------------------------
WhilePrintingRecords;
ccur({element名称.XXXX})
------------------------------------------------------------------
という処理のみを記述。
または
------------------------------------------------------------------
if OnFirstRecord = false then
0
else
1
------------------------------------------------------------------
という処理のみを記述。
または
------------------------------------------------------------------
if next({element名称.XXXX}) <> {element名称.XXXX} then
0
------------------------------------------------------------------
という処理のみを記述すると ArgumentOutOfRangeException が発生します。

------------------------------------------------------------------
ccur({element名称.XXXX})
------------------------------------------------------------------
という処理のみだとException が発生しなくなり
正常に帳票の出力が行えます。
同じ帳票の他の式フィールドで上記の処理が記述されているものがありますが
そちらでは問題が発生していません。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-03 15:36
式を拝見する限り、どうも不可思議な現象ですね。
まず、

引用:

Taroさんの書き込み (2005-11-03 15:13) より:

ccur({element名称.XXXX})


これ単独では問題がないとのことですよね。

引用:

WhilePrintingRecords;
ccur({element名称.XXXX})


これは、評価時期を入れてるだけですから、
こんなので、例外が発生するのはおかしいです。

引用:

if OnFirstRecord = false then
0
else
1


これも、ただの出力時期評価関数なので普通は問題ないハズです。

引用:

if next({element名称.XXXX}) <> {element名称.XXXX} then
0


これは、最終レコードの判断は必要です。
どちらにしても "または" と仰ってますから、
最初の 2 つを考えると、どう考えてもおかしいです。

ナレッジ ベースでも調べましたが、なさそうなので、
とりあえず、ベンダでのサポートを受けた方が良いかもしれません。
http://japan.crystaldecisions.com/support/crystal/assist.asp

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Taro
会議室デビュー日: 2005/11/01
投稿数: 10
投稿日時: 2005-11-03 17:57
じゃんぬねっとさん、ありがとうございます。

テクニカルサポートへメールで問い合わせました。
結果は、またご報告させていただきます。

それにしても困りました、
こんなところでつまずくとは。。。
Taro
会議室デビュー日: 2005/11/01
投稿数: 10
投稿日時: 2005-11-11 18:04
問題が解決しましたのでご報告したします。

例外が発生していた式フィールドは、
詳細セクションに配置されており
また、積算合計フィールドで使用されている式フィールドでした。
その場合に、
「WhilePrintingRecords;」を先頭に追加すると
出力時に評価される式となり
積算合計フィールドは、WhilePrintingRecords よりも前で評価するため
例外になってしまう、というのが原因でした。

回避策としては、
積算合計フィールドは使用せずに
自力でSUM する式フィールドを実装する、というものでした。
詳細セクションに、加算した値を保持する式フィールドを追加し
例)
WhilePrintingRecords;
CurrencyVar Amount;
Amount:=Amount + CCur({Element名称.XXXXX})

さらに、自分でグループの変更時にAmount を初期化しなくてはいけないので
グループヘッダーセクションに
例)
WhilePrintingRecords;
CurrencyVar Amount:=0;

という式フィールドを配置。
詳細セクションに値を表示するための
式フィールドを配置。
例)
WhilePrintingRecords;
CurrencyVar Amount;

恐らく、試してはいないのですが
Next はグループフッターに配置された
積算合計フィールドに記述していたのですが、
こちらは積算対象の式フィールドに WhilePrintingRecords; が記述されていたため例外が発生
していたからで積算合計フィールド自体に記述していた Next がトリガーではなかったと思われます。
また OnFirstRecord を記述した式フィールドは、詳細セクションに配置されていて
積算合計フィールドで使用される式フィールドであった為、
OnFirstRecord より先に積算合計フィールドの評価が行われて
例外が発生していたのではなかったかと思われます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-11 18:28
ご報告ありがとうございました。(*_ _)

Amount って Shared または Global 定義しなくても OK なんでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Taro
会議室デビュー日: 2005/11/01
投稿数: 10
投稿日時: 2005-11-11 19:43
たしかに Global にしないと他から見えないのかなと思いましたが
結果は大丈夫でした。
※ちなみに先ほどのサンプルは BusinessObjects から頂いたものです。
1

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