如何确保多行列拼接字段显示全部值?Crystal Reports公式异常
Crystal Reports 分组合并字段异常问题解决
需求背景
现有报表需将同一客户+同一日期下的多个Sales Code合并到同一行,其他字段(如Transaction Code)同步合并。
当前错误输出(同一客户不同日期的相同Sales Code被错误合并):
| Client | Date | Sales Code | Transaction Code |
|---|---|---|---|
| 1 | 9/17/22 | X23 | |
| 2 | 9/18/22 | A24 | 125 333 |
| 2 | 9/24/22 | B13 K17 | 908 227 |
期望正确输出(不同日期的相同Sales Code保留独立行,同一日期的多字段合并):
| Client | Date | Sales Code | Transaction Code |
|---|---|---|---|
| 1 | 9/17/22 | X23 | |
| 2 | 9/18/22 | A24 | 125 |
| 2 | 9/20/22 | A24 | 333 |
| 2 | 9/24/22 | B13 K17 | 908 227 |
分组设置:Group A(Client ID)→ Group B(Date)
原有公式问题
之前使用的共享变量公式存在两个核心问题:
- 多个字段共用同一共享变量,导致跨字段逻辑干扰
- 重复值判断逻辑(
not({Field_Name} in ConCat))存在误判,且变量重置未彻底隔离不同日期分组
原有公式:
Formula 1(Details节隐藏):
WhilePrintingRecords; Shared StringVar ConCat; If ConCat = "" then ConCat := {Field_Name} else if not({Field_Name} in ConCat) then ConCat := ConCat + " " + {Field_Name}Formula 2(Group B页脚显示):
WhilePrintingRecords; Shared StringVar ConCat;Formula 3(Group B页眉重置):
WhilePrintingRecords; Shared StringVar ConCat := ""
修正后的解决方案
为每个需要合并的字段创建独立的变量逻辑,确保分组内隔离,避免跨日期干扰:
1. Sales Code 合并逻辑
公式1:合并Sales Code(放置在Details节,设置为隐藏)
WhilePrintingRecords; Shared StringVar ConCat_Sales; If ConCat_Sales = "" then ConCat_Sales := {Sales Code} else // 仅在同一日期分组内合并,且避免同一日期下的重复值 if not({Sales Code} in Split(ConCat_Sales, " ")) then ConCat_Sales := ConCat_Sales + " " + {Sales Code}
公式2:显示合并后的Sales Code(放置在Group B(Date)页脚)
WhilePrintingRecords; Shared StringVar ConCat_Sales;
公式3:重置Sales Code变量(放置在Group B(Date)页眉)
WhilePrintingRecords; Shared StringVar ConCat_Sales := "";
2. Transaction Code 合并逻辑
公式1:合并Transaction Code(放置在Details节,设置为隐藏)
WhilePrintingRecords; Shared StringVar ConCat_Trans; If ConCat_Trans = "" then ConCat_Trans := {Transaction Code} else // 跳过空值,避免多余空格 if {Transaction Code} <> "" then ConCat_Trans := ConCat_Trans + " " + {Transaction Code}
公式2:显示合并后的Transaction Code(放置在Group B(Date)页脚)
WhilePrintingRecords; Shared StringVar ConCat_Trans;
公式3:重置Transaction Code变量(放置在Group B(Date)页眉)
WhilePrintingRecords; Shared StringVar ConCat_Trans := "";
关键调整说明
- 独立变量隔离:为Sales Code和Transaction Code分别创建专属共享变量,避免字段间逻辑干扰
- 精准重置:每个变量在Group B(Date)页眉强制清空,确保新日期分组从零开始合并
- 可靠去重判断:用
Split将已合并字符串转为数组后判断重复,避免字符串包含的误判(如"A24"不会被误判为包含在"A245"中) - 空值处理:Transaction Code合并时跳过空值,避免生成无效空格
内容的提问来源于stack exchange,提问作者newiso4not5
相关产品推荐
相关产品推荐

