
原先使用的BDC录屏,发现实际使用过程中出现 equp行项目只进去部分的。
那就换一种方式 不用BDC录屏,
要考虑一下集中情形
* 1、原有数据20230101~20231231,新增 20220101-20221231 / 20240101-20241231 不相干不处理
* 2、原有数据20230101~20231231,新增 20220101-20231231 / 20231201-20241231 一半相干
把原先的一部分阶段,重合部分用新的替换
* 3、原有数据20230101~20231231,新增 20230301-20230531 / 20221201-20241231 全相干
分2种,a)新增的完全覆盖老的,则删除老的
b)新增的只是老的一部分 ,需要对老的分段处理。如果是3段,需要新增一段 新增一个协议号
配额协议号配置路径:spro- 物料管理-采购-配额安排-定义配额安排的编号范围
对象是 QUOTIERUNG ,用 NUMBER_GET_NEXT方法来获取一个新的
FUNCTION ZRFC_MM_QUOTA_BAPI.
*"----------------------------------------------------------------------
*"*"本地接口:
*" TABLES
*" XEQUK STRUCTURE EQUKU OPTIONAL
*" XEQUP STRUCTURE UEQUP OPTIONAL
*" YEQUK STRUCTURE EQUKU OPTIONAL
*" YEQUP STRUCTURE UEQUP OPTIONAL
*"----------------------------------------------------------------------
*--------------------------------------------------------------------*
*function:
*changer:
*note:要考虑如下几种情形
* 1、原有数据20230101~20231231,新增 20220101-20221231 / 20240101-20241231 不相干不处理
* 2、原有数据20230101~20231231,新增 20220101-20231231 / 20231201-20241231 一半相干
* 3、原有数据20230101~20231231,新增 20230301-20230531 / 20221201-20241231 全相干
*--------------------------------------------------------------------*
DATA:LDATE TYPE SY-DATUM.
DATA:LQUNUM LIKE EQUK-QUNUM.
DATA:TIMESTAMP LIKE EQUK-CHANGEDON.
GET TIME STAMP FIELD TIMESTAMP.
LOOP AT XEQUK INTO DATA(LSEQUK).
* 原有数据20230101~20231231 新增 20220101-20231031
IF LSEQUK-CHANGEDON IS INITIAL.
LSEQUK-CHANGEDON = TIMESTAMP.
MODIFY XEQUK FROM LSEQUK.
ENDIF.
SELECT * FROM EQUK INTO TABLE @DATA(LTEQUK)
WHERE EQUK~MATNR = @LSEQUK-MATNR AND EQUK~WERKS = @LSEQUK-WERKS
AND EQUK~BDATU > @LSEQUK-BDATU AND
EQUK~VDATU < @LSEQUK-BDATU AND
EQUK~VDATU > @LSEQUK-VDATU.
LOOP AT LTEQUK INTO DATA(LSEQUKO).
CLEAR LDATE.
PERFORM GETSPECIFICDATE(ZABAP_COMMON_PROGRAM) USING LSEQUK-BDATU 1 0 0 '+' CHANGING LDATE.
UPDATE EQUK SET VDATU = LDATE
WHERE EQUK~MATNR = LSEQUKO-MATNR AND EQUK~WERKS = LSEQUKO-WERKS AND BDATU = LSEQUKO-BDATU.
ENDLOOP.
* 原有数据20230101~20231231 新增 20231001-20241231
SELECT * FROM EQUK INTO TABLE @LTEQUK
WHERE EQUK~MATNR = @LSEQUK-MATNR AND EQUK~WERKS = @LSEQUK-WERKS
AND EQUK~BDATU < @LSEQUK-BDATU AND EQUK~VDATU < @LSEQUK-VDATU
AND EQUK~BDATU > @LSEQUK-VDATU.
LOOP AT LTEQUK INTO LSEQUKO.
CLEAR LDATE.
PERFORM GETSPECIFICDATE(ZABAP_COMMON_PROGRAM) USING LSEQUKO-BDATU 1 0 0 '-' CHANGING LDATE.
UPDATE EQUK SET BDATU = LDATE
WHERE EQUK~MATNR = LSEQUKO-MATNR AND EQUK~WERKS = LSEQUKO-WERKS AND BDATU = LSEQUKO-BDATU.
ENDLOOP.
* 3、原有数据20230101~20231231,新增 20230301-20230531 / 20221201-20241231 全相干
SELECT * FROM EQUK INTO TABLE @LTEQUK
WHERE EQUK~MATNR = @LSEQUK-MATNR AND EQUK~WERKS = @LSEQUK-WERKS
AND EQUK~BDATU >= @LSEQUK-BDATU AND EQUK~VDATU <= @LSEQUK-VDATU.
* 分段处理
LOOP AT LTEQUK INTO LSEQUKO.
CLEAR LDATE.
IF LSEQUKO-BDATU > LSEQUK-BDATU.
* 后半段
PERFORM GETSPECIFICDATE(ZABAP_COMMON_PROGRAM) USING LSEQUK-BDATU 1 0 0 '+' CHANGING LDATE.
UPDATE EQUK SET VDATU = LDATE
WHERE EQUK~MATNR = LSEQUKO-MATNR AND EQUK~WERKS = LSEQUKO-WERKS
AND QUNUM = LSEQUKO-QUNUM AND BDATU = LSEQUKO-BDATU.
ENDIF.
* 前半段
IF LSEQUKO-BDATU > LSEQUK-BDATU.
IF LSEQUKO-VDATU < LSEQUK-VDATU.
* 新增一个记录
SELECT * FROM EQUP WHERE QUNUM = @LSEQUKO-QUNUM INTO TABLE @DATA(LTEQUPO).
PERFORM GET_SNRO_NO(ZABAP_COMMON_PROGRAM) USING 'QUOTIERUNG' '01' CHANGING LQUNUM.
MOVE-CORRESPONDING LSEQUKO TO XEQUK.
XEQUK-QUNUM = LQUNUM.
PERFORM GETSPECIFICDATE(ZABAP_COMMON_PROGRAM) USING LSEQUK-VDATU 1 0 0 '-' CHANGING LDATE.
XEQUK-BDATU = LDATE.
XEQUK-KZ = 'I'.
LOOP AT LTEQUPO INTO DATA(LSEQUPO).
MOVE-CORRESPONDING LSEQUPO TO XEQUP.
XEQUP-QUNUM = LQUNUM.
XEQUP-KZ = 'I'.
APPEND XEQUP.
ENDLOOP.
APPEND XEQUK.
ELSEIF LSEQUKO-VDATU = LSEQUK-VDATU.
PERFORM GETSPECIFICDATE(ZABAP_COMMON_PROGRAM) USING LSEQUK-BDATU 1 0 0 '+' CHANGING LDATE.
UPDATE EQUK SET VDATU = LDATE
WHERE EQUK~MATNR = LSEQUKO-MATNR AND EQUK~WERKS = LSEQUKO-WERKS AND BDATU = LSEQUKO-BDATU.
ENDIF.
ENDIF.
ENDLOOP.
SELECT * FROM EQUK INTO TABLE @LTEQUK
WHERE EQUK~MATNR = @LSEQUK-MATNR AND EQUK~WERKS = @LSEQUK-WERKS
AND EQUK~BDATU <= @LSEQUK-BDATU AND EQUK~VDATU >= @LSEQUK-VDATU.
* 替换 删除老的
LOOP AT LTEQUK INTO LSEQUKO .
SELECT * INTO TABLE @DATA(LTEQUPD)
FROM EQUP WHERE EQUP~QUNUM = @LSEQUKO-QUNUM.
LOOP AT LTEQUPD INTO DATA(LSEQUPD).
MOVE-CORRESPONDING LSEQUPD TO YEQUP.
APPEND YEQUP .
ENDLOOP.
MOVE-CORRESPONDING LSEQUKO TO YEQUK.
APPEND YEQUK.
ENDLOOP.
ENDLOOP.
CALL FUNCTION 'ME_UPDATE_QUOTA'
TABLES
XEQUK = XEQUK
XEQUP = XEQUP
YEQUK = YEQUK
YEQUP = YEQUP.
ENDFUNCTION.
方法调用
REPORT ZTEST_GXH.
DATA:LQUNUM LIKE EQUK-QUNUM.
DATA:XEQUK LIKE TABLE OF EQUKU WITH HEADER LINE .
DATA:XEQUP LIKE TABLE OF EQUPU WITH HEADER LINE.
DATA:TIMESTAMP LIKE EQUK-CHANGEDON.
GET TIME STAMP FIELD TIMESTAMP.
PERFORM GET_SNRO_NO(ZABAP_COMMON_PROGRAM) USING 'QUOTIERUNG' '01' CHANGING LQUNUM.
XEQUK-MANDT = SY-MANDT.
XEQUK-MATNR = 'HYM103'.
XEQUK-WERKS = '1001'.
XEQUK-VDATU = '20240228'.
XEQUK-BDATU = '20240321'.
XEQUK-QUNUM = LQUNUM.
XEQUK-ERDAT = SY-DATUM.
XEQUK-ERNAM = SY-UNAME.
XEQUK-CHANGEDON = TIMESTAMP.
XEQUK-KZ = 'I'.
APPEND XEQUK.
XEQUP-KZ = 'I'.
XEQUP-MANDT = SY-MANDT.
XEQUP-QUNUM = LQUNUM.
XEQUP-QUPOS = '001'.
XEQUP-BESKZ = 'F'.
XEQUP-LIFNR = '0100002236'.
XEQUP-QUOTE = 60.
APPEND XEQUP.
XEQUP-KZ = 'I'.
XEQUP-MANDT = SY-MANDT.
XEQUP-QUNUM = LQUNUM.
XEQUP-QUPOS = '002'.
XEQUP-BESKZ = 'F'.
XEQUP-LIFNR = '0100002234'.
XEQUP-QUOTE = 90.
APPEND XEQUP.
CALL FUNCTION 'ZRFC_MM_QUOTA_BAPI'
TABLES
XEQUK = XEQUK
XEQUP = XEQUP.
WRITE :/ '采购配额'.
以上改是可以改了,缺修改记录。就是cdhdr cdpos没有数据

文章讲述了在处理业务数据时,如何替换BDC录屏方法,针对不同新增数据情况(不相干、部分相干、全相干),涉及到配额协议号的配置和EQUK结构的更新,包括获取新的配额编号并应用到不同场景中,以及记录修改历史的需求。
1万+

被折叠的 条评论
为什么被折叠?



