SAP S/4HANA FICO 入门 54:FI 校验规则、GGB0 与 OB28

SAP S/4HANA FICO 入门 54:FI 校验规则、GGB0 与 OB28
本集介绍 FI 凭证校验:在 GGB0 中定义前提条件、检查条件和消息,再通过 OB28 按公司代码与调用点分配、激活。课程分别演示了抬头参考号必填、行项目分配字段必填,以及过账日期与凭证日期的关系。本文保留完整操作思路,并修正课堂中出现的反向公式、错误消息复用和测试范围过宽等问题。
视频信息
- 原视频:SAP FICO FOR BEGINNERS | FULL COURSE | DAY 31
- 视频时长:1 小时 06 分 10 秒
- 视频地址:https://www.youtube.com/watch?v=lPKY1VZ33cE
- 本文范围:FI Validation、
GGB0、OB28、GS01、抬头校验、行项目校验、集合与消息 - 截图规则:只引用原视频中的 SAP 系统画面;非 SAP 课件不直接使用,内容已翻译为中文并用 SAP 官方资料核验
一、FI 校验解决什么问题
FI 校验是在凭证过账过程中检查字段组合。它适合阻止明显不符合企业规则的数据进入账簿,例如:
| 业务规则 | 校验对象 | 失败后的处理 |
|---|---|---|
| 指定公司代码录入供应商发票时必须填写参考号 | 凭证抬头 BKPF-XBLNR | 提示用户补录参考号 |
FB60 的费用借方行必须填写分配字段 | 行项目 BSEG-ZUONR | 阻止该行继续过账 |
| 某些业务要求过账日期不得早于凭证日期 | BKPF-BUDAT 与 BKPF-BLDAT | 日期不符合时给出明确消息 |
校验不是字段状态的替代品。只要标准字段状态、凭证类型、科目字段状态组或业务应用本身就能稳定完成控制,应优先使用标准配置;只有条件依赖多个字段或业务组合时,才需要布尔校验。
课程先打开一张会计凭证,区分抬头信息和多个行项目。这个结构决定了规则应该放在哪个调用点。

二、三个调用点必须选对
经典 FI 校验在 GGB0 中提供三个主要调用点:
| 调用点 | 名称 | 适用数据 | 典型用途 |
|---|---|---|---|
0001 | 凭证抬头 | BKPF | 公司代码、凭证类型、参考号、凭证日期等 |
0002 | 行项目 | BSEG,并可结合部分抬头字段 | 科目、过账码、分配、成本对象等单行检查 |
0003 | 完整凭证 | 整张凭证 | 需要跨行或整张凭证关系的检查 |
在 GGB0 的 Financial Accounting 节点下,可以看到 Document header、Line Item 和 Complete document。

不要因为某字段“在凭证里能看到”就随意选择调用点。规则需要什么结构、需要在什么时机获得数据,就选择对应调用点;调用点选错,常见结果是字段不可用、规则在错误行上重复执行,或者自动生成的会计行也被意外拦截。
三、一条校验步骤的真实逻辑
创建 Validation 后,每个步骤包含三个部分:Prerequisite、Check 和 Message。

它们不是三个并列条件,而是一条有顺序的判断链:
| 前提条件 | 检查条件 | 系统结果 |
|---|---|---|
| 假 | 不执行 | 跳过本步骤,数据继续处理 |
| 真 | 真 | 校验通过 |
| 真 | 假 | 输出本步骤配置的消息 |
因此,Check 必须表达“什么数据才算正确”,不能写成“什么情况应该报错”。这是本集最容易写反的地方。
四、抬头示例:指定公司代码的参考号必填
课程在凭证抬头调用点建立校验 SKPI。正确的业务逻辑应写成:
前提条件:BKPF-BUKRS = 'SKPI'
检查条件:BKPF-XBLNR <> ''
消息:公司代码 SKPI 的凭证必须填写参考号
前提条件把规则限定在公司代码 SKPI。

检查条件选择凭证抬头的 Reference 字段,也就是 BKPF-XBLNR。

课堂最初把检查写成 BKPF-XBLNR = ''。这会让“参考号为空”反而通过,而填写参考号后触发错误,正好与需求相反。因为 Check 描述的是合法状态,所以必填应使用“非空”:
BKPF-XBLNR <> ''
课程测试时还复用了“Kindly enter reference for company code VR04”消息,但正在测试的公司代码是 SKPI。

