一、问题描述:销售订单修改某些特征值字段,保存后,获利能力段对应的字段值没更新。
比如:把销售订单销售组从Z09修改为Z04,保存后,获利能力段重的销售组还是旧值Z09。
1、修改销售组为Z04,然后保存
2、销售订单明细查看-》科目分配-》获利能力段,没有变过来,需要点“派生”才更新
二、解决办法:
1、思路:销售订单下面做增强,在保存的时候检查相关字段是否修改了,修改了的话,把销售订单保存到自建表,然后做一个报表,循环取出里面的销售订单,VBAP-PAOBJNR = CE41000_ACCT-PAOBJNR, CE41000_ACCT-CE4KEY = CE41000-PAOBJNR更新CE41000这张表里面的销售组等相关字段,然后做一个定时任务。当然也可以直接在增强下面更新CE41000这张表。
2、代码:
REPORT ZFI057.TABLES:VBAK.DATA:IT_ZTFI001 TYPE TABLE OF ZTFI001 WITH HEADER LINE.
DATA:IT_VBAP TYPE TABLE OF VBAP WITH HEADER LINE .
DATA:IT_CE41000_ACCT TYPE TABLE OF CE41000_ACCT WITH HEADER LINE.
DATA:IT_VBAK TYPE TABLE OF VBAK WITH HEADER LINE.
DATA:IT_VBKD TYPE TABLE OF VBKD WITH HEADER LINE.
DATA: LV_TABIX TYPE SY-TABIX.
DATA: LV_TABIX2 TYPE SY-TABIX.
DATA:LV_STRING TYPE STRING.
DATA:FLAG TYPE C.SELECT-OPTIONS:S_VBELN FOR VBAK-VBELN.START-OF-SELECTION.SELECT * INTO CORRESPONDING FIELDS OF TABLE IT_ZTFI001 FROM ZTFI001 WHERE VBELN IN S_VBELN AND FLAG = SPACE .IF IT_ZTFI001[] IS INITIAL.EXIT.ENDIF.SELECT VBELN POSNR PAOBJNR INTO CORRESPONDING FIELDS OF TABLE IT_VBAP FROM VBAPFOR ALL ENTRIES IN IT_ZTFI001WHERE VBELN = IT_ZTFI001-VBELN.SELECT VBELN VKBUR VKGRP ZZDDLB INTO CORRESPONDING FIELDS OF TABLE IT_VBAK FROM VBAK
FOR ALL ENTRIES IN IT_ZTFI001
WHERE VBELN = IT_ZTFI001-VBELN.SELECT VBELN BZIRK INTO CORRESPONDING FIELDS OF TABLE IT_VBKD FROM VBKD
FOR ALL ENTRIES IN IT_ZTFI001
WHERE VBELN = IT_ZTFI001-VBELN.IF IT_VBAP[] IS NOT INITIAL.SELECT AKTBO PAOBJNR PASUBNR CE4KEY INTO CORRESPONDING FIELDS OF TABLE IT_CE41000_ACCTFROM CE41000_ACCTFOR ALL ENTRIES IN IT_VBAPWHERE PAOBJNR = IT_VBAP-PAOBJNR AND AKTBO = 'X'.ENDIF.SORT IT_VBAP BY VBELN .SORT IT_CE41000_ACCT BY PAOBJNR.CLEAR:LV_TABIX2.LOOP AT IT_ZTFI001 .READ TABLE IT_VBAK WITH KEY VBELN = IT_ZTFI001-VBELN BINARY SEARCH.IF SY-SUBRC <> 0.CONTINUE.ENDIF.READ TABLE IT_VBKD WITH KEY VBELN = IT_ZTFI001-VBELN BINARY SEARCH.IF SY-SUBRC <> 0.CONTINUE.ENDIF.FLAG = ''.READ TABLE IT_VBAP WITH KEY VBELN = IT_ZTFI001-VBELN BINARY SEARCH.IF SY-SUBRC = 0.LV_TABIX = SY-TABIX.LOOP AT IT_VBAP FROM LV_TABIX.IF IT_VBAP-VBELN <> IT_ZTFI001-VBELN .EXIT.ENDIF.READ TABLE IT_CE41000_ACCT WITH KEY PAOBJNR = IT_VBAP-PAOBJNR BINARY SEARCH.IF SY-SUBRC = 0.UPDATE CE41000 SET VKBUR = IT_VBAK-VKBUR WW010 = IT_VBAK-ZZDDLB VKGRP = IT_VBAK-VKGRP BZIRK = IT_VBKD-BZIRK WHERE PAOBJNR = IT_CE41000_ACCT-CE4KEY.CALL FUNCTION 'DB_COMMIT'.IF SY-SUBRC = 0.FLAG = 'X'.ELSE.FLAG = ''.ENDIF.ELSE.FLAG = ''.ENDIF.ENDLOOP.IF FLAG = 'X'.UPDATE ZTFI001 SET FLAG = 'S' WHERE VBELN = IT_ZTFI001-VBELN.CALL FUNCTION 'DB_COMMIT'.LV_TABIX2 = LV_TABIX2 + 1.ENDIF.ENDIF.ENDLOOP.LV_STRING = LV_TABIX2.WRITE:/'处理成功' && LV_STRING && '条数据'.
三、问题分析:
1、网上说可以用过函数COPA_PROFITABILITY_SEGMENT来解决问题,经过研究发现,这个函数是创建一个新的获利能力段,销售订单中的活力能力段点派生的时候会调用它。但是这个函数创建获利能力段后,还需要把它产生的获利能力段编号更新到VBAP-PAOBJNR。而且此函数的参数很多,没搞清楚,所以放弃了。我没有找到相关的BAPI.
2、通过测试发现,比如:客户编号、物料编码等部分字段修改后保存,获利能力段会自动更新。通过调试发现,销售组、订单类别等字段,在修改保存后,往CE41000表插入数据时,根据配置去VBAK表取数时,界面上的值还没保存到VBAK表中,所以取的还是旧值,所以导致了修改后,获利力能力段没更新。有时候发现,点派生也不能更新,问题出在配置上面:
spro->控制->获利能力分析->主数据->特性特征派生。工具栏“显示所有步骤”。把特征值的属性设置为“如果发现新值,则用新值覆盖”。
3、在销售订单,获利能力段点派生时,会在CE41000_ACCT创建新的记录,但是,在CE41000中会根据获利能力段中所有的特征值,找是否已经存在记录,如果存在,则把CE41000-PAOBJNR的值更新到CE41000_ACCT-CE4KEY,不存在则新增加一条记录。
查找是否存在记录的SQL语句:
SELECT SINGLE * FROM CE41000 "#EC *WHERE AKTBO = X_S_CE4-AKTBO
*+OT1 AND %FELD = X_S_CE4-%FELDAND KNDNR = X_S_CE4-KNDNRAND ARTNR = X_S_CE4-ARTNRAND FKART = X_S_CE4-FKARTAND KAUFN = X_S_CE4-KAUFNAND KDPOS = X_S_CE4-KDPOSAND AUFNR = X_S_CE4-AUFNRAND BUKRS = X_S_CE4-BUKRSAND KOKRS = X_S_CE4-KOKRSAND WERKS = X_S_CE4-WERKSAND GSBER = X_S_CE4-GSBERAND VKORG = X_S_CE4-VKORGAND VTWEG = X_S_CE4-VTWEGAND SPART = X_S_CE4-SPARTAND PRCTR = X_S_CE4-PRCTRAND PPRCTR = X_S_CE4-PPRCTRAND KSTRG = X_S_CE4-KSTRGAND PSPNR = X_S_CE4-PSPNRAND MEINH = X_S_CE4-MEINHAND VKBUR = X_S_CE4-VKBURAND VKGRP = X_S_CE4-VKGRPAND BZIRK = X_S_CE4-BZIRKAND AUART = X_S_CE4-AUARTAND WW010 = X_S_CE4-WW010AND WW150 = X_S_CE4-WW150AND KMVTNR = X_S_CE4-KMVTNRAND MATKL = X_S_CE4-MATKLAND LAND1 = X_S_CE4-LAND1AND WW020 = X_S_CE4-WW020AND WW030 = X_S_CE4-WW030AND WW040 = X_S_CE4-WW040AND WW050 = X_S_CE4-WW050AND WW060 = X_S_CE4-WW060AND WW070 = X_S_CE4-WW070AND WW080 = X_S_CE4-WW080AND WW090 = X_S_CE4-WW090AND WW100 = X_S_CE4-WW100AND WW120 = X_S_CE4-WW120AND WW130 = X_S_CE4-WW130AND WW140 = X_S_CE4-WW140AND ZTEC = X_S_CE4-ZTECAND ZTYPE = X_S_CE4-ZTYPEAND VBELN = X_S_CE4-VBELNAND SAISJ = X_S_CE4-SAISJAND SAISO = X_S_CE4-SAISOAND COPA_KOSTL = X_S_CE4-COPA_KOSTLAND AUGRU = X_S_CE4-AUGRUAND GEBIE = X_S_CE4-GEBIEAND ABSMG_ME = X_S_CE4-ABSMG_MEAND VV100_ME = X_S_CE4-VV100_ME
4、后来网上找到了事务码KEND,可以创建批量更新任务,然后通过后台JOB运行。
操作步骤:
4.1、创建重新排列运行
4.2、新建请求
4.3、选择条件中设置查询条件
4.4、转换规则中,选择要更新的字段,返回到上一界面,然后保存
4.5、选中请求
2.6、运行/申请-》执行-》有起始时间。此任务一旦运行成功,将不能重复运行。
分析:KEND实际上后台运行的是:RKE_KENC_EXEC_CHGRUN这个程序。此程序的主要内容是根据选择条件,找到CE41000中满足条件的所有记录更新转换规则中设置的特征字段。