You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Crystal Reports:一次性获取查询返回所有行而非逐行读取

合并Crystal Reports中同一客户的多个手机号

我使用Crystal 2020,拥有osEntity和osCommunication两个表,可通过osCommunication.fkosEntity = osEntity.PK关联。osCommunication存储osEntity中客户的手机号,每个客户可能有多个手机号,因此报表中会出现同一客户多行手机号的情况:

Name            Phone
John Smith      555-555-5555
John Smith      555-555-3333

我希望报表显示为:

Name            Phone
John Smith      555-555-5555, 555-555-3333

尝试过的方法及问题

我曾尝试创建子报表,将主报表的osEntity.PK与子报表的osCommunication.fkosEntity关联,并编写公式循环osCommunication.information字段拼接手机号:

stringvar array numbers := {osCommunication.Information};
numbervar cnt := count(numbers);
stringvar out := "";
numbervar i;

for i := 1 to cnt - 1 step 1 do (
    out := out + numbers[i] + ", ";
);
out := out + numbers[cnt];
out

但问题在于Crystal只能逐行访问数据,导致公式输出的是单个字符拼接而非完整手机号。我想知道如何一次性获取osCommunication查询返回的所有行,而非逐行读取?此前我曾对用户输入参数实现类似操作,但对查询结果却无从下手。


更新:已找到解决方案

感谢@MilletSoftware,我将所有全局变量改为共享变量后,才能在组页脚打印拼接后的手机号列表,同时使用字符串数组便于去重。以下是完整解决方案:

组页眉部分公式

Shared StringVar Array Phones; //存储当前组所有关联手机号的数组
Redim Phones[1]; //每组开始时重置数组
Shared NumberVar reCount; //当前组的记录计数
Shared StringVar currentEntity; //当前组的实体ID

//检查是否是新组,若是则更新实体ID并重置计数
If currentEntity = "" or currentEntity <> {osEntity.EntityID} Then
(
    currentEntity := {osEntity.EntityID};
    reCount := 1
);

详细资料部分公式

Shared StringVar Array Phones;
Shared NumberVar reCount;

//仅添加未在数组中的手机号(去重)
If Not({osCommunication.Information} In Phones) Then
(
    ReDim Preserve Phones[reCount];
    Phones[reCount] := {osCommunication.Information};
    reCount := reCount + 1;
);

组页脚部分公式

Shared StringVar Array Phones;

//将数组中的手机号用逗号连接成字符串
Join(Phones,', ');

内容的提问来源于stack exchange,提问作者Travis Shands

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 13:41:56