这类消息即使技术上能弹出,也不能进入正式配置。消息至少应准确说明字段、适用范围和用户动作;例如“公司代码 SKPI 的供应商发票必须填写参考号”。不要复用与规则无关的消息编号,也不要让错误文本暴露旧公司代码。
五、用 OB28 分配并激活
GGB0 负责定义规则;只有在 OB28 中分配到公司代码与调用点,并设置激活级别,规则才会在 FI 过账中运行。
课程为公司代码 SKPI 增加了抬头和行项目两条分配。

经典 FI 校验的激活级别是:
| 级别 | 含义 |
|---|---|
0 | 不激活 |
1 | 激活,包括联机和批输入 |
2 | 激活,但排除批输入 |
课程主要在 0 和 1 之间切换。生产环境选择 2 前要明确批输入被排除是否符合控制目标;不能为了让接口或批处理通过而无审批地绕开校验。
六、行项目示例:只要求费用借方行填写分配
第二条校验 SKPI_L 建在行项目调用点 0002,课程先把前提写成:
BKPF-BUKRS = 'SKPI' AND BKPF-TCODE = 'FB60'

检查条件为:
BSEG-ZUONR <> ''

问题是:调用点 0002 会逐行执行。只限定公司代码和事务码,供应商行、费用 G/L 行及系统生成的其他行都可能被检查,于是用户可能在不该填分配的行上也收到错误。
课程随后用过账码进一步缩小范围。若业务需求是“FB60 的借方 G/L 费用行必须填写分配”,示例前提可以写成:
BKPF-BUKRS = 'SKPI'
AND BKPF-TCODE = 'FB60'
AND BSEG-BSCHL = '40'
检查仍为:
BSEG-ZUONR <> ''
测试结果显示:供应商贷方行的过账码是 31,费用借方行的过账码是 40;只有后者填写了 Assignment,凭证概览可以继续。

生产规则不应只凭课堂示例认定所有费用行都使用过账码 40。还要盘点实际业务入口、总账账户、借贷方向、特殊总账、税行和自动生成行,明确真正需要控制的账户集合或字段组合,再做正反向测试。
七、多个公司代码或事务码应使用集合
如果规则要覆盖多个公司代码,不能写:
BKPF-BUKRS = 'SKPI' AND BKPF-BUKRS = 'ABCD'
同一字段不可能在同一时刻等于两个不同值,这个条件永远为假。少量值可以用 OR,值较多或需要集中维护时,可以用 GS01 建立集合,再使用 IN。
课程为公司代码字段 BKPF-BUKRS 创建基础集合。

随后又为事务码字段建立集合,并组合成前提条件:
BKPF-BUKRS IN CC_POST_DOC_DATE
AND BKPF-TCODE IN TCODE_POST_DOC_DATE

集合只解决布尔公式中的成员维护,不会自动完成 OB28 分配。若多个公司代码都要运行这条规则,仍需在 OB28 中逐一分配并激活相应校验。
八、日期示例:先明确企业规则,再选择运算符
课程新增抬头步骤,目标是阻止“过账日期早于凭证日期”。若业务要求确实是“不得早于”,合法状态应表达为:
BKPF-BUDAT >= BKPF-BLDAT
课堂画面最终显示的是 Posting Date > Document Date。

严格大于会把“过账日期等于凭证日期”也判为失败,与“不得早于”的口述目标不一致。因此应按需求选择:
| 业务要求 | 正确检查条件 |
|---|---|
| 过账日期不得早于凭证日期 | BUDAT >= BLDAT |
| 过账日期必须晚于凭证日期 | BUDAT > BLDAT |
| 两个日期必须相同 | BUDAT = BLDAT |
课程用较早的过账日期进行负向测试,系统弹出日期消息。

把过账日期调整到凭证日期之后,录入可以继续。

