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
相关产品推荐
相关产品推荐

