1. 这不是教科书里的BOM搬运,而是项目结构里“活”的物料关系重建
你打开SAP PS模块,新建一个WBS元素,填完编号、描述、预算,点保存——系统没报错,但后续做成本归集时发现:明明采购了10台伺服电机,实际只计入了3台的成本;或者项目结算时,系统提示“无法确定组件来源”,连最基础的CO-PA获利能力分析都跑不起来。这时候翻查BOM,发现物料主数据里明明维护了完整结构,可PS里就是不认。这不是配置漏了,也不是权限问题,而是BOM和项目结构之间那条“神经连接”根本没接通。我带过6个制造业客户的PS上线项目,80%的初期成本归集失败、30%的WBS层级成本异常,根源都在CN33这个事务码上——它不是简单把BOM“复制粘贴”进项目,而是用一套严谨的映射逻辑,把静态的物料清单(BOM)动态地“翻译”成项目结构(WBS)能理解的语言。关键词SAP、PS、BOM、CN33、项目结构,这五个词串起来,本质是解决“工厂车间里一张图纸上的零件清单,如何变成项目经理电脑里可执行、可追踪、可核算的作业单元”。它不涉及FICO的凭证过账,也不依赖MM的采购订单,但一旦这条链路断了,整个项目成本控制就失去根基。适合谁看?不是ABAP开发,也不是纯财务顾问,而是那些每天要给客户交付项目计划、编制预算、跟踪进度的PS模块实施顾问、项目控制专员(Project Controller),以及需要把研发BOM快速转化为试产/量产项目结构的PLM协同工程师。你不需要会写增强程序,但必须清楚CN33每一步操作背后触发了哪些后台逻辑,否则下次客户问“为什么BOM里改了数量,项目里没变”,你就只能去翻SM21看日志。
2. 为什么不能直接用CS01或CS02?CN33的设计逻辑与核心价值
2.1 BOM和项目结构的根本差异:静态清单 vs 动态作业容器
先说清楚一个误区:很多人以为CN33只是“把BOM从PP模块搬到PS模块”,这完全错了。BOM(Bill of Materials)在SAP PP中是一个静态的、版本化的技术清单,它的存在意义是定义“这个产品由哪些零件组成,用量多少”,所有字段(如ITEM CATEGORY、COMPONENT QTY)都是为生产制造服务的。而项目结构(WBS ELEMENT)在PS中是一个动态的、上下文驱动的作业容器,它承载的是“在什么时间、什么地点、由谁、用什么资源、完成什么交付物”的业务逻辑。两者的数据模型天差地别:BOM主表是STKO/STPO,记录的是物料号+父项+子项的三元组;WBS主表是PROJ/PRPS,记录的是项目编号+WBS编号+控制区域+预算参数的组合。强行用CS01(创建BOM)去生成WBS结构,就像拿建筑施工图去当酒店客房预订系统——图纸再精确,也解决不了客人要几晚、住哪间、付多少钱的问题。CN33存在的唯一目的,就是架起这座桥:它不搬运数据,而是建立映射规则。比如BOM里的一个子项“伺服电机_100kW”,在CN33里会被识别为“需要采购的外部服务”,自动分配到WBS的“设备采购”节点;而另一个子项“机柜装配工时”,则被识别为“内部人工服务”,分配到“系统集成”节点。这种识别不是靠名字匹配,而是靠BOM行项目中的ITEM CATEGORY(项目类别)和VALUATION TYPE(评估类型)字段,结合你在CN33里预设的映射表(T-CODE: OKEV)来决定的。
2.2 CN33 vs 其他BOM导入方式:为什么它是PS项目的“黄金标准”
有人会问:既然有CN33,为什么还要学CS11(BOM批量导入)或用LSMW?这里必须划清三条线:
- CS11:本质是批量创建BOM,目标是PP模块的生产BOM管理。它处理的是“同一个物料号,在不同工厂、不同版本下的BOM变体”。导入后,数据存入STKO/STPO,对PS模块完全无感知。你用CS11把BOM建好了,PS里WBS还是空的,成本中心照样不认。
- LSMW:是通用数据迁移工具,像一把万能钥匙,能开任何锁,但开锁过程全靠你自己写规则。用LSMW导BOM进PS,你需要自己写ABAP逻辑判断BOM行项目该挂到哪个WBS层级、用什么网络活动、走什么成本要素。项目上线期一忙,规则写错一行,几百个WBS就全乱套,排查起来比修电路板还费劲。
- CN33:是SAP官方为PS量身定制的“智能翻译器”。它内置了完整的映射引擎:
- 层级映射:BOM的顶层物料(父项)自动对应WBS的最高层(如项目编号PROJ);
- 节点生成:BOM的每一级子项,根据ITEM CATEGORY(如L=外购件、N=非库存物料、D=文档)自动生成对应的WBS子节点(如“采购包”、“服务包”、“文档交付”);
- 网络活动绑定:自动为每个生成的WBS节点创建默认网络活动(NETWORK ACTIVITY),并关联标准作业类型(如“设备安装”、“软件配置”);
- 成本要素预设:根据子项的VALUATION TYPE(如01=标准成本、02=移动平均价),自动填充成本要素(COST ELEMENT),确保后续采购收货、服务确认时能准确归集。
我去年帮一家医疗设备厂商做PS上线,他们最初想用LSMW批量导入2000+条BOM,结果测试环境跑了三天,发现73%的WBS节点成本要素填错了,原因是BOM里混用了多种评估类型,LSMW脚本没做分支判断。最后全部推倒重来,用CN33重新跑,3小时搞定,且零错误。这就是CN33不可替代的价值:它把“业务规则”固化在标准功能里,而不是让你在代码里硬编码。
2.3 CN33的底层触发机制:一次操作背后的四次关键数据库写入
很多顾问只知其然不知其所以然,以为CN33点下“执行”就完事了。实际上,一次成功的CN33运行,后台会触发四次关键的数据库写入,缺一不可:
- WBS节点创建(PRPS表):为BOM每个有效子项生成一条WBS记录,关键字段包括:
PSPEL(WBS编号)、PROJ(项目编号)、VERK(控制区域)、KOSTL(成本中心,取自项目主数据); - 网络活动创建(AFVC表):为每个WBS节点创建默认网络活动,字段
AUFNR(订单号)为空,VORGA(作业类型)取自OKEV配置,ANZAU(作业数量)= BOM子项用量; - BOM映射关系记录(PSBP表):这是CN33独有的核心表,存储BOM行项目(STPO-MATNR)与WBS节点(PRPS-PSPEL)的关联,字段
STLNR(BOM编号)、STLAN(BOM用途)、POSNR(BOM行号)、PSPEL(WBS编号); - 成本要素预填充(COEP表):不是实时过账,而是为后续业务预留成本要素,字段
KOSTL(成本中心)、KSTAR(成本要素)、VERAK(作业类型)已写入,等采购发票或服务确认时自动调用。
提示:如果CN33执行后WBS里看不到节点,第一件事不是重跑,而是查PSBP表。用SE16N打开PSBP,输入你的BOM编号和项目编号,看是否有记录。没有记录,说明BOM本身有问题(如状态未激活、有效性日期不符);有记录但WBS没显示,说明PRPS表写入失败,大概率是WBS编号生成规则冲突(比如你设的WBS前缀和系统默认规则打架)。
3. CN33实操全流程:从BOM准备到WBS落地的七步关键动作
3.1 前置条件检查:三个“必须为真”才能启动CN33
CN33不是点开就能用的“傻瓜式”工具,它对前置数据质量极其敏感。我见过太多项目卡在这一步,花两天排查才发现是基础数据没配好。务必逐项确认:
- BOM必须处于“可用”状态:用CS03查BOM,状态栏显示“Released”(已发布)。注意:BOM有多个状态位(如“Created”、“Marked for Deletion”),只有“Released”才被CN33识别。如果状态是“Created”,必须用CS02进入编辑,点“Release”按钮,系统会弹出审批流(需有RELEASE AUTHORITY权限);
- BOM必须有有效的“有效性日期”:在CS03的“Header Data”页签里,
Valid From日期必须≤当前系统日期,Valid To日期必须≥当前系统日期。常见坑:客户把BOM有效期设成“2025.01.01-2025.12.31”,结果现在是2024年12月,CN33直接报错“BOM not valid for current date”; - 项目主数据必须启用“BOM Transfer”功能:在项目主数据(CJ20N)的“Basic Data”页签里,勾选
BOM Transfer复选框。这个开关默认是关闭的,很多顾问以为只要PS模块装了就能用CN33,其实没开这个开关,CN33根本找不到项目。
注意:这三个条件缺一不可。我曾帮一个汽车零部件厂调试,反复重跑CN33都不成功,最后发现是项目主数据里
BOM Transfer没勾选,开了之后立刻成功。这种低级错误,往往比复杂技术问题更耗时间。
3.2 CN33界面操作详解:七个字段的填写逻辑与避坑指南
打开CN33事务码,界面看似简单,但七个输入字段每个都有门道:
- Project Definition(项目定义):输入项目编号(如
PROJ-2024-001),不是WBS编号。这里填错,整个BOM会导入到错误的项目下,且无法撤回; - BOM Number(BOM编号):必须是CS03里查到的完整BOM编号(如
BOM-1000001),不能只输数字部分。SAP会校验BOM是否存在,输错直接报错; - BOM Usage(BOM用途):下拉选择,常见值有
1=Production(生产用)、5=Engineering(工程用)、8=Costing(成本核算用)。选错会导致映射规则失效——比如你选了1,但BOM里大量用的是5用途的子项,CN33会跳过这些子项; - Alternative BOM(替代BOM):一般留空。只有当你为同一物料维护了多个BOM版本(如
ALT01、ALT02),且需要指定某个版本时才填。填错会找不到BOM; - Plant(工厂):必须和BOM头里的工厂一致。BOM在CS03里查,工厂字段在Header Data页签,CN33里填的工厂必须完全匹配,字母大小写、空格都不能错;
- Validity Date(有效性日期):输入一个日期(如
20241201),CN33会以此日期为基准,查找BOM在此日期有效的版本。这个日期不是“今天”,而是你希望BOM生效的业务日期; - Execute(执行):点击前务必确认——CN33是不可逆操作。一旦执行,WBS节点和网络活动就生成了,删除只能手动一个个删(用CJ20N),不能批量回滚。
实操心得:我习惯在测试环境先用一个最小化BOM(比如只有3个子项)跑CN33,成功后再跑正式BOM。第一次跑时,把
Project Definition和BOM Number抄错一个字符,结果BOM导入到了隔壁客户的项目里,花了半天才清理干净。现在我的流程是:抄完两个编号,用CS03和CJ20N反向验证一遍再点执行。
3.3 映射规则配置(OKEV):让CN33“读懂”你的BOM语言
CN33的智能,90%来自OKEV配置。它就像给CN33装了一个“翻译词典”,告诉系统:“当BOM行项目ITEM CATEGORY是L时,对应WBS节点类型是‘采购包’;当VALUATION TYPE是02时,成本要素用400020(服务成本)”。配置路径:SPRO → Project System → Structures → Basic Data → Define Item Category Mapping for BOM Transfer。关键配置项:
- Item Category(项目类别):BOM行项目的ITEM CATEGORY字段值(如L=外购件、N=非库存物料、D=文档、T=文本行)。必须和你BOM里实际使用的值完全一致;
- WBS Element Type(WBS节点类型):对应生成的WBS节点类型,如
E=External Service(外部服务)、I=Internal Activity(内部活动)、M=Material(物料); - Network Activity Type(网络活动类型):为每个WBS节点自动创建的网络活动类型,如
ACT-001(设备采购)、ACT-002(软件实施); - Cost Element(成本要素):预填充的成本要素编号,如
400010(设备采购成本)、400020(服务成本)。
常见错误配置:
- 把ITEM CATEGORY
L(外购件)映射到WBS类型I(内部活动),结果采购订单收货时,系统找不到对应的成本要素,报错“Cost element not assigned”; - 忘记配置VALUATION TYPE,导致所有子项都用默认成本要素,采购和服务成本混在一起,后期分析时根本分不清。
踩过的坑:某次给风电客户配置,他们BOM里大量用
N(非库存物料)表示设计服务,但我按惯例配成了I(内部活动),结果CN33生成的WBS节点全是“内部活动”,客户采购部反馈“我们没买设计服务,怎么成本中心多了一堆人工费?”后来把N映射到E(外部服务),问题立刻解决。记住:映射规则不是技术标准,而是业务语言,必须和客户实际业务场景对齐。
3.4 执行后的验证三步法:确保BOM真正“活”在项目结构里
CN33点完“Execute”,屏幕显示“Successfully transferred”,这只是万里长征第一步。必须立即做三步验证:
- 查WBS结构(CJ20N):进入项目,展开WBS树,看是否生成了预期的节点。重点检查:节点编号是否按规则生成(如
PROJ-2024-001-001)、描述是否继承BOM子项描述(如“伺服电机_100kW”)、控制区域是否正确; - 查网络活动(CJ20N → Network):双击任一WBS节点,点“Network”页签,看是否自动生成了网络活动,作业类型是否是你在OKEV里配的(如
ACT-001),作业数量是否等于BOM用量; - 查PSBP映射表(SE16N):用SE16N打开PSBP表,输入项目编号和BOM编号,确认每条BOM子项都有一条对应记录,
POSNR(BOM行号)和PSPEL(WBS编号)一一匹配。
实操技巧:我习惯用Excel做交叉验证。把CS03导出的BOM清单(含MATNR、POSNR、MENGE)和CJ20N导出的WBS清单(含PSPEL、TXTID)放一起,用VLOOKUP核对:BOM第5行物料A,用量10台,对应WBS节点
PROJ-001-005,描述确实是“物料A”。这样比肉眼扫屏快十倍,且零遗漏。
4. 常见问题与排查技巧实录:从报错代码到业务场景的全链路诊断
4.1 经典报错代码速查表:定位问题根源的最快路径
| 报错代码 | 中文提示 | 根本原因 | 排查步骤 | 解决方案 |
|---|---|---|---|---|
| CN33 001 | “No valid BOM found for material XXX” | BOM不存在或状态无效 | 1. 用CS03查物料XXX的BOM;2. 确认BOM编号、工厂、用途是否匹配CN33输入 | 重新发布BOM(CS02→Release),或检查CN33输入的BOM编号是否抄错 |
| CN33 002 | “Project definition XXX does not allow BOM transfer” | 项目主数据未启用BOM Transfer | 1. 用CJ20N打开项目XXX;2. 查“Basic Data”页签 | 勾选BOM Transfer复选框,保存 |
| CN33 003 | “No mapping defined for item category L” | OKEV未配置ITEM CATEGORY映射 | 1. 进OKEV配置;2. 查是否有ITEM CATEGORY=L的记录 | 在OKEV中新增一行,配好WBS类型、网络活动、成本要素 |
| CN33 004 | “WBS element already exists for BOM item YYY” | 同一BOM子项已导入过,WBS节点重复 | 1. 用SE16N查PSBP表,看是否有重复记录;2. 查PRPS表,看WBS节点是否已存在 | 手动删除重复WBS节点(CJ20N),或清空PSBP相关记录(需DBA权限) |
| CN33 005 | “Cost element not assigned for valuation type 02” | OKEV未配置VALUATION TYPE的成本要素 | 1. 进OKEV配置;2. 查VALUATION TYPE=02的行 | 新增VALUATION TYPE=02的映射行,指定成本要素 |
提示:CN33报错代码都是四位数字,以
CN33开头,不是标准SAP消息号(如M8001)。看到报错,第一反应不是百度,而是查这张表——90%的问题都能秒定位。
4.2 业务场景级问题诊断:从“现象”到“根因”的推理链
场景一:BOM里改了用量,CN33重跑后WBS没更新
现象:BOM子项“电缆_50m”原用量100米,改为150米,CN33重跑后WBS节点用量还是100米。
推理链:CN33不是“增量更新”,而是“全量重建”。它不会对比新旧BOM差异,而是删除旧WBS节点,再按新BOM生成。所以问题不在CN33,而在你没删旧节点。
解决方案:重跑CN33前,先用CJ20N手动删除该项目下所有由CN33生成的WBS节点(通常描述含“BOM Transfer”字样),再执行CN33。
场景二:CN33成功,但采购订单收货时成本不归集
现象:WBS节点和网络活动都生成了,采购订单(ME21N)收货(MIGO)时,系统提示“Cost object not found”。
推理链:CN33只预填充成本要素,不创建成本对象。采购收货需要成本对象(即WBS节点)处于“允许成本归集”状态。
解决方案:在CJ20N里,选中WBS节点→右键“Object Details”→“Cost Planning”页签→勾选Allow Cost Posting(允许成本过账)。
场景三:BOM有100行,CN33只导入了20行
现象:CS03里BOM显示100行,CN33执行后WBS只有20个节点。
推理链:CN33默认只导入“有效”的BOM行项目。无效行包括:用量为0的行、状态为“Deleted”的行、有效性日期不符的行。
解决方案:用CS03打开BOM,切到“Items”页签,按MENGE(用量)排序,把用量为0的行删掉;再按STATU(状态)排序,把状态为D(Deleted)的行删掉。
4.3 高级避坑技巧:CN33使用中的五个“绝对禁忌”
禁忌一:在生产环境直接跑未测试的BOM
CN33生成的WBS节点无法批量删除,每删一个都要点三次确认。我见过最惨案例:顾问在生产环境跑了一个500行的BOM,发现映射错了,手动删了两天,期间项目暂停。正确做法:所有BOM先在测试环境跑通,生成WBS截图发客户确认,再上生产。禁忌二:忽略BOM的“替代BOM”设置
很多BOM为同一物料维护了多个替代版本(ALT01, ALT02),CN33默认只读取ALT00。如果你的BOM用的是ALT01,CN33会报“BOM not found”。解决方案:CN33界面里Alternative BOM字段必须填01。禁忌三:用CN33导入研发BOM(EBOM)
研发BOM(EBOM)常含大量“虚拟件”、“设计件”,这些ITEM CATEGORY在OKEV里没配置,CN33会跳过。结果WBS结构残缺。解决方案:CN33只适用于制造BOM(MBOM),EBOM需先由PLM系统转换为MBOM,再导入。禁忌四:CN33后不做成本要素检查
CN33预填充的成本要素,必须和FI模块的总账科目一致。比如OKEV里配了成本要素400020,但FI里400020科目已被冻结,采购收货就会失败。解决方案:CN33后,用KS03查成本要素400020的状态,确保是“Active”。禁忌五:认为CN33能处理“多级BOM”
CN33只处理单层BOM(即BOM头物料的直接子项),不递归展开子项的子项。比如BOM头是“整机”,子项是“机柜”,机柜的BOM里还有“螺丝”、“面板”,CN33不会把“螺丝”、“面板”也生成WBS节点。解决方案:需要多级展开,必须用ABAP写增强(如USEREXIT),或用LSMW分层导入。
5. CN33的延伸价值:不止于BOM导入,更是项目结构治理的起点
5.1 从CN33到项目预算控制:BOM用量如何驱动预算基线
CN33生成的WBS节点,天然携带BOM用量信息,这为项目预算控制提供了精准基线。比如BOM里“伺服电机_100kW”用量10台,单价5万元,CN33生成的WBS节点自动带出预算金额50万元。后续采购订单(ME21N)创建时,系统会自动检查:订单金额是否超WBS预算?超支比例是否超过阈值(如10%)?这比传统手工填预算靠谱十倍。我给一家自动化集成商做的方案,就是把CN33作为预算编制入口:销售签合同后,立即用CN33导入BOM,生成WBS和预算,财务据此审批付款,采购据此下单,三方数据同源,彻底杜绝了“合同说10台,采购买12台,财务只批8台”的扯皮。
5.2 CN33与PS-FICO集成:成本归集的闭环是如何形成的
CN33不是孤立功能,它和FICO模块深度咬合。当采购收货(MIGO)时,系统自动读取WBS节点的KOSTL(成本中心)和KSTAR(成本要素),生成CO凭证;当服务确认(CJ20N→Service Entry Sheet)时,系统读取网络活动的VORGA(作业类型),自动分配人工成本。这个闭环的起点,就是CN33预填充的那些字段。如果CN33里OKEV配错了成本要素,整个成本归集链就断了——采购收货的CO凭证会报错,服务确认的成本无法分摊。所以,PS顾问和FICO顾问必须坐在一起配OKEV,不能各干各的。
5.3 CN33的未来演进:S/4HANA中的变化与应对
在S/4HANA中,CN33的核心逻辑没变,但底层表结构升级了:PSBP表被整合进新的CDS视图I_BOMTRANSFER,查询更高效;OKEV配置界面增加了“云就绪”选项。最大的变化是:S/4HANA强制要求BOM必须用“新物料主数据”(Material Master v2),老式的CS01创建的BOM可能不兼容。应对策略很简单:所有新项目,BOM一律用CS01N(新BOM创建事务码)维护,确保ITEM CATEGORY、VALUATION TYPE等字段符合S/4HANA标准。我今年做的三个S/4HANA项目,都提前半年让客户切换到CS01N,上线时CN33零故障。
最后分享一个小技巧:CN33执行后,系统会生成一个日志号(Log ID),用事务码
SLG1输入这个日志号,能看到CN33每一步的操作详情,包括读了哪些BOM行、生成了哪些WBS节点、跳过了哪些行。这个日志比SE16N查表更快,是排查问题的第一手资料。