Crystal Reports计算常量求和异常及薪资单最新数据统计需求
解决Crystal Reports的两个常见问题:计算常量求和&薪资单最新记录统计
我来帮你拆解这两个问题,一步步解决:
一、计算常量求和时无SUM选项、手动用Sum函数报错的解决办法
首先得明白为什么会出现这个问题:Crystal Reports里的Sum()函数是用来对数据集里的字段/公式字段进行聚合求和的,而你说的「计算常量」本质是单个固定值,不属于数据集的可聚合项,所以系统不会给出SUM选项,硬用Sum()自然会报错。
根据你的实际场景,分两种情况处理:
- 如果是要把多个手动定义的计算常量(比如两个公式字段
@ConstA和@ConstB)加起来,直接用加法就行:{@ConstA} + {@ConstB} - 如果是要对每条记录的动态计算值(比如基于字段的自定义计算)求和,得先把计算逻辑做成一个公式字段,再对这个公式字段用
Sum():- 创建新的公式字段(比如
@PerRecordCalc),写入你的计算逻辑(例如{Table.Salary} * 0.1) - 在报表里用
Sum({@PerRecordCalc})做聚合,要是需要按分组求和,还可以指定分组范围:Sum({@PerRecordCalc}, {Table.Department})
- 创建新的公式字段(比如
二、统计员工最新薪资单的基本工资&养老金缴款
需求核心是:每个员工只取当月最大编号(BUL_0)的薪资单,然后统计指定薪资组件(基本工资、养老金缴款)。推荐两种方案,优先选数据库层面过滤(性能更高):
方案1:用SQL命令作为数据源(推荐)
直接在数据源层面筛选出每个员工的最新薪资单,避免报表端处理大量冗余数据。假设你的员工标识字段是EMP_ID,养老金缴款对应的RUB_0值是PENSION_MTD(你可以根据实际业务值调整),SQL命令如下:
SELECT b.BUL_0, b.DAT_0, b.RUB_0, b.AMT_0, b.EMP_ID FROM BUL_0 b INNER JOIN ( -- 先找出每个员工当月的最大BUL_0编号 SELECT EMP_ID, MAX(BUL_0) AS Latest_BUL FROM BUL_0 -- 限定月度范围,这里以2017年1月为例 WHERE DAT_0 BETWEEN '2017-01-01' AND '2017-01-31' GROUP BY EMP_ID ) latest ON b.EMP_ID = latest.EMP_ID AND b.BUL_0 = latest.Latest_BUL -- 筛选需要统计的薪资组件 WHERE b.RUB_0 IN ('SALACT_MTD', 'PENSION_MTD')
把这个SQL作为报表的数据源,之后直接用Sum({AMT_0})就能统计总金额,也可以按员工分组做明细统计。
方案2:报表内部处理(无法修改数据源时用)
如果不能改数据源,就在Crystal Reports里做过滤:
- 分组与排序:按员工ID(
EMP_ID)分组,然后在组内按BUL_0降序排序,这样组内第一条记录就是该员工最新的薪资单。 - 抑制多余记录:在详细节的「抑制(无 Drill-Down)」公式里写入:
这样就会隐藏组内除最新BUL_0外的所有记录。{BUL_0} <> Maximum({BUL_0}, {EMP_ID}) - 统计目标金额:创建一个公式字段
@TargetAmt,用来筛选基本工资和养老金:
然后用IF {RUB_0} IN ['SALACT_MTD', 'PENSION_MTD'] THEN {AMT_0} ELSE 0Sum({@TargetAmt})来统计总金额,或者按员工分组求和。
内容的提问来源于stack exchange,提问作者BitOffTooMuch
相关产品推荐
相关产品推荐

