久々にクリスタルレポートを作成したら見事にハマりました。
クリスタルレポートのクリスタル構文におけるグローバル変数は、例えば以下のように書けます。
Global numberVar rowcount
デフォルトがグローバルなので、
numberVar rowcount
でも同じです。
問題はこのrowcountを複数の箇所で宣言してもエラーになりません。したがって、rowcountを複数で宣言していることに気付かないと、おかしな動作にぶちあたることになります。例えば、
rowcount := rowcount + 1
と書いて、レコードが読まれる度に1づつインクリメントされることを期待します。ところが他の場所でも同じrowcountを宣言して同じ処理をしている場合、rowcountは2づつインクリメントされることになります。これは、随分前に作成したレポートを久しぶりに改修するような場合に起こりやすいでしょう。
こういう例はまだわかりやすいのですが、もっと複雑なロジックだとこの現象の原因に気付くのに時間がかかります。
そういうわけでハマりました。2時間も・・・
なでしこジャパンが銅メダルをかけて闘っているというに、ふたたびこんな時間を浪費しないようにブログに戒めとして残しておきます。