SAP-材料价格维护

2.    程序说明
2.1    程序说明
周期行按物料和供应商维护铁配包底层材料的价格, 每维护一个周期, 自动截断上一个周期的截止日期.
2.2    程序实现
  



(1)	维护模式下, 需要按工厂锁定处理:

  IF G_MOD = 'U'.
    PERFORM FRM_LOCK_DATA USING P_WERKS CHANGING G_LOCK G_UNAM.
    IF G_LOCK = 'X'.
      MESSAGE S001(00) WITH P_WERKS '工厂的处理被用户' G_UNAM '锁定' DISPLAY LIKE 'E'.
      STOP.
    ENDIF.
  ENDIF.
(2)	取得符合条件的材料价格数据, 从ZTCLJ 到ITAB
  IF P_VALID = 'X'.
    SELECT *
    INTO TABLE ITAB
    FROM ZTCLJ
    WHERE WERKS = P_WERKS
      AND MATNR IN S_MATNR
      AND LIFNR IN S_LIFNR
      AND VALID = 'X'.
  ELSE.
    SELECT *
    INTO TABLE ITAB
    FROM ZTCLJ
    WHERE WERKS = P_WERKS
      AND MATNR IN S_MATNR
      AND LIFNR IN S_LIFNR.
  ENDIF.

(3)	将内表ZTAB输出到ALV
 


(4)	执行新增功能, 默认复制当前光标选择行的值到新增屏幕
    WHEN 'ADD'.
      IF ZTAB IS INITIAL.
        READ TABLE ZTAB INTO WA INDEX SELFIELD-TABINDEX.
        ZTAB-MATNR = WA-MATNR.
        ZTAB-LIFNR = WA-LIFNR.
      ENDIF.
      PERFORM FRM_ADD_DATA.
在输入新数据前, 要求先保存之前已经新增但还未保存的数据
  READ TABLE ZTAB WITH KEY NEW = 'X'.
  IF SY-SUBRC = 0.
    MESSAGE E001(00) WITH '存在新增的数据, 请先保存'.
  ENDIF.
调用函数POPUP_GET_VALUES弹出输入屏幕, 输入后取得新增的数据
期间截止日期默认为’99991231’.
  CALL FUNCTION 'POPUP_GET_VALUES'
    EXPORTING
      POPUP_TITLE     = '新增数据'
      START_COLUMN    = '90'
      START_ROW       = '5'
    IMPORTING
      RETURNCODE      = V_CODE
    TABLES
      FIELDS          = IT_SVAL[]
    EXCEPTIONS
      ERROR_IN_FIELDS = 1
      OTHERS          = 2.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
  IF V_CODE = ''.
    READ TABLE IT_SVAL WITH KEY FIELDNAME = 'MATNR'.
    CONDENSE IT_SVAL-VALUE.
    ZTAB-MATNR = IT_SVAL-VALUE.
    READ TABLE IT_SVAL WITH KEY FIELDNAME = 'LIFNR'.
    CONDENSE IT_SVAL-VALUE.
    ZTAB-LIFNR = IT_SVAL-VALUE.
    READ TABLE IT_SVAL WITH KEY FIELDNAME = 'DATAB'.
    CONDENSE IT_SVAL-VALUE.
    ZTAB-DATAB = IT_SVAL-VALUE.
    READ TABLE IT_SVAL WITH KEY FIELDNAME = 'DATBI'.
    CONDENSE IT_SVAL-VALUE.
    ZTAB-DATBI = IT_SVAL-VALUE.
