【问题标题】:Crystal Reports - Compounding Total in For Loop - Unexpected ResultsCrystal Reports - 在 For 循环中复合总计 - 意外结果
【发布时间】:2015-05-29 20:43:28
【问题描述】:

我从事编码工作 15 年,了解多种语言,C#、C++、PHP、PAWN、SMALL、ETC 等。 Crystal 语法可能是我见过的最不一致和最荒谬的语法。

无论如何,我在这里尝试做一些简单的事情。我的数据库中有一个格式如下的字符串: “1-DESC、2-其他、5-MISC”

'-' 和 ',' 是用于在我的代码中拆分字符串的分隔符。无论如何,我需要添加 1+2+5 以便 CR 报告这些数字的总数。出于某种原因,在下面的代码中,当我应该得到 10 时,我一直得到“30.00”。我无法理解 CR 是如何做到这一点的......

//create an array of strings by parsing a underscore-delimited string field
Stringvar Array strings := Split({Estim.User_Memo1}, ', ');

numbervar i; 
numbervar total = 0;
numbervar total2 = 0;
For i := 1 to count(strings) Do
( 
    If InStr(strings[i], '-') > 0 then 
    (
        Stringvar Array numdesc := Split(strings[i], '-');
        total2 := ToNumber(numdesc[1]);
        total := total + total2;
        //total := total + ToNumber(numdesc[1]);
    );
);

total;

我被拉取的数据库输入字符串是:“1-Cracked Head, 2-No Threads, 3-O/S Length, 4-U/S Length”

请原谅我多余的总变量。我一直在尝试寻找解决方法大约一个小时。

感谢您的任何见解。

【问题讨论】:

  • 两件小事:首先,你的变量应该声明为Local。其次,您没有使用赋值运算符初始化 totaltotal2 变量,而是使用了相等运算符。尽管如此,当我尝试你的代码时,无论如何我都会得到 10。你绝对确定{Estim.User_Memo1} 的价值吗?您是否已将每个变量依次打印出来作为健全性检查? (您可以使用Join() 打印数组。)
  • Crystal 语法不一致且荒谬。这就是为什么我将这段代码移动到命令或存储过程中,这样我就可以使用 SQL 来解决这样的问题。

标签: loops for-loop crystal-reports integer


【解决方案1】:

首先你需要分配你需要使用的值:

现在要检索您可以使用的数字 Val 函数,该函数将从数字格式的字符串中返回数字,这将使算术运算变得容易。

试试这个...目前我没有 CR 来测试语法..但是逻辑是这样的。

//create an array of strings by parsing a underscore-delimited string field
Stringvar Array strings := Split({Estim.User_Memo1}, ', ');

numbervar i; 
numbervar total:= 0;
numbervar total2:= 0;
For i := 1 to count(strings) Do
( 
//    If InStr(strings[i], '-') > 0 then 
  //  (
    //    Stringvar Array numdesc := Split(strings[i], '-');
      //  total2 := ToNumber(numdesc[1]);
        total := total + Val(strings[i]);
        //total := total + ToNumber(numdesc[1]);
  //  );
);

total;

【讨论】:

    【解决方案2】:

    感谢大家的帮助。 Siva 几乎是对的。出于某种原因,这行得通。

    //create an array of strings by parsing a underscore-delimited string field
    Stringvar Array strings := Split({Estim.User_Memo1}, ', ');
    
    numbervar i:=1;
    numbervar total:= 0;
    
    For i := 1 to count(strings) Do
    ( 
    If InStr(strings[i], '-') > 0 then 
    (
        Stringvar Array numdesc := Split(strings[i], '-');
        total := total + Val(numdesc[1]);
    );
    );
    
    total;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多