SAP ABAP 采购配额维护

63 篇文章 5 订阅
文章讲述了在处理业务数据时,如何替换BDC录屏方法,针对不同新增数据情况(不相干、部分相干、全相干),涉及到配额协议号的配置和EQUK结构的更新,包括获取新的配额编号并应用到不同场景中,以及记录修改历史的需求。
摘要由CSDN通过智能技术生成

原先使用的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没有数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gavin_gxh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值