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.