假设我正在撰写一份名为
someTable.someColumn
的专栏的报告。我需要的是拥有 ReportHeader 中的所有值。我知道我可以创建一个子报告,向他们传递此列并在详细信息中迭代它,但我想知道是否可以在没有子报告的情况下完成此操作。
如果我使用以下内容,我会得到正确的结果,在我的例子中是 9:
COUNT(someTable.someColumn)
我也尝试了以下方法,但它不起作用 - 它只随机取 9 个值之一。
Local NumberVar i := 0;
Local StringVar Array items := {someTable.someColumn};
Local StringVar output := "";
while (i < count(items)) do (
i := i+1;
output := output + items[i];
);
output;
是否可以迭代列来获取值?
您无法在报告标题中执行此操作。您必须使用详细信息部分来读取每个值。
我想到的唯一解决方案是使用子报表。虽然你不会
pass them this column and iterate it in the details
。因为它只会传递列中的第一个值。您将向其传递报告参数,它可以使用这些参数从数据库获取列值,就像主报告一样。
我还没有找到在报告标题中执行此操作的方法,但您可以使用以下公式将其放入报告页脚中:
global StringVar output;
output := output + {someTable.someColumn} + ",";
这将在报告生成过程中每次
someTable.someColumn
发生变化时执行,并将其附加到全局变量中。不幸的是,它并没有使其所有实例保持最新 - 例如,如果您将其包含在报告详细信息中的某个位置,您将能够看到 output
在报告过程中的演变。在标题中,它只会显示第一个值。
注意: 您不想在此公式中设置
output := ""
,因为每次都会重置该值。不过,Crystal 似乎在创建变量时会自动为您初始化该变量,并且我仅使用上述公式没有遇到任何错误(即,我不需要创建第二个公式来初始化output
) 。我还添加了一个分隔符 (+ ","
),以帮助分隔每个值,但您可以轻松地将其删除。
无法使用子报表的原因?
我的报告有一个首页,其中包含审核控制和选择标准。 我在标题部分粘贴了一个子报告 - 使用之前建议的代码可以轻松实现:
formula MyVar
global StringVar output; output := output + {MyTable.MyColumn} + ",";
将 @Myvar 字段绘制到页脚部分。抑制所有其他部分。 调整子报表的大小,使其适合一行,然后将其移动到标题部分中的其他选择参数下。