但“凭证日期与过账日期的关系”不是 SAP 强制的统一会计规则。SAP 标准允许凭证日期按原始凭证填写,通常与过账日期相同,也可能因迟到发票、期间结账或补录而不同。企业要先定义会计政策、允许例外和审批方式,再决定是否用硬错误拦截;不能把课堂公式直接推广到所有公司代码和所有事务。
九、消息、锁与传输的正确处理
消息是校验设计的一部分,不是临时找一个可用编号即可。合格消息应做到:
- 与当前规则、公司代码和字段一致。
- 说明用户要修改什么,而不是只写“数据无效”。
- 根据控制强度选择 Error 或 Warning;必须阻止过账时才使用错误。
- 使用获准的消息类和维护入口,并随配置、消息对象一起测试和传输。
- 若消息对象被锁定,先确认锁持有人和变更责任,由负责人或管理员处理;不要强制绕过锁。
课程后段因消息维护被锁,又尝试通过 SM30 处理测试系统中的消息表问题。该做法不应作为生产操作步骤。应使用校验维护提供的消息编辑方式或受控的自定义消息类,并遵循开发、测试、传输和审批流程。
十、不要为通过校验测试去改无关配置
课堂测试 FB60 时遇到一条与 FI-MM 自动科目确定有关的错误,并临时修改了相关配置以继续模拟。这不是校验本身的问题,也不应纳入校验配置步骤。
正确处理方式是:
| 遇到的问题 | 应采取的做法 |
|---|---|
| 测试凭证被无关配置错误挡住 | 换用已知配置完整的测试场景,或在对应模块内修复根因 |
| 自动科目确定缺失 | 由 FI/MM 共同确认业务事务、估价范围、科目键和总账科目 |
| 只想验证新校验是否触发 | 准备一组其他条件均有效的基准凭证,再分别测试合法值和非法值 |
不能为了“让校验测试跑通”就改 OBYC 或底层自动科目确定表。无关变更可能影响采购收货、发票校验和自动过账,风险远大于本次验证。
十一、推荐的实施与测试清单
| 阶段 | 必做检查 |
|---|---|
| 需求 | 写清楚适用组织、业务入口、字段、合法状态、例外和消息级别 |
| 设计 | 选择正确调用点,确保 Prerequisite 限定范围、Check 表达合法状态 |
| 配置 | 在 GGB0 创建步骤,在 OB28 按公司代码和调用点分配、激活 |
| 消息 | 文本与规则一致,不复用无关公司或无关权限消息 |
| 正向测试 | 合法数据不应被挡住,包括边界值,例如两个日期相同 |
| 负向测试 | 每个不合法条件都应触发准确消息 |
| 回归测试 | 检查其他事务、批输入、接口、自动生成行和其他公司代码 |
| 传输 | 校验、集合、消息及相关对象按完整依赖顺序传输 |
十二、本集完成与边界
| 项目 | 本集结果 |
|---|---|
| 抬头校验 | 已演示参考号必填,并修正“空值才通过”的反向公式 |
| 行项目校验 | 已演示 Assignment 必填,并把范围收窄到 FB60 的过账码 40 行 |
| 日期校验 | 已演示日期比较,并说明“不得早于”应使用 >= |
| 集合 | 已用 GS01 把多个公司代码和事务码组合进前提条件 |
| 激活 | 已在 OB28 按公司代码与调用点分配 |
| 消息 | 已指出课堂复用无关消息的问题,生产环境需使用准确、受控的消息 |
| 未覆盖 | 替代规则、用户出口、复杂跨行校验、接口专项测试与具体生产传输 |
最终原则只有一句:Prerequisite 决定“要不要检查”,Check 描述“什么才算正确”,Message 只在前提成立且检查失败时出现。只要这三层含义不混淆,FI 校验就能成为清晰的业务控制,而不是让用户无法解释的过账障碍。
SAP 官方参考
- What Are Validations:校验的前提、检查与消息
- Validation and Substitution Callup Points:调用点说明
- Creating a Validation:创建校验步骤的标准逻辑
- FI Validation:GGB0、OB28、调用点和激活级别
- Boolean Classes:FI 校验对自动生成行的影响
- Use of Sets:使用
IN在布尔逻辑中引用集合 - Document Date 与 Posting Date:凭证日期可按原始凭证填写
- Setting Validation Messages:错误、警告与消息类
本文依据视频中的实际操作整理,并用 SAP 官方资料校正课堂中的布尔逻辑、日期运算符和消息维护做法。事务、字段、调用点与应用入口会随 S/4HANA 版本、部署方式和权限而变化,请先在开发或测试系统验证,再进入生产环境。
