由一个issue进而引起的思考和探究。笔者近日接到一个ticket。当客户在修改SO中客户代码信息时,报错batch no找不到被cancelled.如下:’
The batch number of item 000020 is cancelled
Message No. V1255
’
点击确认后,系统又报出另外一个error ‘Item 000020: Requirement type can no longer be changed due to prod. order 6004237’
咋看下,这两个报错毫无关联可言。经过大量的debug后,发现是因为在修改sold to party客户变了,导致工厂重新决定,进而导致的以上的问题。
那么下面就详细分析下工厂在SO里面是如何决定出来的。以下代码是SO里面关于werks的取值逻辑。
Main program: SAPFV45P
INCLUDE: FV45PF0V_VBAP-WERKS_ERMITTELN
Form: VBAP-WERKS_ERMITTELN
首先,对于下列两种情况在order change时不会重新确定工厂的,
- Configurable material will not be re-determined for plant.
- Order type category 为\'D\' item proposal时不会re-determine plant.
决定工厂时顺序:
- 订单手工输入的werks优先级最高, 如果订单werks 不为空,则直接跳过下面的检查取值
2. 订单抬头的delivery plant输入的情况,且vbap-werks为空。
3. 针对有bill of material bom的情况,即有上下级别item level时;下级的item会自动取上级的plant作为delivery plant
20行item自动取10行Plant。
该物料主数据里面维护的为CN01,并没有取这里,而是来自其上级。
再看个例子,这里ship to 里面维护的工厂为CN01; 且CNINSTALL 物料里面也是CN01. 但系统依然取其上级的plant作为delivery plant.
4. customer material infor record里面; table KNMT-werks
5. 从ship to party 决定; 如果ship to party里面维护了shipping plant而且vbap-werks 为空(对于order change的情况,当修改sold to或ship to 等信息时会清空该值,然后重新确定;可以说当sold to 修改了基本上很多表都会清空然后重新赋值)
该案例当中的工厂取ship to party里面的CN01, 这时就报batch number was cancelled. 因为这时候vbap-werks = CN01. 而该batch number根本就不存在CN01中。
点击确认后,报错。Item 000020: Requirement type can no longer be changed due to prod. order 6004237
这是因为该物料在CN01工厂下的strategy group为空,mrp type = ND; 根据系统设定,requirement type变成了011, 所以系统认为这时要修改requirement type, 然而对于mto 来讲,该SO+Item已经有工单,且blue了。所以不能修改requirement type.
或者是在修改sold to party信息后,点击don\'t re-determine plant / shipping point.这样,工厂就不会取ship to 里面的了。
这里要补充一点,倘若ship to party里面维护了工厂,但该物料不存在该工厂中,那么就会去物料主数据中的delivery plant.继续下面的取值逻辑。
6. 从物料主数据中决定plant. 如果上面没有取到,即vbap-werks为空时,会走该逻辑。取物料销售视图里面维护的shipping plant.
7. 最后如果以上条件都没有取到工厂,那么就会把*vbap-werks即现有item 上面带的plant赋值给vbap-werks.(这种仅仅是对于order change的)
2020-12-15 @changzhou