尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Oracle ERP外协加工全链路解析:从工单到发票的SQL对账与避坑指南

Oracle ERP外协加工全链路解析:从工单到发票的SQL对账与避坑指南 简介这份文档面向制造业信息化从业者、Oracle ERP实施顾问及供应链管理人员系统梳理Oracle Manufacturing模块中外协加工的完整业务逻辑与系统配置思路帮助读者理解如何将供应商资源纳入自身制造流程从而降低工程与制造成本、灵活提升产能。资源包内含1个docx文档约82KB内容围绕外协加工物料与外协资源的定义、采购申请自动生成机制、资源费用自动计入任务或重复性计划、PO移动与自动完成装配件、入库检验选项以及退回与更正处理等环节展开并涉及Oracle Inventory、Bills of Material、Cost Management、Purchasing与Work in Process的协同设置。目前已有293人学习适合需要掌握外协加工全生命周期管理、优化供应链成本与生产事务处理效率的读者参考。1. 外协加工在 Oracle ERP 里到底难在哪一张工单背后的三层账外协加工说白了就是「料是我的、活是别人干的、钱按加工费结」。在 Oracle ERP 里它既不像标准采购那样一手交钱一手交货也不像自制工单那样全程在自己车间流转而是卡在两者中间物料要发出去、供应商要收料加工、成品或半成品要收回来、加工费要单独结算、副产物和损耗还得有人认账。很多做 ERP 的同行第一次接外协需求都会低估它的复杂度以为「不就是个采购订单加个发料嘛」结果上线后对账对到怀疑人生。这篇东西面向的是正在用 Oracle EBS 或 Oracle Fusion 做外协加工落地的实施、运维和财务对接人员。我会把外协加工从业务模型、主数据准备、工单与采购单联动、发料收货、加工费结算到常见翻车点按能照着复现的顺序讲一遍。核心不是背概念而是搞清楚 Oracle 里外协加工到底走哪几张表、哪几个事务处理、哪几个关键参数以及出问题时该去哪个界面查。Oracle 数据库层面涉及的表和视图我也会点出来方便你写查询排查。2. 外协加工的三种业务模型与 Oracle 里的对应关系2.1 先分清「委外加工」和「外协加工」在系统里的落点在 Oracle EBS 的离散制造里外协加工最常见的实现方式是「外协工单 外协采购订单」的组合。工单负责定义要做什么、需要哪些料采购订单负责把料发给供应商、把加工费谈好、把成品收回来。这里有个关键点外协工单的物料需求会触发外协采购订单而外协采购订单的行上会带「外协」标识收货时系统会自动做发料和收货的联动。另一种做法是纯采购模式把加工费当成采购单价料由我方通过「发运」或「子库存转移」发给供应商供应商加工完再以成品采购订单收货。这种方式简单但料和加工费是分开的对账时容易漏掉料的成本。第三种是 Oracle Fusion 里的「外协制造」逻辑更接近 EBS 的外协工单但界面和表结构不同Fusion 里叫「Contract Manufacturing」。选哪种模型取决于你的财务要不要把料和加工费合并核算、要不要跟踪供应商处的在制品库存、要不要做外协工单的完工汇报。我一般建议如果加工费占比高、料种类多、需要跟踪供应商库存就走外协工单如果只是简单加工、料值低、加工费固定走纯采购更省事。2.2 主数据准备物料、BOM、工艺路线和外协资源外协加工要跑通主数据必须先立住。物料方面成品或半成品要设成「可采购」和「可制造」外协用的原材料要设成「可发运」或至少能在子库存间转移。BOM 里要明确哪些料是外协供应商负责的哪些是我方提供的。工艺路线里要有一个「外协工序」这个工序的资源要设成「外协」类型并且关联到供应商。在 Oracle EBS 里外协资源是在「资源」界面定义的资源类型选「外协」然后在外协工单的工艺路线里引用这个资源。系统会根据外协资源的数量和采购价格生成外协采购订单。这里有个容易忽略的参数外协资源的「采购」属性要勾上否则工单释放时不会自动生成采购订单。-- 查询外协资源及其关联的供应商信息 SELECT r.resource_code, r.description, r.resource_type, r.purchasing_flag, s.vendor_name, s.vendor_site_code FROM bom_resources r, po_vendors s WHERE r.resource_type OUTSIDE AND r.purchasing_flag Y AND r.vendor_id s.vendor_id;这段查询用来确认外协资源是否配置正确。resource_type OUTSIDE表示外协资源purchasing_flag Y表示允许采购。如果查出来是空的说明资源没配好工单释放时不会生成采购订单。vendor_id关联到供应商确保外协资源指定了正确的供应商。2.3 外协工单的创建与释放从需求到采购订单的触发外协工单的创建和普通工单一样在「工单」界面或通过接口导入。关键区别在工艺路线外协工序必须放在正确的位置通常是最后一道工序或者至少是外协料需要发出的那道工序。工单释放时系统会根据外协资源的需求数量和外协采购价格自动生成一张外协采购订单。这里有个参数叫「外协采购订单的创建时机」可以在工单类型里设置是释放时创建还是完工时创建。我一般设成释放时创建这样供应商能早点看到需求。采购订单的行上会带「外协」标识收货时系统会自动做发料和收货的联动。-- 查询外协工单及其关联的采购订单 SELECT w.wip_entity_name, w.status_type, w.primary_item_id, p.segment1 AS po_number, p.authorization_status, pl.line_num, pl.item_description, pl.quantity FROM wip_entities w, po_headers_all p, po_lines_all pl WHERE w.wip_entity_id pl.wip_entity_id AND pl.po_header_id p.po_header_id AND w.status_type 3 -- 3 表示已释放 AND p.authorization_status APPROVED;这段查询用来验证工单释放后是否生成了采购订单。wip_entities的status_type 3表示已释放po_headers_all的authorization_status APPROVED表示采购订单已审批。如果工单释放了但查不到采购订单检查外协资源的purchasing_flag和工单类型的「外协采购订单创建时机」参数。3. 外协发料、收货与加工费结算的完整链路3.1 发料给供应商子库存转移还是直接发运外协发料有两种方式一种是通过「子库存转移」把料从自己的仓库转到「供应商子库存」这个子库存是逻辑上的物料还在自己厂区或已经发给供应商另一种是通过「发运」功能直接生成发运单物料所有权转移给供应商。两种方式在 Oracle 里的账务处理不同子库存转移不产生会计分录只是库存地点变化发运会产生物料出库的会计分录相当于把料卖给了供应商。我一般建议用子库存转移因为外协加工的本质是「料还是我的」供应商只是代工。子库存转移后物料在「供应商子库存」里收货时系统会自动从该子库存扣料。如果供应商在外地需要实际发运那就用发运功能但要在采购订单上勾选「外协」标识否则收货时不会自动扣料。-- 查询供应商子库存的库存余额 SELECT msi.segment1 AS item_code, msi.description, mil.subinventory_code, mil.quantity, mil.lot_number FROM mtl_item_locations mil, mtl_system_items_b msi WHERE mil.inventory_item_id msi.inventory_item_id AND mil.organization_id msi.organization_id AND mil.subinventory_code LIKE %VENDOR% AND mil.quantity 0;这段查询用来确认供应商子库存里有没有料。subinventory_code LIKE %VENDOR%是常见的命名习惯实际子库存名可能不同。如果查不到说明发料没成功或者子库存转移的事务处理没跑完。quantity 0过滤掉零库存避免看到一堆空记录。3.2 收货与自动发料外协采购订单的收货逻辑外协采购订单收货时系统会做两件事一是把成品或半成品收到自己的仓库二是自动从供应商子库存扣掉对应的原材料。这个自动扣料的逻辑是基于 BOM 的采购订单行上的物料如果是外协工单的成品系统会根据工单的 BOM 反推需要扣哪些料、扣多少。这里有个关键参数采购订单行上的「外协」标识必须勾上否则收货时不会自动扣料。另外收货数量不能超过工单的未完工数量否则系统会报错。如果供应商分批交货每次收货都会按比例扣料所以 BOM 的用量要准确否则会出现料扣多了或扣少了。-- 查询外协收货记录及自动扣料明细 SELECT r.transaction_id, r.transaction_date, msi.segment1 AS item_code, r.primary_quantity, r.transaction_type, r.subinventory_code FROM mtl_material_transactions r, mtl_system_items_b msi WHERE r.inventory_item_id msi.inventory_item_id AND r.organization_id msi.organization_id AND r.transaction_type IN (44, 45) -- 44 收货, 45 发料 AND r.transaction_date SYSDATE - 7 ORDER BY r.transaction_date DESC;这段查询用来追踪外协收货和自动发料的事务处理。transaction_type 44是收货45是发料。如果收货了但没看到发料记录检查采购订单行的「外协」标识和 BOM 的用量。SYSDATE - 7只看最近 7 天避免数据量太大。3.3 加工费结算采购订单价格与工单成本的关联加工费结算走的是采购订单的发票匹配流程。外协采购订单的价格就是加工费单价收货后做发票匹配财务确认应付。这里有个容易出错的地方外协采购订单的价格是「加工费」不包含料的价值。料的价值在发料时已经计入工单成本收货时成品成本 料成本 加工费。如果财务要求加工费和料分开核算可以在采购订单行上把加工费单独列一行料的价值通过工单成本报表体现。Oracle 的「工单成本」报表会显示料、工、费的分项外协加工费会体现在「外协」费用项里。对账时采购订单的发票金额应该等于工单成本报表里的外协费用。-- 查询外协工单的成本明细 SELECT w.wip_entity_name, msi.segment1 AS item_code, c.resource_code, c.actual_cost, c.basis_type FROM wip_entities w, mtl_system_items_b msi, wip_transaction_accounts c WHERE w.wip_entity_id c.wip_entity_id AND w.primary_item_id msi.inventory_item_id AND w.organization_id msi.organization_id AND c.basis_type OUTSIDE ORDER BY w.wip_entity_name;这段查询用来核对工单成本里的外协费用。basis_type OUTSIDE表示外协费用项。如果查不到说明外协资源没关联到工单或者工单没释放。actual_cost是实际发生的加工费应该和采购订单的发票金额一致。4. 外协加工避坑指南五个血泪教训4.1 坑一工单释放了但采购订单没生成现象工单状态是「已释放」但在采购订单界面查不到对应的外协采购订单。原因通常是外协资源的purchasing_flag没勾上或者工单类型的「外协采购订单创建时机」设成了「完工时创建」。解决方法是检查资源定义和工单类型参数把purchasing_flag改成Y创建时机改成「释放时创建」。如果工单已经释放可以手动跑「外协采购订单创建」请求。4.2 坑二收货时提示「无法自动发料」现象外协采购订单收货时系统报错「无法自动发料供应商子库存无库存」。原因是发料没做或者发料数量不够。解决方法是先查供应商子库存的余额确认料已经转过去。如果料在别的子库存做子库存转移。如果发料数量不够补发料。注意发料数量必须大于等于收货数量对应的 BOM 用量否则收货会失败。4.3 坑三BOM 用量不准导致料扣多了现象外协收货后供应商子库存的料扣多了实际用量没那么多。原因是 BOM 的用量设大了或者损耗率没设对。解决方法是检查 BOM 的component_quantity和yield_factor确保用量和实际一致。如果已经扣多了做库存调整或反向事务处理冲掉。建议在外协工单释放前先跑「BOM 用量核对」报表。4.4 坑四加工费发票匹配不上现象采购订单收货了但发票匹配时提示「数量不匹配」或「金额不匹配」。原因是收货数量和发票数量不一致或者采购订单价格和发票价格不一致。解决方法是先查采购订单的收货记录确认收货数量。如果发票数量大于收货数量做退货或补收货。如果价格不一致检查采购订单是否做了价格调整或者发票是否含税。4.5 坑五外协工单完工后成本不对现象外协工单完工后成本报表里的外协费用和采购订单发票金额不一致。原因是外协资源的费率没更新或者工单成本没重新计算。解决方法是检查外协资源的resource_rate确保和采购订单价格一致。如果工单已经完工跑「工单成本重新计算」请求。注意外协费用是按实际收货数量计算的不是按工单数量。5. 用 SQL 和外协工单报表做日常对账的进阶技巧5.1 写一个外协工单全链路查询从工单到发票日常对账最头疼的是数据分散在工单、采购订单、收货、发票四个地方。我一般会写一个全链路查询把这几张表串起来一次性看到工单号、采购订单号、收货数量、发票金额。这样对账时不用来回切界面直接跑 SQL 就行。-- 外协工单全链路查询工单 - 采购订单 - 收货 - 发票 SELECT w.wip_entity_name AS 工单号, msi.segment1 AS 成品编码, p.segment1 AS 采购订单号, pl.quantity AS 订单数量, r.primary_quantity AS 收货数量, i.invoice_num AS 发票号, i.invoice_amount AS 发票金额, c.actual_cost AS 工单外协费用 FROM wip_entities w, mtl_system_items_b msi, po_headers_all p, po_lines_all pl, mtl_material_transactions r, ap_invoices_all i, wip_transaction_accounts c WHERE w.primary_item_id msi.inventory_item_id AND w.organization_id msi.organization_id AND w.wip_entity_id pl.wip_entity_id AND pl.po_header_id p.po_header_id AND pl.po_line_id r.po_line_id AND p.po_header_id i.po_header_id AND w.wip_entity_id c.wip_entity_id AND c.basis_type OUTSIDE AND w.status_type 3 ORDER BY w.wip_entity_name;这个查询把工单、采购订单、收货、发票、工单成本五张表串起来。wip_entities的status_type 3只看已释放的工单wip_transaction_accounts的basis_type OUTSIDE只看外协费用。如果某张表关联不上说明链路断了比如收货了但没做发票匹配或者工单没关联到采购订单。跑这个查询之前确保ap_invoices_all和po_headers_all的关联字段正确不同版本的 Oracle 可能字段名有差异。5.2 用外协工单报表做月度对账的固定动作每个月结账前我会固定跑三个报表外协工单完工报表、外协采购订单收货明细、外协加工费发票匹配报表。这三个报表的数据要能对上工单完工数量 采购订单收货数量 发票匹配数量。如果对不上先查收货记录再看发票匹配最后查工单成本。有个小技巧在采购订单上自定义一个「外协工单号」字段收货和发票匹配时都带上这个字段对账时直接按工单号分组不用手工匹配。这个字段可以通过个性化或自定义 DFF 实现具体看你的 Oracle 版本。我一般会在采购订单行上加一个 DFF存工单号然后写查询时直接关联。5.3 外协加工值不值得做我的判断标准外协加工在 Oracle 里落地工作量主要在主数据准备和对账逻辑上。如果你们的加工费占比高、供应商多、料种类多那值得做因为手工对账根本对不过来。如果只是偶尔外协、加工费固定、料值低那用纯采购模式更省事别为了「系统化」而系统化。我自己的习惯是上线前先跑一个月的手工对账把工单、采购订单、收货、发票的对应关系理清楚再把这些逻辑固化到 SQL 和报表里。上线后每周跑一次全链路查询发现链路断了及时补。这样结账时不会手忙脚乱。希望帮到你。本文还有配套的精品资源点击获取
返回列表