关于CC STO和intra-company STO中‘交货已完成’指示器何时能被打上的浅析以及在GI/GR数量不等时怎样归档CC STO的分析
作者:袁云飞(AlbertYuan)- 微信号yuanalbert
以下内容均为原创,希望对初学者有一些辅助作用,本人主要从事MM/QM/WM的相关工作,不专业处请多多指点,十足干货,码字不易,且行且珍惜,你们的关注就是我努力的动力,转载请引用出处,感激不尽;
STO是一个庞大的主题,由于SAP的组织结构的设置原理,STO的应用是相当的广泛的,各种基于STO的业务变体和解决方案层出不穷,循环转库加价方案,评价转库方案等等都是我们伟大的顾问们用多少根头发在标准功能上演变而来的;由于STO本身的内容网络上资料已经比较多了,所以我也在思考是否还继续讨论这个主题,不过以后会慢慢讨论一些我比较擅长的STO领域里的一些知识点的,至于大拿们的好点子,我在没有深入理解透彻之前还是先不讨论,比较授人以鱼(转载)不如授人以渔(原理分析);
好了,我们转到整体上来,小伙伴们对PO行项目里的‘交货已完成’指示器应该不太陌生,是不是觉得这东西没有什么卵用,不过其实它的用处还是比较大的,虽然在控制我们收获上不是这么明显,但在计划的分析处理上是不可或缺的信息来源;
对于公司间STO以及公司内STO业务来说,这个指示器也是比较重要的,特别是归档的时候;
由于STO和外购PO对比来说,存在发和收两个方面,外购PO只有收的业务,所以只要我们的GR数量和PO数量一致,即可打上该标志,这个标志可以在GR的时候打上,可以让系统自动打上,可以手工打上;那么STO上我们什么时候能将这个指示器打上呢,换句话说,什么条件下我们能给STO打上这个标记呢;
首先如果后台PO凭证类型设置了控制指示器T,表示这是一个转储单,一般UB类型会设置,这属于公司内转储的,当这种PO的GI数量大于GR数量的时候,由于公司内STO会将发出数据作为在途放在MARC里,所以这种情况下,在途不为0,所以没法指示出该PO完结,也就是打不了交货完成标记;所以intra STO的条件就是发货数量=收货数量;如果不等有什么办法呢,一般来说就三个办法,一个就是按发出数据继续收货,然后退货多收的账面数量,或者报废掉;一个是冲销后重新按接收数量进行发货;最后一个就是,SAP提供了一对专门处理在途库存的移动类型,可以直接将在途库存消耗到成本中心里处理;
如果控制指示器不是T而是空,则表示属于一般的PO的跨公司STO;系统将使用不同的检查行为,由于此跨公司STO业务是不会有在途信息存放在表中的,所以这种PO被考虑closed,是分别在发出和接收工厂;所以跨公司STO的交货完成标记要想打上,要么是该STO行项目没有发生过业务,要么就是累计的接收工厂的收货数量和累计的发出工厂的发货数量相等,以及参考该STO的行项目的累计交货单数量之和等于收货数量;
所以,对于CC STO来说,是不需要去考虑PO行项目的订单数量的,也就是说他并不是交货已完成指示器能否被打上的判定条件;
那么问题来了,对于一个需要进行归档的STO来说,打上交货已完成指示器是必备的条件之一;而且系统会持续去检查是否收货数量=发货数量;如果确实在不相等的情况下,必须要归档STO订单,则我们就需要使用特殊的处理办法了;
通过打NOTE补丁167795,就能实现即便发出数量>接收数量的情况下,也可以打上交货已完成标志;
下面是针对S/4 HANA S4CORE 100 - 101的手工修正代码;
*$*$----------------------------------------------------------------$*$*
*$ Correction Inst. 0020751258 0000233059 $*
*$--------------------------------------------------------------------$*
*$ Valid for : $*
*$ Software Component S4CORE $*
*$ Release 100 All Support Package Levels $*
*$ Release 101 All Support Package Levels $*
*$--------------------------------------------------------------------$*
*$ Changes/Objects Not Contained in Standard SAP System $*
*$*$----------------------------------------------------------------$*$*
*&--------------------------------------------------------------------*
*& Object REPS FM06AFE0
*& Object Header PROG FM06AFE0
*&--------------------------------------------------------------------*
*& FORM BESTELLPOSITION
*&--------------------------------------------------------------------*
...
h_wamng = ABS( ekbes-wamng ).
*- Bei Umlagerung WE = WA --------------------------------------------*
def_break '012 - GR quantity differs GI quantity'. "#EC *
*>>>> START OF DELETION <<<<<
IF ekko-reswk NE space.
*>>>> END OF DELETION <<<<<<<
*>>>> START OF INSERTION <<<<
* IF ekko-reswk NE space.
* IF ekpo-retpo NE space.
* IF h_wemng NE h_wamng.
* na_prot 12 ekpo-ebelp space space.
* EXIT.
* ENDIF.
* ELSE.
* IF h_wemng NE ekbes-wamng.
* na_prot 12 ekpo-ebelp space space.
* EXIT.
* ENDIF.
* ENDIF.
*
* def_break '013 - GR quantity differs qty delivered'. "#EC *
*
* IF h_wemng NE ekbes-glmng AND ekbes-glmng NE 0.
* na_prot 13 ekpo-ebelp space space.
* EXIT.
* ENDIF.
* ENDIF.
IF ekko-reswk NE space.
IF ekko-bsakz EQ bsakz-tran.
*>>>> END OF INSERTION <<<<<<
...
def_break '013 - GR quantity differs qty delivered'. "#EC *
IF h_wemng NE ekbes-glmng AND ekbes-glmng NE 0.
na_prot 13 ekpo-ebelp space space.
EXIT.
*>>>> START OF INSERTION <<<<
ENDIF.
ELSE.
IF ekpo-retpo NE space.
IF h_wamng NE EKBES-GLMNG.
NA_PROT 99 EKPO-EBELP SPACE SPACE.
EXIT.
ENDIF.
ELSE.
IF EKBES-WAMNG NE EKBES-GLMNG.
NA_PROT 99 EKPO-EBELP SPACE SPACE.
EXIT.
ENDIF.
ENDIF.
*>>>> END OF INSERTION <<<<<<
...
*&--------------------------------------------------------------------*
*&--------------------------------------------------------------------*
*& Object REPS MM06EF0E_EKPO-ELIKZ
*& Object Header PROG MM06EF0E_EKPO-ELIKZ
*&--------------------------------------------------------------------*
*& FORM EKPO-ELIKZ
*&--------------------------------------------------------------------*
...
ENHANCEMENT-POINT EKPO_ELIKZ_01 SPOTS ES_MM06EF0E_EKPO_ELIKZ INCLUDE
BOUND.
IF ekpo-elikz NE space AND *ekpo-elikz EQ space.
DATA: l_ekko_reswk LIKE ekko-reswk.
ENHANCEMENT-POINT EKPO_ELIKZ_03 SPOTS ES_MM06EF0E_EKPO_ELIKZ INCLUDE
BOUND.
IF ekko-reswk NE space.
*>>>> START OF DELETION <<<<<
IF ekpo-retpo NE space.
*Return item, use absolute value
*>>>> END OF DELETION <<<<<<<
*>>>> START OF INSERTION <<<<
* IF ekpo-retpo NE space.
**Return item, use absolute value
IF ekko-bsakz EQ bsakz-tran.
IF ekpo-retpo NE space.
* return item, use absolute value
*>>>> END OF INSERTION <<<<<<
...
IF bets-wemng NE bets-wamng OR
( bets-wemng NE bets-glmng AND bets-glmng NE 0 ).
ENHANCEMENT-SECTION EKPO_ELIKZ_02 SPOTS ES_MM06EF0E_EKPO_ELIKZ
INCLUDE BOUND.
MESSAGE e848 WITH ekpo-ebelp.
END-ENHANCEMENT-SECTION.
*>>>> START OF INSERTION <<<<
* ENDIF.
* ENDIF.
* ENDIF.
ENDIF.
ENDIF.
ELSE.
IF ekpo-retpo NE space.
* return item, use absolute value
l_wamng = abs( bets-wamng ).
IF l_wamng NE bets-glmng.
MESSAGE e848 WITH ekpo-ebelp.
ENDIF.
ELSE.
IF bets-wamng NE bets-glmng.
MESSAGE e848 WITH ekpo-ebelp.
ENDIF.
*>>>> END OF INSERTION <<<<<<
...
*&--------------------------------------------------------------------*
*&--------------------------------------------------------------------*
*& Object REPS RM06EV47
*& Object Header PROG RM06EV47
*&--------------------------------------------------------------------*
*& FORM BESTELLPOSITION_EKBE
*&--------------------------------------------------------------------*
...
l_wamng = ABS( p_ekbes-wamng ).
l_remng = ABS( p_ekbes-remng ).
*- Bei Umlagerung WE = WA --------------------------------------------*
IF ekko-reswk NE space.
*>>>> START OF INSERTION <<<<
IF ekko-bsakz EQ bsakz-tran.
*>>>> END OF INSERTION <<<<<<
...
CALL FUNCTION 'ARCHIVE_PROTOCOL_COLLECT_APPL'
EXPORTING
i_object = p_posid
i_msgtype = '02'
i_text = text-025.
EXIT.
*>>>> START OF INSERTION <<<<
ENDIF.
* ENDIF.
else.
IF ekpo-retpo NE space.
IF l_wamng NE p_EKBES-GLMNG.
CLEAR p_archive.
CALL FUNCTION 'ARCHIVE_PROTOCOL_COLLECT_APPL'
EXPORTING
i_object = p_posid
i_msgtype = '02'
i_text = text-099.
EXIT.
ENDIF.
ELSE.
IF p_EKBES-WAMNG NE P_EKBES-GLMNG.
CLEAR p_archive.
CALL FUNCTION 'ARCHIVE_PROTOCOL_COLLECT_APPL'
EXPORTING
i_object = p_posid
i_msgtype = '02'
i_text = text-099.
EXIT.
ENDIF.
ENDIF.
*>>>> END OF INSERTION <<<<<<
...
*&--------------------------------------------------------------------*
*&--------------------------------------------------------------------*
*& Object REPS RM06EV70
*& Object Header PROG RM06EV70
*&--------------------------------------------------------------------*
*& CLASS LCL_MM_EKKO IMPLEMENTATION
*&--------------------------------------------------------------------*
...
l_remng = abs( ld_ekbes->remng ).
*- with transfer goods receipt = goods issue
*--------------------------------------------*
IF ms_document_data-ekko->reswk NE space.
ENHANCEMENT-SECTION ME_RM06EV70_06 SPOTS ES_RM06EV70 .
*>>>> START OF INSERTION <<<<
IF ms_document_data-ekko->bsakz EQ me->mo_const->bsakz_t.
*>>>> END OF INSERTION <<<<<<
...
MESSAGE i087(mmpur_archive) WITH <hdr>->ebeln
id_item->ebelp
INTO lv_text.
RAISE EXCEPTION TYPE cx_mmpur_root.
ENDIF.
ENDIF.
*>>>> START OF DELETION <<<<<
IF l_wemng NE ld_ekbes->glmng AND ld_ekbes->glmng NE 0.
* IF id_item->menge NE ld_ekbes->glmng AND ld_ekbes->glmng NE 0.
MESSAGE i088(mmpur_archive) WITH <hdr>->ebeln id_item->ebelp
INTO lv_text.
RAISE EXCEPTION TYPE cx_mmpur_root.
*>>>> END OF DELETION <<<<<<<
*>>>> START OF INSERTION <<<<
IF l_wemng NE ld_ekbes->glmng AND ld_ekbes->glmng NE 0.
* IF id_item->menge NE ld_ekbes->glmng AND ld_ekbes->glmng NE
*0.
MESSAGE i088(mmpur_archive) WITH <hdr>->ebeln id_item->ebelp
INTO lv_text.
RAISE EXCEPTION TYPE cx_mmpur_root.
ENDIF.
ELSE.
IF id_item->retpo NE space.
IF l_wamng NE ld_ekbes->glmng.
MESSAGE i299(mmpur_archive) WITH <hdr>->ebeln id_item->ebelp
INTO lv_text.
RAISE EXCEPTION TYPE cx_mmpur_root.
ENDIF.
ELSE.
IF ld_ekbes->wamng NE ld_ekbes->glmng.
MESSAGE i299(mmpur_archive) WITH <hdr>->ebeln id_item->ebelp
INTO lv_text.
RAISE EXCEPTION TYPE cx_mmpur_root.
ENDIF.
ENDIF.
*>>>> END OF INSERTION <<<<<<
...
*&--------------------------------------------------------------------*
袁云飞
发布了33 篇原创文章 · 获赞 0 · 访问量 726
私信
关注