简介:一份面向SAP实施顾问与MM模块运维人员的三合一实操资料,围绕非库存采购、含赠品采购订单、采购申请自动转PO三个高频场景,完整整理了业务背景、后台配置与前台业务操作路径。所有流程均经作者亲自配置测试,可直接复制到项目参考。压缩包内共1个pdf文档,约4.03MB,重点涵盖OMSF/OMSK/OMQW、OBYC/OKB9、ME21N/ME11/MIRO等关键事务代码的配置要点,以及“采购申请→采购订单→发票校验”闭环中的条件类型与赠品处理方式。目前已有383人学习下载,适合需要快速上手SAP MM采购模块配置、希望获得清晰操作指引的中高级顾问参考;对照文档既能按步骤完成系统配置,也能避开常见配置坑点,节省自我摸索时间。
1. SAP MM 三合一配置:非库存采购、含赠品、自动转 PO 一次讲透
做 SAP MM 的顾问多少都遇到过这种场面:采购员要买一批实验室耗材,物料主数据都没建,催着你先出采购订单;供应商说“买十箱送一箱”,你还在纠结赠品行要不要算金额;月底上百条采购申请堆在 ME59N 里,手工一条条转 PO 转到下班。这三个问题孤立看都不难,但放在同一套系统里,配置互相影响,翻车往往翻在细节上。这份三篇合一的配置笔记,把非库存采购、含赠品采购单、采购申请自动转 PO 放到一起讲,每步都基于真实环境亲配亲测。适合 SAP MM 顾问、企业内部 IT 运维,以及负责采购流程优化的关键用户——照着配完就能用,不用再自己趟一遍坑。
2. 非库存采购单:账户分配类别 K 与科目分配类别的三个关键点
2.1 什么时候必须走非库存采购
非库存采购在 SAP 里的定位很明确:物料不进库存,采购进来直接消耗掉。典型场景有办公用品、实验试剂、设备维修备件、劳保用品。这些物料的特点是品种多、单价低、消耗快,如果每个都去建物料主数据、维护评估类、做库存盘点,主数据质量会被严重拖累,月底对账也麻烦。所以业务上默认这类采购走非库存流程:PO 行项目里不填库存地点,收货时直接过账到费用科目。
要判断一个采购是不是非库存,看两个标志:物料主数据是否存在、物料类型的属性。常见做法是连物料主数据都不建,在 PO 里选“非库存”项目类别,账户分配类别选 K(成本中心)或 U(未知)。K 和 U 的区别在于费用最终挂到哪里:K 必须指定成本中心或内部订单,U 则不需要,系统把费用过到默认的“杂项”科目上。实际项目中,U 用得少,因为财务无法追踪费用归属,审计通常会提异议。
还有一种情况容易混淆:物料主数据建了,但物料类型被维护成“非库存物料”。这种物料在物料主数据里可以看到,但 MMBE 查不到库存,因为收货后系统直接消耗,不走库存管理。这类物料的移动类型是 201(消耗性领料),而不是 501(无采购订单收货)。配置上,只要物料类型的“非库存”勾打上,PO 项目类别会自动跳成非库存,不需要手工干预。
2.2 配置路径与参数表
非库存采购的配置集中在两个地方:账户分配类别(科目分配类别)和 PO 项目类别。先说后台配置节点,我用表格整理一下:
| 配置项 | SPRO 路径 | 事务代码 | 关键参数 |
|---|---|---|---|
| 定义账户分配类别 | IMG → 物料管理 → 采购 → 采购订单 → 账户分配类别 → 定义账户分配类别 | OMB2 | 账户分配类别 K(成本中心)、U(未知) |
| 定义采购订单项目类别 | IMG → 物料管理 → 采购 → 采购订单 → 项目类别 → 定义项目类别 | OMB3 | 项目类别 B(限额订单)、0(标准)、D(服务) |
| 设置物料类型的项目类别 | IMG → 物料管理 → 采购 → 采购订单 → 项目类别 → 定义物料类型的项目类别 | OMT4 | 非库存物料类型对应“B”项目类别 |
配置的核心是账户分配类别。OMB2 里能看到系统预置的 K、U、A(资产)、E(订单)等,K 是使用频率最高的。K 类别里有个字段“账户分配屏幕”决定你建 PO 时会不会弹成本中心输入框,一般默认即可,不用改。
项目类别方面,非库存采购通常用“B”(限额订单)。这里有个容易踩的坑:B 项目类别的 PO,收货逻辑和标准 0 不一样,B 是“消耗性收货”,直接记费用,不会产生库存。如果你在 PO 里选的是 0,但物料是非库存属性,保存时系统会报错“项目类别 0 不允许用于该物料”,就是因为物料类型的默认项目类别没配好。OMT4 里把非库存物料类型对应的项目类别改成 B,这个问题就解决了。
2.3 手工维护非库存 PO 时最容易漏掉的字段
手工建非库存 PO 的流程不长,但字段容易漏。ME21N 进去后,供应商、采购组织、采购组是必填的;行项目里“物料”字段可以留空,直接写短文本;“项目类别”要手动改成 B;账户分配类别选 K,然后系统会弹出成本中心输入框。保存后 PO 抬头就有了,收货过账时费用直接进成本中心。
两个字段我每次都会被问到。第一个是“账户分配类别”和“科目分配类别”的区别——其实在中文里指同一个东西,英文是 Account Assignment Category,SAP 界面翻译成“账户分配类别”或“科目分配类别”,都是它。第二个是“行项目文本”,非库存采购没有物料主数据,行项目文本就是物料描述,一定要写清楚,否则采购员收货时不知道到货的是什么。
注意:非库存 PO 没有“库存地点”字段,也不需要做 MIGO 收货到库存的步骤。收货动作发生的时候,系统直接生成会计凭证借费用、贷 GR/IR 科目,物料数量不进库存。这个逻辑和标准库存采购完全不同,业务上要提前和财务对齐,否则财务月底对账会发现 GR/IR 挂着一堆未清项。
3. 采购申请自动转 PO:ME59N 手工转单与 BDC 批量回写
3.1 ME59N 手工转单:五个步骤里哪些字段决定结果
采购申请自动转 PO 是 MM 模块使用频率最高的功能之一。事务代码 ME59N,界面不复杂,但很多人第一次用会困惑:同样是转单,为什么有的申请单能转,有的转不了,有的转完变成一张大 PO,有的拆成好几张。这背后是选择条件和合并逻辑。
ME59N 的操作路径:输入筛选条件(工厂、采购组、供应商、申请单号),回车,系统列出符合条件的采购申请行项目。看到列表后,把要转的行勾上,点“选取所有”或直接点“采购订单”,系统转换后在底部弹出“已创建 PO”。这里五个关键字段决定转单结果:
- 工厂:申请单里的工厂必须在选择条件里,否则列表不显示。
- 采购组:申请单的采购组要和 PO 抬头一致,不一致时系统提示但可以强制转。
- 供应商:申请单可以没有供应商,但转 PO 时如果 PO 抬头供应商为空,系统会报错。
- 申请单号:精确筛选,适合单条转换。
- 状态:申请单必须处于“已释放”状态,未释放的单子在 ME59N 里默认不可见。
合并逻辑这块,SAP 默认按供应商+采购组织+工厂合并:相同组合的申请单行会合并进同一张 PO。不同供应商的申请单没法合并成一张 PO,因为 PO 抬头只允许一个供应商。想要更多控制,可以进 ME59N 菜单“编辑 → 参数”里设置“按供应商合并”“按工厂合并”等选项。生产环境里,我一般建议按工厂+供应商+采购组三个维度合并,既减少 PO 数量,又不至于把跨工厂的需求搅在一起。
3.2 BDC 录屏思路与 ABAP 代码:把手工操作变成批量脚本
采购员手里一次性压 50 条申请单时,手工 ME59N 还能接受;300 条以上还手工点,效率就太低了。此时常见做法是写一个 ABAP 批量转单程序。实现方式有两种:调用 BAPI ME_PO_CREATE,或者用 BDC 录屏回放。BAPI 方式的问题在于采购申请转 PO 的字段映射比较繁琐,尤其是非库存行、赠品行混在一起时,BAPI 的参数结构容易漏。我一般优先用 BDC,因为 ME59N 的前台逻辑会自动处理合并规则,比 BAPI 更贴近业务流程。
下面是一个 BDC 批量转单的代码骨架,字段名以 SHDB 录屏抓到的为准:
REPORT zmm_me59n_bdc. DATA: lt_bdc TYPE TABLE OF bdcdata, ls_bdc LIKE LINE OF lt_bdc, ls_opt TYPE ctu_params. * 选择屏幕:输入申请单号(可多条) PARAMETERS: p_banfn TYPE banfn OCCURS 0. * BDC 录屏片段:ME59N 初始界面 PERFORM bdc_field USING 'BDC_OKCODE' '/00'. PERFORM bdc_field USING 'RM06A-BANFN' '4500001234'. * 执行后进入申请单列表,点“选取所有” PERFORM bdc_field USING 'BDC_OKCODE' 'SEL_ALL'. PERFORM bdc_field USING 'BDC_OKCODE' 'PICK'. * 调用事务码 ls_opt-dismode = 'A'. " A=显示所有屏幕,E=仅出错时显示,N=后台静默 ls_opt-updmode = 'S'. " S=同步更新,A=异步更新 ls_opt-racommit = 'X'. " X=每屏幕自动提交,G=最后统一提交 CALL TRANSACTION 'ME59N' USING lt_bdc OPTIONS FROM ls_opt. IF sy-subrc = 0. WRITE: / 'PO 转换成功,申请单号:', p_banfn. ELSE. WRITE: / 'BDC 执行失败,请检查录屏字段与当前 SAP GUI 版本'. ENDIF. FORM bdc_field USING fname TYPE char40 fval TYPE char80. CLEAR ls_bdc. ls_bdc-fnam = fname. ls_bdc-fval = fval. APPEND ls_bdc TO lt_bdc. ENDFORM.逻辑说明:这段代码的核心是模拟用户在 ME59N 里的点击路径,先输入申请单号,再执行进入列表,然后点“选取所有”,最后触发转单。调用 TRANSACTION 时用的是录屏字段名,这些字段名必须和实际屏幕名称一致。ctu_params里的dismode控制调试模式,updmode控制更新模式,racommit控制提交时机。
参数说明:SEL_ALL和PICK是录屏抓出来的 OKCODE,不同 SAP GUI 版本可能不一样,我遇到过 7.50 版本把PICK改成PICK_TS的情况。最稳妥的办法是先在 SHDB 里录一遍手工操作,再对照录屏结果改字段名。RM06A-BANFN是申请单号字段,这个字段名在 ME59N 里基本固定,可以直接用。调试时把dismode设成'A',能看到每一步屏幕跳转,方便排错;批量生产跑的时候设成'N',后台静默执行。
3.3 转单校验逻辑:申请单状态、批次合并与审批链
BDC 跑完不等于万事大吉,转单后要做三层校验。第一层,看申请单状态:转成 PO 后,EBAN 表里的申请单行会被打上“已转”标记,字段EBAN-LOEKZ保持空,但EBAN-FRGKZ(释放标识)不再变化。如果申请单没被释放,ME59N 根本看不到,BDC 也会在第一步就退出。
第二层,查 PO 与申请单的凭证流:用 ME23N 打开生成的 PO,切到“采购申请”页签,能看到对应的申请单号。如果凭证流断掉,PO 和 PR 对不上,多半是申请单在转换前被改过行项目,比如数量变了。这种情况下 SAP 会把变更过的行拆成新 PO,原行留空,而不是报错。
第三层,批次合并结果:BDC 跑完后桶里可能产生意外数量的 PO,比如一条申请单拆成两张。这通常是因为申请单里有不同供应商的行。SAP 的转单逻辑按抬头供应商分组,一张申请单里有两家供应商,天然会拆成两张 PO。业务上如果必须一张申请单对应一张 PO,就要提前把不同供应商的需求拆成两条申请单,这个规则要在流程文档里写明,否则采购员会一直按“1 申请单 = 1 PO”的直觉来操作。
4. 含赠品采购单:RA00 / RA01 定价条件从配置到记账
4.1 免费货物业务场景与定价过程配置
供应商买十送一、满一百件赠两件,在 SAP MM 里叫做 Free Goods,中文界面一般翻译成“免费货物”。最常见的处理方式走采购定价条件:在 PO 里给赠品行单独一行,单价为零,数量按照供应商赠送比例来。这行必须和正常采购行分开,否则财务发票校验时会把赠品的零价值混进采购净值里,导致 GR/IR 金额错乱。
免费货物的核心是条件类型 RA00(自动免费货物)和 RA01(手工免费货物)。配置路径不在物料管理里,而是在销售与分销的定价配置里:
| 配置步骤 | SPRO 路径 | 事务代码 |
|---|---|---|
| 定义条件类型 | SPRO → 物料管理 → 采购 → 定价 → 条件定义 → 定义条件类型 | VK11 |
| 维护免费货物条件记录 | MEK1(创建)、MEK2(修改) | MEK1 |
| 定义定价过程 | SPRO → 物料管理 → 采购 → 定价 → 定价过程 → 定义定价过程 | 后台配置 |
VK11 里新建条件类型 RA00,计算规则选“比例”。比如买十送一,条件记录里维护比例 10:1。RA01 则是手工条件类型,用户建 PO 时自己输入赠品数量,系统不做自动计算。实际操作中,RA00 更适合供应商稳定、赠品规则明确的长期采购;RA01 适合临时促销,每次 PO 都要人工干预。
配置定价过程时,RA00 / RA01 要放在正确的位置。定价过程是采购订单里的小计计算流水线,条件类型依次参与计算。常见做法是让 RA00 和 RA01 放在“小计”步骤之前,这样赠品数量参与数量小计,但不参与净值计算。如果放错了位置,赠品数量被乘以采购单价,净值会莫名增加,财务对账时怎么都查不出来。
4.2 RA00 自动计算与 RA01 手工调整的参数说明
| 参数 | RA00 | RA01 |
|---|---|---|
| 计算规则 | 比例(条件记录里维护买 A 赠 B) | 手工输入数量 |
| 条件值类型 | 数量 | 数量 |
| 计算基准 | 采购数量 | 无 |
| 参与净价值计算 | 否 | 否 |
| 适用场景 | 长期固定赠品规则 | 临时促销、一次性赠品 |
维护条件记录用 MEK1,输入条件类型 RA00、供应商、物料(如果物料主数据存在)、采购组织,然后填比例。比例字段有两栏:采购数量和免费货物数量。比如买 10 送 1,采购数量填 10,免费货物数量填 1。保存后,建 PO 时如果采购数量是 20,系统自动带出免费货物数量 2,行项目里多出一行免费货物,单价自动为零。
RA01 则不需要条件记录,在 PO 行项目里切换到条件页签,手工加一行 RA01,填入赠品数量即可。RA01 的价值单位是“数量”,不是金额。第一次用的人常常把“额”填成金额,导致系统报“条件类型 RA01 不允许金额”。这类条件类型在 SAP 里属于“数量型条件”,和标准的价格条件 VPRS、PBXX 不同,值字段存的是数量。
4.3 赠品行与金额拆分的常见处理
PO 里出现赠品行后,行项目类别会变成“DLAN”(免费交货)。这个项目类别决定了收货和发票校验的行为。收货时,DLAN 行通常用移动类型 501(无采购订单收货)入库,数量计入库存,但金额为 0,库存价值不增加。这里有个容易被忽略的点:免费货物如果能单独存放、单独管理,才适合用 501 入库;如果和正常采购货物混在一起,比如同一箱里装 10 个正常 + 2 个赠送,业务上没法区分库存,就比较建议直接做“零价值收货”,不产生库存价值,只在数量上体现。
发票校验时,MIRO 里必须把赠品行标记为“不参与发票校验”。常见做法是在 MIRO 界面把免费货物行的“开票”勾去掉,这样财务录入发票金额时只看正常采购行,不会出现数量不符的差异。如果忘了处理,MIRO 会提示“该行项目不等于采购订单数量”,原因就是系统用免费货物的数量去比对供应商发票数量,两边对不上。
注意:免费货物配置完成后,最好在测试环境用同一张 PO 跑通“建单 → 收货 → 发票校验”三个动作,确认赠品行产生的会计凭证金额始终为零。很多项目的坑不在配置,而在财务月结时发现免费货物行产生了小额差异,源头往往是条件类型参与了净值计算,或者 501 收货时的移动类型错了。
5. 避坑:这套配置最容易翻车的五个点
5.1 现象:PO 转出来了,申请单还在
有一次客户打电话说 ME59N 执行成功,PO 也显示了,但 ME53N 里看申请单状态还是“未清”。原因是申请单不是普通的 NB 类型,而是用“采购申请”里的“框架协议”类型建的,这种申请单在转 PO 时不会自动清空,而是生成一个参考 PO。解决方法是先检查 EBAN-BSART(申请单类型),只把正常采购类型的申请单纳入自动转单范围;框架协议类型的申请单单独走手工流程。
5.2 现象:免费货物行被当成普通库存入库,库存金额错乱
赠品行在 MIGO 收货时用了移动类型 101,结果系统按零价值入库,库存数量增加了但金额没变,MMBE 里数量为正、金额为零,月底盘点差异巨大。原因是一开始 PO 里赠品行用了“标准”项目类别,而不是免费货物项目类别。解决:在 PO 行项目里把项目类别改成 DLAN,这样 MIGO 收货时系统会自动禁掉 101 类型,要求用户输入 501 或直接收货到零价值库存。
5.3 现象:RA00 条件记录维护了,PO 里不显示赠品行
MEK1 里明明维护了买 10 送 1,ME21N 建 PO 时输入数量 20,结果赠品行没有自动带出来。这种是定价过程配置的问题。RA00 条件类型在定价过程里被放在“折扣”步骤之后,系统计算完折扣才发现免费货物条件,此时数量已经定死,无法回写行项目数量。解决:把定价过程里 RA00 的位置移到 VPRS(价格)之后、折扣条件之前,确保它参与净数量计算但不参与净价值计算。
5.4 现象:非库存采购不收货,发票校验时数量差异
非库存 PO 收货后直接消耗,MIGO 不做,业务也没做 MIRO 的“货物接收”确认。到了发票校验,MIRO 显示“数量差异”,因为系统默认发票数量要和收货数量比对。非库存采购的收货数量为零,发票数量却是实际采购量。解决:在 MIRO 的“基于收货的发票校验”里,对非库存 PO 行不要勾选“交货已勾选”,或者让财务用“基于订单的发票校验”来处理,这样系统拿订单数量比对发票数量,就不会报差异了。
5.5 现象:BDC 录屏在自己电脑能跑,换一台电脑跑到一半就报“屏幕不匹配”
BDC 程序在一个 SAP GUI 版本上录好,换到另一个版本(比如 7.40 换 7.60)频繁报Screen sequence not as recorded。原因是不同 GUI 版本屏幕字段布局不同,尤其 ME59N 这种复杂事务码。解决:录屏时使用“字段名”而不是“字段位置”模式;代码里不要依赖BDC_CURSOR定位,尽量只传字段名和值。如果公司环境里有多个 GUI 版本,比较稳妥的做法是分别录两套字段名,程序里写一个版本判断,按 SY-SAPGUI_VERSION 分支传不同的字段表。
6. 进阶用法:把三条链路串成一张端到端测试表
三套配置单看都没问题,但采购流程是连续的:申请 → 转单 → 收货 → 发票校验。我建议交付前用一条完整链路做端到端验证,一次性发现跨环节的问题。
测试链路这样设计:先用 MEK1 维护 RA00 条件记录(买 10 送 1),再 ME51N 建一张两条物料的采购申请,一条库存物料、一条非库存物料。用 ME59N 自动转 PO,检查生成 PO 里的项目类别、赠品行数量、账户分配类别。然后 MIGO 收货:库存物料按 101 收货,非库存物料按 201 消耗性领料,赠品行按 501 收货。最后 MIRO 发票校验,重点看正常采购行金额是否与发票一致、赠品行是否被排除。
验证时重点关注两张报表。第一张是 ME80F(采购订单清单),按 PO 号输出后检查“净净值”字段,看是否等于正常采购行/单价的数量乘积,如果多了金额,说明赠品行参与了净值计算。第二张是 ME23N 的“采购订单历史”页签,确认 PO 下面挂着收货凭证、发票凭证,凭证流完整。非库存采购的 PO 历史上还应该能看到消耗性领料的物料凭证,移动类型 201,金额直接进费用科目。
整套配置交付的时候,我会给客户留下一张端到端测试记录表,表格里列申请单号、PO 号、赠品数量、收货数量、发票金额、GR/IR 余额六个字段。客户照着这个表跑一遍,配置有没有问题一目了然。从那以后我每次交付 MM 模块配置,无论客户多急,都会强制要求走一遍这条链路的端到端测试,测试表全部填完才签字。希望帮到你。
本文还有配套的精品资源,点击获取