Crystal Reports公式求助:多Tensile.SOItemNum实例合并字符串
解决Crystal Reports中合并多实例Tensile字段的问题
我懂你现在的困扰——之前用Next函数尝试合并多个Tensile实例的片段没成功,想要把同一组里所有{Tensile.SONum}-{Tensile.SOItemNum}-{Tensile.Lot}用逗号拼接,其他字段保持原样对吧?咱们换个思路,用全局数组变量+组汇总的方式就能完美解决,具体步骤如下:
第一步:先设置分组
首先得把报表按你输出中重复的字段分组(比如{SOItem.CustPO}、{SOItem.SOItemNum}、{SOItem.ProdCode}这些在期望输出里不变的字段),确保所有需要合并的Tensile记录都在同一个组内。
第二步:创建初始化变量的组头公式
新建一个组头公式(命名为@Init_CombinedTensile),用来初始化存储Tensile片段的数组:
WhileReadingRecords; Global StringVar Array combined_tensile; combined_tensile := []; // 每次进入新组时清空数组
把这个公式拖到组头区域,右键选择「隐藏」,只需要它执行初始化逻辑就行。
第三步:创建累加Tensile片段的细节公式
新建细节公式(命名为@Accumulate_Tensile),用来把每条Tensile的片段添加到数组里:
WhileReadingRecords; Global StringVar Array combined_tensile; // 生成当前Tensile的目标片段 StringVar current_segment := totext({Tensile.SONum}, 0, "") & "-" & totext({Tensile.SOItemNum}, 0, "") & "-" & {Tensile.Lot}; // 将片段加入数组 combined_tensile := combined_tensile + [current_segment];
同样把这个公式拖到细节区域并隐藏,只需要它执行累加操作。
第四步:创建最终显示的公式
新建一个显示用的公式(替换你原来的公式),把数组拼接成字符串后组合成完整输出:
WhileReadingRecords; Global StringVar Array combined_tensile; // 用逗号连接数组里的所有片段 StringVar merged_tensile := Join(combined_tensile, ","); // 拼接完整的输出格式 "0003015339|01|" & merged_tensile & "|" & {SOItem.CustPO} & "|" & totext({SOItem.SOItemNum}, 0, "") & "|" & {SOItem.ProdCode} & "|" & totext({ManifestLotView.Manifest}, 0, "") & "-" & totext({ManifestLotView.SONum}, 0, "") & "-" & totext({ManifestLotView.SOItemNum}, 0, "")
把这个公式拖到组尾区域(这样每组只会显示一次合并后的结果);如果你的需求是每条细节行都重复显示这段合并内容,就拖到细节区域即可。
为什么之前的Next函数不行?
Next函数只能判断相邻的下一条记录,没法处理超过2条的Tensile实例,而且逻辑上只能手动拼接两条,扩展性很差。用数组变量的方式可以自动收集同一组内的所有Tensile片段,不管有多少条都能正确合并。
内容的提问来源于stack exchange,提问作者Jacqueline Reynard
相关产品推荐
相关产品推荐