判断输入日期的有效性, 以及输入的物料和供应商必须存在
判断输入的期间是否和之前相同主键记录存在重叠或被包含的情况
如果存在重叠则提示是否将之前的记录截断掉, 即把之前记录的截止日期更新为新记录开始日期的前一天;
如果存在包含的情况, 即历史记录完全包含在新记录的期间内, 则提示是否删除历史记录.
必须截断或删除历史记录, 新记录才能更新成功.
    DATA LTB LIKE TABLE OF ZTCLJ WITH HEADER LINE.
    SELECT *
    INTO TABLE LTB
    FROM ZTCLJ
    WHERE WERKS = P_WERKS
      AND MATNR = ZTAB-MATNR
      AND LIFNR = ZTAB-LIFNR
      AND DATAB >= ZTAB-DATAB.
    IF LTB[] IS NOT INITIAL.
      PERFORM FRM_POPUP_MESSAGE USING '新增数据' '存在完全被包含的有效期间,这些记录将被删除,是否继续?' '' CHANGING G_ANS.
      IF G_ANS = '1'.
        DELETE ZTCLJ FROM TABLE LTB.
        LOOP AT LTB.
          READ TABLE ZTAB INTO WA WITH KEY MATNR = LTB-MATNR LIFNR = LTB-LIFNR DATAB = LTB-DATAB DATBI = LTB-DATBI.
          IF SY-SUBRC = 0.
            DELETE ZTAB INDEX SY-TABIX.
            DELETE TMP INDEX SY-TABIX.
          ENDIF.
        ENDLOOP.
      ELSE.
        RETURN.
      ENDIF.
    ENDIF.
    REFRESH LTB.
    SELECT *
    INTO TABLE LTB
    FROM ZTCLJ
    WHERE WERKS = P_WERKS
      AND MATNR = ZTAB-MATNR
      AND LIFNR = ZTAB-LIFNR
      AND DATAB < ZTAB-DATAB
      AND DATBI >= ZTAB-DATAB.
    IF LTB[] IS NOT INITIAL.
      PERFORM FRM_POPUP_MESSAGE USING '新增数据' '存在重叠的有效期间,这些记录将被重新截止,是否继续?' '' CHANGING G_ANS.
      IF G_ANS = '1'.
        LOOP AT LTB.
          DELETE ZTCLJ FROM LTB.

          READ TABLE ZTAB INTO WA WITH KEY MATNR = LTB-MATNR LIFNR = LTB-LIFNR DATAB = LTB-DATAB DATBI = LTB-DATBI.
          IF SY-SUBRC = 0.
            WA-DATBI = ZTAB-DATAB - 1.
            TMP-DATBI = ZTAB-DATAB - 1.
            MODIFY ZTAB FROM WA INDEX SY-TABIX TRANSPORTING DATBI.
            MODIFY TMP INDEX SY-TABIX TRANSPORTING DATBI.
          ENDIF.

          LTB-DATBI = ZTAB-DATAB - 1.
          MODIFY LTB TRANSPORTING DATBI.
        ENDLOOP.
        MODIFY ZTCLJ FROM TABLE LTB.
      ELSE.
        RETURN.
      ENDIF.
    ENDIF.
将数据APPEND到ZTAB, NEW字段指定’X’表示为新增数据还未保存.
(5)	执行保存功能, 将ZTAB 与临时表TMP比较, 不同的记录则更新到ZTCLJ
保存成功后, 清除新增标记NEW=’’, 同时更新临时表TMP为最新的值
  LOOP AT ZTAB.
    CLEAR TMP.
    READ TABLE TMP INDEX SY-TABIX.
    CLEAR:TMP-CHECK,ZTAB-CHECK.
    IF TMP NE ZTAB.
      IF ZTAB-KPEIN = 0.
        MESSAGE E001(00) WITH '没有输入的价格单位'.
      ENDIF.
      MOVE-CORRESPONDING ZTAB TO LT_CLJ.
      LT_CLJ-AENAM = SY-UNAME.
      LT_CLJ-AEDAT = SY-DATUM.
      LT_CLJ-AEZIT = SY-UZEIT.
      APPEND LT_CLJ.
      CLEAR LT_CLJ.
    ENDIF.
    CLEAR ZTAB.
  ENDLOOP.
  MODIFY ZTCLJ FROM TABLE LT_CLJ.
  IF SY-SUBRC = 0.
    COMMIT WORK AND WAIT.
    MESSAGE S001(00) WITH '数据已保存'.
    ZTAB-NEW = ''.
    MODIFY ZTAB TRANSPORTING NEW WHERE NEW = 'X'.
    REFRESH TMP.
    TMP[] = ZTAB[].
  ELSE.
    ROLLBACK WORK.
    MESSAGE E001(00) WITH '数据保存失败'.
  ENDIF.

(6)	执行删除功能, 直接从ZTCLJ中删除选择的记录, 同步删除内表ZTAB 和TMP
对于选中的还未保存的新增记录, 则直接从ZTAB 中删除
  LOOP AT ZTAB WHERE CHECK = 'X'.
    IF ZTAB-NEW = 'X'.
*      DELETE ZTAB.
      CONTINUE.
    ENDIF.
    MOVE-CORRESPONDING ZTAB TO LT_CLJ.
    APPEND LT_CLJ.
    CLEAR LT_CLJ.
    CLEAR ZTAB.
  ENDLOOP.
  IF SY-SUBRC NE 0.
    MESSAGE E001(00) WITH '没有选择的行'.
  ENDIF.

  IF LT_CLJ[] IS NOT INITIAL.
    DELETE ZTCLJ FROM TABLE LT_CLJ.
    IF SY-SUBRC = 0.
      COMMIT WORK AND WAIT.
      LOOP AT ZTAB WHERE CHECK = 'X' AND NEW = ''.
        DELETE TMP INDEX SY-TABIX.
        CLEAR ZTAB.
      ENDLOOP.
      DELETE ZTAB WHERE CHECK = 'X'.
      MESSAGE S001(00) WITH '数据已被删除'.
    ELSE.
      ROLLBACK WORK.
      MESSAGE E001(00) WITH '数据删除失败'.
    ENDIF.
  ELSE.
    DELETE ZTAB WHERE CHECK = 'X'.
  ENDIF.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小啊曼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值