Crosstabフォーミュラのゼロによる分割
-
13-10-2019 - |
質問
フォーミュラフィールドを備えたクロススタブがあります。クエリは次のようなものを返します
CategoryID Company MarketValue PaymentMode
1 ABC 1000 H
1 xyz 2000 H
3 efg 9800 H
支払いモードは「H」によって半年示されています。
WhileReadingRecords;
numberVar mode;
if({PaymentMode}='H') then mode:=2 else mode:=12
次に、別の式フィールドを作成しました
WhileReadingRecords;
numberVar mode;
numberVar result:={MarketValue}/mod;
result
ただし、ゼロエラーでディビジョンを返します。支払いモードの式が適切に評価されないのはなぜですか。レポートヘッドとクロスタブは2番目のヘッダーに支払いモードの式を配置しようとしましたが、それでも同じエラーをスローしました。
解決
2つの問題。
最初の構文エラー - またはむしろここでタイプミス、最後の「E」は欠落しています:)
numberVar result:={MarketValue}/mode;
2番目 - 指定された順序で定型を評価する必要があります。最初のフォーミュラに「calc_mode」という名前があるとし、次のステートメントから始める必要があります。
EvaluateAfter({@calc_mode});
他のヒント
Arvoの答えをすでに見つけてよかったですが、コードを簡素化するための提案がいくつかあります。
モード Buit-in Crystal関数です(Crystalのヘルプファイルを参照)。そのため、その単語をカスタム変数の名前として使用しているのを見たとき、私の脳は逆流をしました。代わりに「numpayperiods」と呼んでみませんか?
サンプルフォーミュラにはフィールド値が含まれているため、クリスタル実装 レコードがあります デフォルトでは(繰り返しますが、Crystalのヘルプファイルを参照してください)。この場合、追加することは冗長です。あなたはそれを完全に取り出すことができます。
例には2つの個別の式は必要ありません。また、あなた 結果 Crystal Syntaxでは、変数は不要です。すべてを1式の式だけに簡素化できます。
if({PaymentMode}='H') then
{MarketValue}/2
else
{MarketValue}/12;