如何在Crystal报表文本字段中展示表列DO_NO的唯一值?
解决Crystal报表中显示DO_NO列唯一值并逗号分隔的问题
我之前做报表时刚好碰到过一模一样的需求,给你两个实用的方案,你可以根据自己的情况选择:
方案1:数据库查询层面直接处理(推荐,更高效)
如果你的数据源支持聚合函数,直接在SQL查询里就把去重+拼接搞定,报表里直接用这个结果字段就行,省得在报表里折腾。
比如用SQL Server的话,查询语句可以写成:
SELECT STRING_AGG(DISTINCT DO_NO, ',') AS Unique_DO_NO FROM 你的数据表名
如果是Oracle(11g及以上),可以用LISTAGG:
SELECT LISTAGG(DISTINCT DO_NO, ',') WITHIN GROUP (ORDER BY DO_NO) AS Unique_DO_NO FROM 你的数据表名
把这个查询作为报表的数据源,然后直接把Unique_DO_NO字段拖到文本框里就搞定了,简单高效。
方案2:Crystal报表端处理
如果没法修改数据源,那就在报表里用公式字段实现:
- 创建初始化变量的公式,命名为
InitializeUniqueList,内容如下:
WhilePrintingRecords; StringVar uniqueList := "";
把这个公式放在报表的报表页眉里,用来初始化全局字符串变量。
- 创建构建唯一值列表的公式,命名为
BuildUniqueList,内容:
WhilePrintingRecords; StringVar uniqueList; // 检查当前DO_NO是否已在列表中,避免重复添加 If Not({你的数据表.DO_NO} In Split(uniqueList, ",")) Then // 处理第一个值,避免开头出现多余逗号 uniqueList := If uniqueList = "" Then {你的数据表.DO_NO} Else uniqueList + "," + {你的数据表.DO_NO}; uniqueList
把这个公式放在细节节里,让每一行数据都触发检查并添加唯一值。
- 创建最终展示的公式,命名为
DisplayUniqueList,内容:
WhilePrintingRecords; StringVar uniqueList; uniqueList
把这个公式放在报表页脚里,这里就会显示最终拼接好的唯一值列表了。
注意:如果报表有分组逻辑,要调整公式放置的位置(比如对应组的页眉/脚),确保变量作用域覆盖到目标数据范围。
内容的提问来源于stack exchange,提问作者Vineeth
相关产品推荐
相关产品推荐

