【问题标题】:Division by zero in crosstab formula交叉表公式中除以零
【发布时间】:2011-01-20 22:43:37
【问题描述】:

我有一个带有公式字段的交叉表。查询返回类似

 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

但是,它返回除以零错误。为什么我的付款模式公式无法正确评估。我尝试将付款模式公式放在报告标题中,交叉表是第二个标题,但它仍然抛出相同的错误。

【问题讨论】:

    标签: crystal-reports crystal-reports-2008 crystal-reports-xi


    【解决方案1】:

    两个问题。

    第一个语法错误 - 或者更确切地说是错字,最后一个'e'丢失了:)

    numberVar result:={MarketValue}/mode;
    

    第二 - 您需要按指定顺序评估公式。假设您的第一个公式的名称为“calc_mode”,那么第二个应该从下一条语句开始:

    EvaluateAfter({@calc_mode});
    

    【讨论】:

    • 感谢 Arvo,EvaluateAfter() 为我解决了这个问题 =)
    【解决方案2】:

    很高兴您已经找到 Arvo 的答案,但我有一些建议可以简化您的代码:

    1. Mode 是内置的 Crystal 功能(请参阅 Crystal 的帮助文件)。所以当我看到你使用这个词作为自定义变量的名称时,我的大脑做了一个后空翻。不如叫它“numPayPeriods”?

    2. 由于您的示例公式包含字段值,Crystal 默认实现 WhileReadingRecords(再次请参阅 Crystal 的帮助文件)。所以在这种情况下添加它是多余的。你可以把它完全去掉。

    3. 您的示例中不需要 2 个单独的公式。此外,您的 Result 变量在 Crystal 语法中是不必要的。您可以将整个事情简化为 1 个公式:

      if({PaymentMode}='H') then
      {MarketValue}/2
      else
      {MarketValue}/12;

    【讨论】:

    • 嘿PowerUser。非常感谢所有这些信息和有用的提示。我制作了一个单独的变量并将其放在报告标题中,因为我认为它会为每条记录一次又一次地评估。您可能对变量名称部分是正确的,因为由于某些奇怪的原因我无法弄清楚某些行的值为零。对于像你这样的人,stackoverflow 是一个很好的地方。再次感谢你,达米安。
    • 在没有内置调试器的情况下,有时很难理解水晶的处理过程。
    • 谢谢,达米安。顺便说一句,它确实有一个可用于调试的内置编译器。当您保存公式或使用 Alt-C 时,您会弹出任何编译错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多