简介:面向 Oracle EBS 初学者与实施顾问的模块流程图文档,解决模块繁多、缩写密集、文字资料难以讲清跨模块衔接的问题。内容以 Word 图文方式梳理财务(GL、AP、AR、FA、CE、PA)、分销(INV、PUR、OE)、制造(MPS/MRP、BOM、WIP、CST)及其他模块的清单与流程走向,并覆盖设计到发布、预测到计划、采购到支付、订单到收款、库存到履约等主干业务流,以及 Inventory、BOM、WIP、Planning、Cost、Purchasing、总帐、应付、应收、资产等子模块的流程示意。压缩包仅含 1 个 doc 文件,约 1.15MB,单文件完整版便于检索、标注与打印成册。已有 164 人学习下载。读者可借此建立 EBS 模块全景,厘清模块边界与端到端链路,在需求调研、流程梳理和面试复习中对照流程示意图逐项查看。
1. 单据流才是骨架:背下三十个模块名,也定位不了一张卡住的单据
很多人第一次接触 EBS,拿到手的是一张模块清单:财务七个、分销七个、制造八个,再加上人事、设备、系统管理。清单能背,考试能过,但真到生产环境里遇到“订单已经发货,应收却查不到发票”,这份清单一点忙都帮不上。因为 EBS 的行为不由模块名决定,而由单据在模块之间的流动路径决定。
流程图之所以比模块表更接近本质,是因为它记录的是状态迁移:一张订单在什么条件下变成发货单,发货单在什么条件下触发库存事务,库存事务又在什么条件下生成应收发票。这中间任何一环没有满足前置条件,链路就断在那里,而断点往往不在你排查的那个模块里。
搞懂这张拓扑,收益是具体的:出问题时你知道该往上游查还是往下游查,做接口时你知道该写哪张接口表,评估改动时你知道会波及哪几个子账。这份文档把模块清单和流程图画在了一起,价值不在“全”,在于它把模块名和单据流对上了号。
2. 模块边界:不按部门切,按“谁持有唯一状态”切
2.1 一个总账配多套子账:财务模块的切分依据
财务模块看上去是七个平级的系统,实际上是“一个总账 + 五套子账 + 一个分析层”的结构。GL 是唯一保存科目余额的地方,AP、AR、FA、CE、PA 各自保存业务单据的完整上下文,然后通过凭证把结果汇总给 GL。
为什么不让所有凭证直接进 GL?因为会计科目余额丢失了太多信息。一张应付发票上带着供应商、付款条件、税码、币种、预付款核销关系,这些维度在 GL 的借贷方余额里全被抹平了。子账的存在,就是把这些上下文留在业务侧可查、可调、可重算,只把最终影响科目余额的部分传上去。
这个切分带来一个必须记住的后果:子账和总账之间不是强同步的。子账创建了会计分录,不等于 GL 已经有了余额。中间隔着一个过账动作,过账没跑或者跑失败,两边就会对不上。绝大多数“财务账不平”的问题,根子都在这个异步间隙里,而不是在某个模块算错了。
2.2 库存是共享状态容器:分销和制造为什么都绕不开 INV
把模块清单摊开看,会发现一个奇怪的现象:销售订单、采购接收、工单发料、工单完工、库存转移、盘点调整,这些动作分属不同模块,但它们最终都会往同一处写数据——库存事务表。INV 不是一个“仓库管理功能”,它是整个系统里物料数量的唯一事实来源。
这个设计的选择很务实。如果销售订单自己记一份可用量、采购自己记一份在途量、车间自己记一份在线量,那三方对账会变成常态工作。把数量状态收敛到 INV 一处,其他模块只负责“发起事务”,不负责“持有余额”,对账问题就从根上消失了。
代价是耦合。INV 的事务类型(Transaction Type)决定了这次移动是收入还是发出、走哪个科目、要不要产生成本。销售发货和工单发料在业务上毫无关系,但它们在 INV 里必须共用同一套事务类型体系。所以你会看到,一个事务类型配错,影响的不只是库存,还会顺着成本传到总账。这也是为什么改库存事务类型之前,必须先把受影响的模块列一遍。
2.3 模块前缀与单据类型:模块名落到表上是什么样
模块名是给人看的,表前缀是给系统看的。同一个业务概念,在不同模块里有不同的表名前缀,但通过单据类型字段连接起来。理解这层映射,是从“看流程图”过渡到“查数据”的关键一步。
| 模块 | 表前缀 | 单据类型字段 | 类型决定什么 |
|---|---|---|---|
| 订单管理 | OE_ | ORDER_TYPE_ID | 订单类型决定后续是否走发货、是否自动开票 |
| 库存 | MTL_ | TRANSACTION_TYPE_ID | 事务类型决定方向、科目、是否计成本 |
| 采购 | PO_ | DOCUMENT_TYPE_CODE | 标准单、计划单、一揽子协议走不同审批路径 |
| 应付 | AP_ | INVOICE_TYPE_LOOKUP_CODE | 标准发票、贷项、预付款的匹配逻辑不同 |
| 应收 | RA_ | TRX_TYPE_ID | 发票、贷项、借记单的收款计划不同 |
| 总账 | GL_ | JE_CATEGORY_NAME | 类别决定凭证来源与过账规则 |
这张表里最容易被低估的是“类型决定什么”这一列。新手常以为类型只是个分类标签,实际上它是流程分支的开关。订单类型里勾了“自动开票”,发货完成后系统才会去创建应收接口数据;没勾,就得手工跑开票。排查“发货了没发票”时,第一件事应该是回来看订单类型的配置,而不是去 AR 里翻数据。
3. 单据流转:把流程图翻译成跨模块时序
3.1 订单到收款:OE→INV→AR→GL 的单据链
订单到收款是 EBS 里被画得最多的一条流程,也是理解跨模块协作最好的样本。它的主干是四段:订单录入、发货确认、开票、收款,每段结束都把状态交给下一段。
订单录入在 OE 里完成,头表和行表分别保存交易的上下文和物料明细。发货确认这一步会同时碰两个模块:发货单在 WSH 里记录物流状态,库存事务在 INV 里扣减数量。这两件事不是原子的,发货确认失败但库存已经扣减的情况,在压力大的系统上并不罕见,所以发货状态和库存事务要分别核对。
开票环节是链路里最容易被误解的一环。发货完成不等于发票存在,中间要经过开票接口。系统把待开票的数据写进应收接口表,再由开票程序读取、校验、生成正式发票。接口表里堆着数据但没生成发票,说明开票程序没跑或者校验没过;接口表里压根没数据,说明上游根本没触发。这两种情况的排查方向完全相反。
收款之后,AR 的余额减少,现金增加,凭证汇总到 GL。到这里一条完整的单据链才闭合。整条链上任何一个环节的状态没推进,后面的模块都不会“自动补上”,流程图上的箭头代表的是触发条件,不是时间顺序。
3.2 采购到支付:PUR→AP→GL 的单据链
采购到支付的结构和订单到收款对称,但方向相反:先有承诺,再有实物,最后才有钱。采购订单在 PO 里创建,接收动作在 RCV 里生成接收单并触发库存事务,应付发票在 AP 里录入并与接收单或订单做匹配,付款后现金流出。
这条链上最关键的动作是匹配。发票必须和订单或接收单对上,金额、数量、单价三者之一有偏差,匹配就会挂起,挂起的发票不能付款,也不会计入 GL。很多“货到了、发票也录了,但供应商没收到钱”的情况,本质是匹配挂起,而不是付款程序出错。
匹配的严格程度由采购选项和发票类型共同决定。两向匹配(发票对订单)和三向匹配(发票对接收单)在容差设置上不一样,容差设得紧,一点运费差异就能让整张发票卡住。这个设计动机是控制付款风险,代价是财务要花大量时间处理挂起发票。理解这一点,就不会把匹配挂起当成系统缺陷。
3.3 计划到制造:MRP→WIP→CST 的状态推进
制造侧的流程不像财务那样有清晰的单据号贯穿,它推进的是一批建议和状态。计划模块跑出计划订单,计划订单确认后转成离散工单,工单发料和完工产生库存事务,成本模块再把这些事务算成金额。
这里最反直觉的一点是:计划模块不产生执行动作。MRP 跑完之后给你的是一堆建议,确认与否在人。所以当有人说“计划跑完了为什么车间没收到工单”,答案往往是计划订单还没确认,或者确认了但转工单的并发请求没跑。流程图上从计划指向车间的那根箭头,背后是一个需要人工或定时任务触发的转换动作。
工单进入执行阶段后,发料和完工都走库存事务,成本模块按事务类型和成本方法计算金额。成本方法(标准成本、平均成本、实际成本)在这里是分水岭:标准成本下差异单独归集,平均成本下每次事务都重算单价。同一个发料动作,在不同成本方法下产生的会计影响完全不同,这也是跨模块排查里最容易踩空的地方。
3.4 流程图没画的回写:库存与总账的反向流动
多数流程图只画了正向的单据传递,没画反向的回写。但实际系统里,反向流才是财务对账的重点。
订单发货后,库存数量减少,同时应收增加;收款后,应收减少,现金增加;采购接收入库,库存增加,同时应付增加;付款后,应付减少,现金减少。每一次正向的业务动作,都在财务侧留下一笔反向的余额变化。这条回写路径如果断在中间,表现就是“业务都做完了,账上没反应”。
回写不是实时的。库存事务要经过成本处理才会产生会计分录,会计分录要经过过账才会进 GL,GL 还要经过日记账导入才形成余额。这三段延迟叠加起来,业务和财务之间有小时级甚至天级的时差。理解这个时差,能省下大量“明明刚做完怎么查不到”的无效排查。
4. 表结构落地:头、行、分配三段式如何承载耦合
4.1 Header-Line-Distribution:为什么几乎所有单据都是三层
EBS 里几乎每一类业务单据都拆成三层:头、行、分配。这不是建模习惯,是被业务逼出来的结构。
| 层级 | 采购 | 应付 | 订单 | 承载什么 |
|---|---|---|---|---|
| Header | PO_HEADERS_ALL | AP_INVOICES_ALL | OE_ORDER_HEADERS_ALL | 交易对手、币种、日期、总额 |
| Line | PO_LINES_ALL | AP_INVOICE_LINES_ALL | OE_ORDER_LINES_ALL | 物料、数量、单价、税率 |
| Distribution | PO_DISTRIBUTIONS_ALL | AP_INVOICE_DISTRIBUTIONS_ALL | OE_ORDER_PRICE_ATTRIBS | 科目、成本中心、分摊比例 |
头表承载“和谁交易、什么时候、什么币种”,这些信息一张单据只有一份,放在头表避免重复。行表承载“交易了什么”,一张单据可以有多个物料行,每行的数量单价独立。分配表承载“这笔钱记到哪个科目”,一张发票行可能要分摊到多个成本中心,所以分配是行的一对多。
这个三层结构的真正价值在于会计分摊的自由度。如果只有头行两层,一张发票就只能对应一个科目组合,跨成本中心分摊就没法表达。加了分配层之后,同一笔采购可以 60% 记到生产部门、40% 记到研发部门,而业务侧看到的仍然是一张发票。代价是查数据时要多 join 一层,写接口时三层都得填对,少一层就会在过账时报“无有效分配”。
4.2 GL_INTERFACE:子账与总账之间的唯一通道
子账和总账之间没有直接调用,所有凭证都往一张接口表里写,再由总账的导入程序批量读取。这张表就是解耦点。
这个设计的直接好处是可重跑。导入程序失败时,接口表里的数据还在,修完配置重新跑一遍就行,不需要子账重新生成凭证。如果改成子账直接调总账写入,一旦总账侧校验失败,子账得回滚重来,跨模块事务的回滚在 EBS 这种体量下几乎不可接受。
代价是排错变复杂。凭证在子账里显示“已创建”,在 GL 里查不到,中间可能是接口表没写入、导入程序没跑、导入报错、或者期间没打开。四个环节对应四种不同的检查动作,顺序错了就是白忙。我一般会按“先看接口表有没有数据,再看导入请求的日志,最后才怀疑子账”的顺序走,从下游往上游倒查,命中率比正着查高。
接口表里的状态字段是排查的核心线索。状态表示已处理、未处理还是错误,错误行通常还带一个错误信息字段,直接告诉你是科目无效、期间关闭还是币种缺失。很多人跳过接口表直接去看子账,等于把最直接的证据扔了。
4.3 用 SQL 把一条单据流验穿
看懂了结构,验证就变得直接。下面这段查询按订单号把订单行、发货状态、库存事务和应收发票串起来,用来判断链路断在哪一段。
-- 按订单号追踪:订单行 → 发货 → 库存事务 → 应收发票 -- 注意:列名与关联路径按常见版本整理,迁移或升级后先 desc 表确认 SELECT ooh.order_number, ool.line_number, wdd.released_status, -- 发货行状态,为空说明还没生成发货行 mmt.transaction_id, -- 库存事务,为空说明库存未扣减 mmt.transaction_quantity, rct.invoice_number -- 应收发票号,为空说明尚未开票 FROM oe_order_headers_all ooh, oe_order_lines_all ool, wsh_delivery_details wdd, mtl_material_transactions mmt, ra_customer_trx_all rct WHERE ooh.header_id = ool.header_id AND ool.line_id = wdd.source_line_id AND wdd.source_line_id = mmt.trx_source_line_id AND rct.customer_trx_id(+) = mmt.rcv_transaction_id AND ooh.order_number = :order_number;参数只有一个订单号,绑定变量写在最后一行,放进去就能跑。结果集里的四列对应链路上的四个检查点:发货行状态为空,问题在订单到发货这一段;发货状态有值但库存事务为空,问题在发货确认;库存事务有值但发票号为空,问题在开票接口。
需要说明的是,这里用的是外连接把应收发票挂上去,因为发票本来就是可能为空的一环,用内连接会把“没开票”这种最需要看到的情况直接过滤掉。另外,实际系统里库存事务和发票之间的关联往往还要经过一层开票接口表,这段 SQL 做了简化,目的是演示排查思路,不是拿来做生产报表。
这条查询跑出来的结果,比翻十页流程图更快定位问题。流程图告诉你“应该怎么流”,SQL 告诉你“实际流到哪了”,两者结合才是完整的排查方法。
5. 排查避坑:单据流断链的五个高频翻车点
5.1 发货了但没有应收发票
现象很直接:订单状态显示已发货,库存也扣了,但应收模块里查不到这张发票,客户对账时对不上。
原因通常有两层。第一层是订单类型没勾自动开票,系统根本不会去创建开票接口数据,这条链路从配置上就是断的。第二层是勾了自动开票,但发货单的行程停靠点没关闭,开票程序按“已关闭的停靠点”取数,状态没推进就取不到。这两种原因表现一样,排查方向完全不同。
解决方法是先查订单类型的开票配置,确认该走自动还是手工;配置没问题就去查开票接口表里有没有这张订单的数据,有数据说明卡在校验,看错误信息;没数据就往上查发货单状态,把停靠点关掉再跑一次开票请求。顺序不能反,反了会在错误的层级耗掉半天。
5.2 子账有分录但总账查不到
应付或应收里能看到会计分录,GL 的科目余额里却没有对应的数,月底对账直接对不上。
原因基本锁定在接口表到总账这一段。可能是导入程序根本没跑,可能是跑了但报错,常见错误是会计期间没打开、科目组合无效、币种汇率缺失。还有一种是导入跑成功了,但凭证被标记为未过账,余额里自然看不到。
解决方法是先查接口表里这批数据的处理状态,未处理就补跑导入,报错就按错误信息修配置再重跑。修完重跑之前记得把错误行清理掉,否则重复导入会产生重复凭证,那就要走冲销流程,麻烦程度翻倍。
5.3 工单发料了成本没更新
车间确认发料,库存数量扣了,但工单的成本页面金额没变,成本报表和实物对不上。
原因是库存事务和成本计算是两个动作。事务写入后带一个“是否已计成本”的标记,成本处理器按批次扫这些标记来算金额。处理器没跑、跑失败、或者期间已经关闭导致事务被卡住,标记就一直停在那里,金额自然不更新。
解决方法是查库存事务表里未计成本的记录,确认积压量,然后跑成本处理器。如果发现是期间关闭导致的积压,要先确认这些事务属于哪个期间,跨期处理会涉及成本调整,不能直接硬跑,得先和财务确认调整方案。
5.4 多组织下单据“消失”
同一个用户,在 A 组织能查到订单,切到 B 组织就查不到了,但单据确实存在。
原因是 EBS 的多组织访问控制按职责隔离数据,查询会自动带上组织条件。职责上绑定的组织不对,或者会话里的组织上下文没设对,看到的就只是当前组织的切片。这不是数据丢了,是视图被裁剪了。
解决方法是先确认职责绑定的组织范围,再确认当前会话里的组织上下文,两个都对还查不到,才需要怀疑数据本身。这个坑新人踩得最多,因为界面上没有任何提示告诉你“你看到的是部分数据”。
5.5 接口表数据被重复处理
接口表里的同一批数据生成了两套单据,或者同一张发票被导入两次,账上出现重复。
原因是并发请求被重复提交,或者接口表的处理标志没有正确回写。前一种情况在手工补跑时特别常见:看到第一次跑得慢,又点了一次,两个请求同时读到同一批未处理数据。后一种情况通常是程序异常中断,数据已经生成但标志没更新,下次跑又被捞出来。
解决方法是补跑之前先确认没有在跑的请求,跑完之后检查接口表的处理标志是否全部回写。对于已经重复的数据,不要直接删,走标准冲销流程留痕,否则审计时说不清楚。
6. 设计取舍:接口表解耦为什么宁可慢一步
把 EBS 的跨模块协作方式和现在流行的同步调用放在一起看,会发现一个明确的取舍:EBS 几乎所有的跨模块动作都是“落表 + 批量处理”,而不是“实时调用 + 立即返回”。发货不开票,写接口表;子账不过账,写接口表;计划转工单,也是先生成建议再转换。
这个选择在当时的环境下是必然的。批处理能扛住大促级别的数据量,一个晚上的批处理跑几十万条事务,比几万次同步调用稳得多。可重跑也是硬需求:任何一个环节失败,改完配置重跑就行,不需要把整条链路回滚。再加上审计要求每一笔跨模块的数据传递都要留痕,接口表天然就是一本流水账。
代价在今天看来也很明显。时延是以小时计的,业务做完到财务可见中间隔着一整条批处理链;排错要跨四五张表看状态,链路一长就容易断在没人注意的角落;补数据的操作有风险,跑重了就是重复凭证。这些问题在同步调用的架构里会小很多,但换来的是一致性和可重跑能力的下降。
我的判断是:这套设计的核心不是“快”,是“可控”。每一段流转都有落点、有状态、有日志,出了问题能定位到具体哪一批哪一行。这种可观测性在单体 ERP 里比低时延更重要,因为业务链路太长了,任何一段不可观测都会让整条链路变成黑匣子。
验证这套机制有没有理解到位,我一般用两个动作。一是拿一个真实订单号,从订单表一路查到总账凭证,中间每一段都能说出表名和状态字段,说不出来就说明那段还没吃透。二是故意在一个环节制造断点,比如把期间关掉再跑过账,看错误信息出现在哪张表、哪个字段,能不能凭这个信息反推回原因。这两个动作做完,流程图才算真正变成自己的东西。
有一次处理一张跨期发票,我先入为主地认为是科目配置问题,在 GL 的配置里翻了两个小时,最后发现是接口表里那批数据的期间字段写的是上一个已关闭的期间。从那以后我每次排查跨模块问题,都强制自己先查接口表的状态和期间字段,再去看配置。这个习惯省下的时间,比任何一本操作手册都多。希望帮到你。
本文还有配套的精品资源,点击获取