SAP Crystal报表:按行项目而非工单/数量统计的方法咨询
改进SAP Crystal报表:按物料而非工单统计数量的公式方案
我明白你现在的需求——要把报表里的统计维度从工单切换到物料(产品),替代原来按工单下的行项目计数逻辑。先拆解下你现有公式的问题:当前代码里的Count({rpt_PackingSlip.LabelQTY}, {rpt_PackingSlip.WorkOrderNo})是按工单分组统计行项数,这和你要的按物料统计不符,下面给你针对性的改进方案:
前提准备:设置物料分组
首先必须确保报表已经按物料字段分组(比如你的物料编码字段{rpt_PackingSlip.MaterialCode}或产品名称字段{rpt_PackingSlip.ProductName}),步骤是:右键报表空白处 → 插入 → 组,选择对应的物料字段作为分组依据。这是Crystal报表实现分组统计的基础。
方案1:统计每个物料的累计数量(按实际数量累加)
如果你的需求是统计每个物料的累计出库/打印数量(比如每行的LabelQTY累加),可以这样设置:
- 创建重置变量的公式(命名为
@ResetMaterialCount),放在物料组的组头:
WhilePrintingRecords; NumberVar MaterialTotal := 0; // 每个物料组开始时重置累加器
- 创建显示用的公式(命名为
@MaterialCountDisplay),放在细节行或物料组尾:
WhilePrintingRecords; NumberVar MaterialTotal := MaterialTotal + {rpt_PackingSlip.LabelQTY}; // 格式化为"当前累计/物料总数量" ToText(MaterialTotal, "0") & "/" & ToText(Sum({rpt_PackingSlip.LabelQTY}, {rpt_PackingSlip.MaterialCode}), "0")
这里的Sum(..., {物料字段})会自动计算当前物料组的总数量,替代原来按工单的统计逻辑。
方案2:统计每个物料的行项个数(按行数计数)
如果你的需求是统计每个物料的行项数量(不管每行的LabelQTY,只计行数),调整如下:
- 同样先创建重置变量的公式(
@ResetMaterialLineCount),放在物料组头:
WhilePrintingRecords; NumberVar MaterialLineCount := 0;
- 创建显示公式(
@MaterialLineCountDisplay),放在细节行:
WhilePrintingRecords; NumberVar MaterialLineCount := MaterialLineCount + 1; // 格式化为"当前行号/物料总行数" ToText(MaterialLineCount, "0") & "/" & ToText(Count({rpt_PackingSlip.LabelQTY}, {rpt_PackingSlip.MaterialCode}), "0")
这里的Count现在按物料字段分组统计,得到该物料在报表中的总行项数。
关键注意事项
- 变量作用域:
WhilePrintingRecords确保变量在报表打印阶段计算,和分组逻辑同步,避免跨组累加错误。 - 多字段物料标识:如果你的物料需要用编码+名称联合标识,记得把这两个字段都加入分组,避免不同工单下同名但不同编码的物料被错误合并统计。
- 复用性:如果需要在报表多处使用物料统计值,可以把
Sum或Count的部分单独做成组级公式,方便后续维护。
内容的提问来源于stack exchange,提问作者user9399808
相关产品推荐
相关产品推荐

