*&---------------------------------------------------------------------*
*& Report ZMMR118
*&---------------------------------------------------------------------*
*& Author : NathanSun
*& Create Date : 2020-07-06
*& Program Type : Report
*& Description : 批量修改SO数量及交期
*&---------------------------------------------------------------------*
REPORT ZSDR016.
*&---------------------------------------------------------------------*
*& 包含 ZMMR118_TOP
*&---------------------------------------------------------------------*
TABLES:VBPA,VBAK,ZTGDTL.
TYPE-POOLS:SLIS,T001W,ICON.
DATA: LS_STYLE TYPE LVC_S_STYL,
LT_STYLE TYPE TABLE OF LVC_S_STYL.
"定义ALV输出所需变量
DATA: S_LAYOUT TYPE LVC_S_LAYO,
GT_FIELDCAT TYPE LVC_T_FCAT,
IS_VARIANT TYPE DISVARIANT.
DATA: G_TITLE_0200 TYPE STRING,
LV_SUM TYPE STRING,
LV_POSNR TYPE VBAP-POSNR,
G_INDEX TYPE SY-INDEX.
DATA GOODSMVT_HEADER LIKE BAPI2017_GM_HEAD_01 .
DATA GOODSMVT_CODE LIKE BAPI2017_GM_CODE .
DATA GOODSMVT_HEADRET LIKE BAPI2017_GM_HEAD_RET .
DATA MATERIALDOCUMENT LIKE BAPI2017_GM_HEAD_RET-MAT_DOC .
DATA MATDOCUMENTYEAR LIKE BAPI2017_GM_HEAD_RET-DOC_YEAR .
DATA GOODSMVT_ITEM LIKE BAPI2017_GM_ITEM_CREATE OCCURS 0 WITH HEADER LINE.
DATA RETURN LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE.
DATA GT_EXDATA TYPE ALSMEX_TABLINE OCCURS 0 WITH HEADER LINE.
DATA IW_CELLCOLOR TYPE LVC_T_SCOL WITH HEADER LINE.
DATA L_FILENAME TYPE STRING .
DATA L_MUBAN TYPE STRING .
DATA GV_FULLPATH TYPE STRING .
DATA GV_PATH TYPE STRING .
DATA GV_NAME TYPE STRING .
DATA:FLAG TYPE C .
DATA:FLAG1 TYPE C .
DATA:I_EVENTS TYPE SLIS_T_EVENT.
DATA:W_EVENTS LIKE LINE OF I_EVENTS.
DATA REF_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA OK_CODE TYPE SY-UCOMM.
DATA OK_SAVE TYPE SY-UCOMM.
TYPES: BEGIN OF GTS_DATA,
CKBOX TYPE C, "选择列
UPDATE TYPE C, "更新类型
POSNR_CF TYPE VBAP-POSNR, "拆分项目号
VBELN TYPE VBAK-VBELN, "销售单号
AUDAT TYPE VBAK-AUDAT, "凭证日期
AUART TYPE VBAK-AUART, "销售凭证类型
VKORG TYPE VBAK-VKORG, "销售组织
KUNNR TYPE VBAK-KUNNR, "售达方
POSNR TYPE VBAP-POSNR, "项目号
CF TYPE CHAR4, "拆分
WERKS TYPE VBAP-WERKS, "工厂
MATNR TYPE VBAP-MATNR, "物料编号
MAKTX TYPE MAKT-MAKTX, "物料描述
KWMENG TYPE VBAP-KWMENG, "数量
VRKME TYPE VBAP-VRKME, "单位
EDATU TYPE VBEP-EDATU, "交货日期
ETENR TYPE VBEP-ETENR, "计划行
ZDAT_YS TYPE VBAP-ZDAT_YS, "原始订单要求交期
ZDAT_HF TYPE VBAP-ZDAT_HF, "回复客户交期
ZDAT_KH TYPE VBAP-ZDAT_KH, "客户订单的到达日期
MESSAGE TYPE BAPI_MSG, "报错信息
CELLCOLOR TYPE LVC_T_SCOL, "单元格颜色
STYLE TYPE LVC_T_STYL, "控制不可编辑
END OF GTS_DATA.
TYPES: BEGIN OF GTS_ZAUFNR,
ZAUFNR TYPE ZTGDTL-ZAUFNR, "退料单号
AUFNR TYPE AFKO-AUFNR, "工单
END OF GTS_ZAUFNR.
TYPES: BEGIN OF GTS_SUB,
POSNR_CF TYPE VBAP-POSNR, "拆分项目号
KWMENG TYPE VBAP-KWMENG, "数量
EDATU TYPE VBEP-EDATU, "交货日期
ZDAT_YS TYPE VBAP-ZDAT_YS, "原始订单要求交期
ZDAT_HF TYPE VBAP-ZDAT_HF, "回复客户交期
ZDAT_KH TYPE VBAP-ZDAT_KH, "客户订单的到达日期
END OF GTS_SUB.
DATA: GT_SUB TYPE TABLE OF GTS_SUB WITH HEADER LINE.
DATA: GT_ZAUFNR TYPE TABLE OF GTS_ZAUFNR WITH HEADER LINE.
DATA: GT_DATA TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATA: GT_DATA_A TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATA: GT_SAVE TYPE TABLE OF ZTGDTL WITH HEADER LINE.
DATA: JEST TYPE TABLE OF JEST WITH HEADER LINE.
DATA: MESSAGE TYPE BAPI_MSG. "报错信息.
DATA: GT_HEAD TYPE TABLE OF ZTS_TLDATA_HEAD WITH HEADER LINE.
DATA: GT_ITEM TYPE TABLE OF ZTS_TLDATA_ITEM WITH HEADER LINE.
*&SPWIZARD: DECLARATION OF TABLECONTROL 'TAB_01' ITSELF
CONTROLS: TAB_01 TYPE TABLEVIEW USING SCREEN 0100.
*&SPWIZARD: LINES OF TABLECONTROL 'TAB_01'
DATA: G_TAB_01_LINES LIKE SY-LOOPC.
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
SELECT-OPTIONS S_KUNNR FOR VBPA-KUNNR MODIF ID MXY ."客户(售达方)
SELECT-OPTIONS S_AUDAT FOR VBAK-AUDAT MODIF ID MXZ ."凭证日期
SELECT-OPTIONS S_VBELN FOR VBAK-VBELN MODIF ID MXY ."销售单号
SELECT-OPTIONS S_VKORG FOR VBAK-VKORG MODIF ID MXY ."销售组织
SELECT-OPTIONS S_AUART FOR VBAK-AUART MODIF ID MXY ."订单类型
SELECTION-SCREEN END OF BLOCK B1.
INITIALIZATION.
CLEAR S_AUDAT[].
S_AUDAT-LOW = SY-DATUM(6) && '01'.
S_AUDAT-HIGH = '99991231'.
APPEND S_AUDAT.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN .
IF SCREEN-GROUP1 = 'MXZ'. "
SCREEN-INPUT = '0'.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
*&---------------------------------------------------------------------*
*& 包含 ZMMR118_CLASS
*&---------------------------------------------------------------------*
*CLASS LCL_EVENT_RECEIVER DEFINITION DEFERRED.
CLASS LCL_EVENT_RECEIVER DEFINITION.
PUBLIC SECTION.
DATA: UCOMM TYPE SY-UCOMM.
METHODS HANDLE_DATA_CHANGED
FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
IMPORTING ER_DATA_CHANGED.
METHODS:HANDLE_BUTTON_CLICK
FOR EVENT BUTTON_CLICK OF CL_GUI_ALV_GRID
IMPORTING ES_ROW_NO.
PRIVATE SECTION.
ENDCLASS. "lcl_event_receiver DEFINITION
DATA: EVENT_RECEIVER TYPE REF TO LCL_EVENT_RECEIVER.
CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.
METHOD HANDLE_DATA_CHANGED.
ENDMETHOD. "handle_data_changed
METHOD HANDLE_BUTTON_CLICK.
CLEAR:G_INDEX.
G_INDEX = ES_ROW_NO-ROW_ID.
READ TABLE GT_DATA[] INTO GT_DATA INDEX ES_ROW_NO-ROW_ID.
CLEAR: GT_SUB[],GT_SUB .
CLEAR LV_POSNR.
SELECT MAX( POSNR ) INTO LV_POSNR FROM VBAP
WHERE VBELN = GT_DATA-VBELN
.
GT_DATA_A[] = GT_DATA[].
DELETE GT_DATA_A[] WHERE VBELN <> GT_DATA-VBELN.
SORT GT_DATA_A[] BY VBELN POSNR_CF DESCENDING.
READ TABLE GT_DATA_A[] INTO GT_DATA_A INDEX 1.
IF LV_POSNR < GT_DATA_A-POSNR_CF.
LV_POSNR = GT_DATA_A-POSNR_CF .
ENDIF.
GT_SUB-POSNR_CF = LV_POSNR + 10.
GT_SUB-KWMENG = GT_DATA-KWMENG.
GT_SUB-EDATU = GT_DATA-EDATU.
GT_SUB-ZDAT_YS = GT_DATA-ZDAT_YS.
GT_SUB-ZDAT_HF = GT_DATA-ZDAT_HF.
GT_SUB-ZDAT_KH = GT_DATA-ZDAT_KH.
APPEND GT_SUB TO GT_SUB[].
CLEAR: GT_SUB .
* GT_SUB-MEINS = GT_DATA-MEINS.
DO 30 TIMES.
APPEND GT_SUB TO GT_SUB[].
ENDDO.
LV_SUM = GT_DATA-KWMENG .
CALL SCREEN 0100 STARTING AT 50 3.
PERFORM FRM_REF_ALV.
ENDMETHOD.
ENDCLASS. "lcl_event_receiver IMPLEMENTATION
*&---------------------------------------------------------------------*
*& 包含 ZMMR118_FORM
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form SCREEN_SETTING
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM SCREEN_SETTING .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_GETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FOM_GETDATA .
DATA: LS_STYLE TYPE LVC_S_STYL,
LT_STYLE TYPE TABLE OF LVC_S_STYL.
CLEAR GT_DATA[] .
SELECT
VBAK~VBELN
VBAK~AUDAT
VBAK~AUART
VBAK~VKORG
VBAK~KUNNR
VBAP~POSNR
VBAP~WERKS
VBAP~MATNR
VBAP~KWMENG
VBAP~ZIEME
VBAP~ZDAT_YS
VBAP~ZDAT_HF
VBAP~ZDAT_KH
VBEP~EDATU
VBEP~ETENR
INTO CORRESPONDING FIELDS OF TABLE GT_DATA[]
FROM VBAP
INNER JOIN VBEP ON VBAP~VBELN = VBEP~VBELN AND VBAP~POSNR = VBEP~POSNR
INNER JOIN VBAK ON VBAP~VBELN = VBAK~VBELN
WHERE VBAK~VBELN IN S_VBELN
AND VBAK~KUNNR IN S_KUNNR
AND VBAK~AUDAT IN S_AUDAT
AND VBAK~VKORG IN S_VKORG
AND VBAK~AUART IN S_AUART
.
SORT GT_DATA[] BY VBELN POSNR ETENR.
DELETE ADJACENT DUPLICATES FROM GT_DATA[] COMPARING VBELN POSNR.
LOOP AT GT_DATA.
SELECT SINGLE MAKTX INTO GT_DATA-MAKTX FROM MAKT
WHERE MATNR = GT_DATA-MATNR
.
CLEAR LT_STYLE[] .
GT_DATA-UPDATE = 'U'.
GT_DATA-CF = '@4N@'.
CLEAR LT_STYLE[] .
LS_STYLE-FIELDNAME = 'CF'.
LS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
APPEND LS_STYLE TO LT_STYLE.
GT_DATA-STYLE = LT_STYLE.
LS_STYLE-FIELDNAME = 'POSNR_CF'.
LS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND LS_STYLE TO LT_STYLE.
GT_DATA-STYLE = LT_STYLE.
MODIFY GT_DATA .
MODIFY GT_DATA .
CLEAR GT_DATA .
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY .
CLEAR S_LAYOUT.
S_LAYOUT-ZEBRA = 'X'.
* S_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
S_LAYOUT-CTAB_FNAME = 'CELLCOLOR'. "单元格颜色内表字段
S_LAYOUT-STYLEFNAME = 'STYLE'. "内部表字段的字段名称
* s_layout-box_fieldname = 'BOX'.
PERFORM FRM_FILL_FIELD .
W_EVENTS-NAME = 'CALLER_EXIT'. "slis_ev_caller_exit_at_start事件
W_EVENTS-FORM = 'FM_BUTTON'.
APPEND W_EVENTS TO I_EVENTS .
CLEAR IS_VARIANT .
IS_VARIANT-REPORT = SY-REPID.
IS_VARIANT-HANDLE = '1'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_SAVE = 'A'
IS_VARIANT = IS_VARIANT
IS_LAYOUT_LVC = S_LAYOUT
IT_FIELDCAT_LVC = GT_FIELDCAT
I_CALLBACK_PROGRAM = SY-REPID
IT_EVENTS = I_EVENTS
I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'
* i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE'
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
TABLES
T_OUTTAB = GT_DATA[].
ENDFORM.
*&---------------------------------------------------------------------*
*& Form fm_button
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->E_GRID text
*----------------------------------------------------------------------*
FORM FM_BUTTON USING E_GRID TYPE SLIS_DATA_CALLER_EXIT.
* DATA: l_ref_alv TYPE REF TO cl_gui_alv_grid.
* IF ref_grid IS INITIAL.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = REF_GRID.
* ENDIF.
** 设置回车事件
* CALL METHOD ref_grid->register_edit_event
* EXPORTING
* i_event_id = cl_gui_alv_grid=>mc_evt_enter
* EXCEPTIONS
* error = 1
* OTHERS = 2.
* 设置光标焦点移开被修改单元格后触发事件
CALL METHOD REF_GRID->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED
EXCEPTIONS
ERROR = 1
OTHERS = 2.
* CALL METHOD ref_grid->register_edit_event
* EXPORTING
* i_event_id = cl_gui_alv_grid=>mc_evt_modified
* EXCEPTIONS
* error = 1
* OTHERS = 2.
CREATE OBJECT EVENT_RECEIVER.
SET HANDLER EVENT_RECEIVER->HANDLE_DATA_CHANGED FOR REF_GRID.
SET HANDLER EVENT_RECEIVER->HANDLE_BUTTON_CLICK FOR REF_GRID.
ENDFORM. "fm_button
FORM FRM_FILL_FIELD .
DATA: WA_FIELDCAT TYPE LINE OF LVC_T_FCAT.
DEFINE FILL_FIELD.
WA_FIELDCAT-FIELDNAME = &1.
WA_FIELDCAT-COLTEXT = &2.
IF WA_FIELDCAT-FIELDNAME = 'CKBOX' .
WA_FIELDCAT-CHECKBOX = 'X'.
WA_FIELDCAT-EDIT = 'X'.
ENDIF.
IF WA_FIELDCAT-FIELDNAME = 'MATNR' .
WA_FIELDCAT-REF_TABLE = 'VBAP'.
WA_FIELDCAT-REF_FIELD = 'MATNR'.
ENDIF.
IF WA_FIELDCAT-FIELDNAME = 'KUNNR'
.
WA_FIELDCAT-REF_TABLE = 'VBAK'.
WA_FIELDCAT-REF_FIELD = 'KUNNR'.
* WA_FIELDCAT-EDIT = 'X'.
ENDIF.
IF WA_FIELDCAT-FIELDNAME = 'MAKTX'
OR WA_FIELDCAT-FIELDNAME = 'MAKTX_S'
.
WA_FIELDCAT-REF_TABLE = 'MAKT'.
WA_FIELDCAT-REF_FIELD = 'MAKTX'.
ENDIF .
IF WA_FIELDCAT-FIELDNAME = 'CF'.
WA_FIELDCAT-ICON = 'X'.
WA_FIELDCAT-OUTPUTLEN = '13'.
ENDIF.
IF WA_FIELDCAT-FIELDNAME = 'KWMENG'
.
WA_FIELDCAT-REF_TABLE = 'VBAP'.
WA_FIELDCAT-REF_FIELD = 'KWMENG'.
ENDIF .
IF WA_FIELDCAT-FIELDNAME = 'KWMENG'
OR WA_FIELDCAT-FIELDNAME = 'EDATU'
OR WA_FIELDCAT-FIELDNAME = 'ZDAT_YS'
OR WA_FIELDCAT-FIELDNAME = 'ZDAT_HF'
OR WA_FIELDCAT-FIELDNAME = 'ZDAT_KH'
OR WA_FIELDCAT-FIELDNAME = 'POSNR_CF'
.
WA_FIELDCAT-EDIT = 'X'.
ENDIF .
IF WA_FIELDCAT-FIELDNAME = 'EDATU'
OR WA_FIELDCAT-FIELDNAME = 'ZDAT_YS'
OR WA_FIELDCAT-FIELDNAME = 'ZDAT_HF'
OR WA_FIELDCAT-FIELDNAME = 'ZDAT_KH'
OR WA_FIELDCAT-FIELDNAME = 'AUDAT'
.
WA_FIELDCAT-REF_TABLE = 'VBAK'.
WA_FIELDCAT-REF_FIELD = 'AUDAT'.
WA_FIELDCAT-F4AVAILABL = 'X'.
ENDIF.
IF WA_FIELDCAT-FIELDNAME = 'MESSAGE'.
WA_FIELDCAT-OUTPUTLEN = '80'.
ENDIF.
APPEND WA_FIELDCAT TO GT_FIELDCAT.
CLEAR WA_FIELDCAT.
END-OF-DEFINITION.
FILL_FIELD :
'CKBOX' '选择列',
'POSNR_CF' '拆分行号',
'UPDATE' '更新类型',
'VBELN' '销售单号',
'AUDAT' '凭证日期',
'AUART' '销售凭证类型',
'VKORG' '销售组织',
'KUNNR' '售达方',
'POSNR' '项目号',
* 'ETENR' '计划行',
'CF' '项目拆分',
'MATNR' '物料编号',
'MAKTX' '物料描述',
'KWMENG' '数量',
'ZIEME' '单位',
'EDATU' '交货日期',
'ZDAT_YS' '原始订单要求交期',
'ZDAT_HF' '回复客户交期',
'ZDAT_KH' '客户订单的到达日期',
'MESSAGE' '消息'.
ENDFORM.
FORM PF_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.
SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM.
FORM USER_COMMAND USING I_UCOMM LIKE SY-UCOMM
IS_SELFIELD TYPE SLIS_SELFIELD.
DATA: REF TYPE REF TO CL_GUI_ALV_GRID.
DATA : LV_STABLE TYPE LVC_S_STBL. "刷新稳定性
RANGES: L_WERKS FOR T001W-WERKS.
RANGES: L_MATNR FOR MARA-MATNR.
DATA: L_BUKRS TYPE T001K-BUKRS.
DATA: NEXTNO TYPE CHAR10.
DATA: ZRSPOS TYPE ZTGDTL-ZRSPOS .
DATA: LV_OBJNR TYPE JEST-OBJNR.
DATA: STTXT TYPE STTXT.
DATA: GT_JSTO TYPE TABLE OF JSTO WITH HEADER LINE.
DATA: GT_JEST TYPE TABLE OF JEST WITH HEADER LINE.
DATA: GT_TJ30 TYPE TABLE OF TJ30 WITH HEADER LINE.
DATA: GT_TJ30T TYPE TABLE OF TJ30T WITH HEADER LINE.
DATA: FLAG TYPE C.
LV_STABLE-ROW = '1'.
LV_STABLE-COL = '1'.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = REF.
CALL METHOD REF->CHECK_CHANGED_DATA.
CASE I_UCOMM.
WHEN 'ALL'.
LOOP AT GT_DATA.
GT_DATA-CKBOX = 'X'.
MODIFY GT_DATA.
CLEAR GT_DATA.
ENDLOOP.
WHEN 'SAL'.
LOOP AT GT_DATA.
CLEAR GT_DATA-CKBOX .
MODIFY GT_DATA.
CLEAR GT_DATA.
ENDLOOP.
WHEN 'ZSAVE'.
PERFORM FOM_CHANGE .
WHEN 'PRINT'.
ENDCASE.
CALL METHOD REF->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LV_STABLE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SPLIT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_SPLIT .
DATA: LV_SUM01 TYPE MSEG-MENGE.
DATA: FLAG01 TYPE C.
DATA: FLAG02 TYPE C.
CLEAR LV_SUM01 .
CLEAR FLAG01 .
CLEAR FLAG02 .
LOOP AT GT_SUB WHERE POSNR_CF IS NOT INITIAL .
LV_SUM01 = LV_SUM01 + GT_SUB-KWMENG .
IF GT_SUB-POSNR_CF IS INITIAL.
FLAG01 = 'X'.
ENDIF.
IF GT_SUB-EDATU IS INITIAL.
FLAG02 = 'X'.
ENDIF.
CLEAR GT_SUB .
ENDLOOP.
IF LV_SUM01 > LV_SUM.
MESSAGE '累计的拆分数量不可大于项目总量!'TYPE 'S' DISPLAY LIKE 'E'.
ELSEIF FLAG01 IS NOT INITIAL .
MESSAGE '拆分项目号不可为空!'TYPE 'S' DISPLAY LIKE 'E'.
ELSEIF FLAG02 IS NOT INITIAL .
MESSAGE '交货日期不可为空!'TYPE 'S' DISPLAY LIKE 'E'.
ELSE .
DATA(L_INDEX) = G_INDEX.
LOOP AT GT_SUB WHERE POSNR_CF IS NOT INITIAL.
GT_DATA-POSNR_CF = GT_SUB-POSNR_CF.
GT_DATA-KWMENG = GT_SUB-KWMENG.
GT_DATA-EDATU = GT_SUB-EDATU.
GT_DATA-ZDAT_YS = GT_SUB-ZDAT_YS.
GT_DATA-ZDAT_HF = GT_SUB-ZDAT_HF.
GT_DATA-ZDAT_KH = GT_SUB-ZDAT_KH.
GT_DATA-UPDATE = 'I'.
CLEAR GT_DATA-STYLE .
CLEAR GT_DATA-CF .
* LOOP AT GT_DATA-STYLE INTO LS_STYLE WHERE FIELDNAME = 'POSNR_CF'..
* DELETE GT_DATA-STYLE FROM LS_STYLE .
* CLEAR LS_STYLE.
* ENDLOOP.
* IF L_INDEX = G_INDEX.
* MODIFY GT_DATA INDEX L_INDEX.
* ELSE.
INSERT GT_DATA INDEX L_INDEX.
* ENDIF.
L_INDEX = L_INDEX + 1.
ENDLOOP.
LEAVE TO SCREEN 0.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_CHANGE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FOM_CHANGE .
DATA: LV_VBAP TYPE VBAP.
DATA: SALESDOCUMENT LIKE BAPIVBELN-VBELN,
ORDER_HEADER_IN LIKE BAPISDH1,
ORDER_HEADER_INX LIKE BAPISDH1X,
ORDER_ITEM_IN LIKE BAPISDITM OCCURS 0 WITH HEADER LINE,
ORDER_ITEM_INX LIKE BAPISDITMX OCCURS 0 WITH HEADER LINE,
RETURN1 LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE,
CONDITIONS_IN LIKE BAPICOND OCCURS 0 WITH HEADER LINE,
CONDITIONS_INX LIKE BAPICONDX OCCURS 0 WITH HEADER LINE,
SCHEDULE_LINES LIKE BAPISCHDL OCCURS 0 WITH HEADER LINE,
SCHEDULE_LINESX LIKE BAPISCHDLX OCCURS 0 WITH HEADER LINE.
LOOP AT GT_DATA WHERE CKBOX IS NOT INITIAL.
CLEAR:ORDER_HEADER_INX,ORDER_ITEM_IN,ORDER_ITEM_INX,SCHEDULE_LINES,SCHEDULE_LINESX,CONDITIONS_IN,CONDITIONS_INX,LV_VBAP,
ORDER_ITEM_IN[],ORDER_ITEM_INX[],SCHEDULE_LINES[],SCHEDULE_LINESX[],RETURN1[],CONDITIONS_IN[],CONDITIONS_INX[].
IF GT_DATA-UPDATE = 'U'.
ORDER_HEADER_INX-UPDATEFLAG = 'U'.
ORDER_ITEM_IN-ITM_NUMBER = GT_DATA-POSNR.
APPEND ORDER_ITEM_IN.
ORDER_ITEM_INX-ITM_NUMBER = GT_DATA-POSNR.
ORDER_ITEM_INX-UPDATEFLAG = 'U'.
APPEND ORDER_ITEM_INX.
SCHEDULE_LINES-ITM_NUMBER = GT_DATA-POSNR.
SCHEDULE_LINES-SCHED_LINE = GT_DATA-ETENR.
SCHEDULE_LINES-REQ_QTY = GT_DATA-KWMENG. "4. "数量
SCHEDULE_LINES-REQ_DATE = GT_DATA-EDATU. "4. "交期
APPEND SCHEDULE_LINES.
SCHEDULE_LINESX-ITM_NUMBER = GT_DATA-POSNR.
SCHEDULE_LINESX-SCHED_LINE = GT_DATA-ETENR.
SCHEDULE_LINESX-UPDATEFLAG = 'U'.
SCHEDULE_LINESX-REQ_QTY = 'X'.
SCHEDULE_LINESX-REQ_DATE = 'X'.
APPEND SCHEDULE_LINESX.
LV_VBAP-VBELN = GT_DATA-VBELN .
LV_VBAP-POSNR = GT_DATA-POSNR .
ELSEIF GT_DATA-UPDATE = 'I'.
ORDER_HEADER_INX-UPDATEFLAG = 'U'.
ORDER_ITEM_IN-ITM_NUMBER = GT_DATA-POSNR_CF.
ORDER_ITEM_IN-MATERIAL_LONG = GT_DATA-MATNR.
ORDER_ITEM_IN-PLANT = GT_DATA-WERKS.
APPEND ORDER_ITEM_IN.
ORDER_ITEM_INX-ITM_NUMBER = GT_DATA-POSNR_CF.
ORDER_ITEM_INX-UPDATEFLAG = 'I'.
ORDER_ITEM_INX-MATERIAL_LONG = 'X'.
ORDER_ITEM_INX-PLANT = 'X'.
APPEND ORDER_ITEM_INX.
SCHEDULE_LINES-ITM_NUMBER = GT_DATA-POSNR_CF.
SCHEDULE_LINES-SCHED_LINE = 1.
SCHEDULE_LINES-REQ_QTY = GT_DATA-KWMENG. "4. "数量
SCHEDULE_LINES-REQ_DATE = GT_DATA-EDATU. "4. "交期
APPEND SCHEDULE_LINES.
SCHEDULE_LINESX-ITM_NUMBER = GT_DATA-POSNR_CF.
SCHEDULE_LINESX-SCHED_LINE = 1.
SCHEDULE_LINESX-UPDATEFLAG = 'I'.
SCHEDULE_LINESX-REQ_QTY = 'X'.
SCHEDULE_LINESX-REQ_DATE = 'X'.
APPEND SCHEDULE_LINESX.
CONDITIONS_IN-ITM_NUMBER = GT_DATA-POSNR_CF. "itm_number
CONDITIONS_IN-COND_UNIT = GT_DATA-VRKME. "条件单位
APPEND CONDITIONS_IN.
CONDITIONS_INX-ITM_NUMBER = GT_DATA-POSNR_CF.
CONDITIONS_INX-UPDATEFLAG = 'U'.
CONDITIONS_INX-COND_UNIT = 'X'.
APPEND CONDITIONS_INX.
LV_VBAP-VBELN = GT_DATA-VBELN .
LV_VBAP-POSNR = GT_DATA-POSNR_CF .
ENDIF.
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
EXPORTING
SALESDOCUMENT = GT_DATA-VBELN
ORDER_HEADER_INX = ORDER_HEADER_INX
TABLES
RETURN = RETURN1
ORDER_ITEM_IN = ORDER_ITEM_IN
ORDER_ITEM_INX = ORDER_ITEM_INX
SCHEDULE_LINES = SCHEDULE_LINES
SCHEDULE_LINESX = SCHEDULE_LINESX
CONDITIONS_IN = CONDITIONS_IN
CONDITIONS_INX = CONDITIONS_INX.
LOOP AT RETURN1 WHERE TYPE = 'E' OR TYPE = 'I' .
GT_DATA-MESSAGE = GT_DATA-MESSAGE && RETURN1-MESSAGE .
ENDLOOP.
IF SY-SUBRC = '0'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
GT_DATA-MESSAGE = '修改成功!'.
ENDIF.
UPDATE VBAP SET ZDAT_YS = GT_DATA-ZDAT_YS "增强字段修改
ZDAT_HF = GT_DATA-ZDAT_HF
ZDAT_KH = GT_DATA-ZDAT_KH
WHERE VBELN = LV_VBAP-VBELN
AND POSNR = LV_VBAP-POSNR
.
MODIFY GT_DATA TRANSPORTING MESSAGE.
CLEAR GT_DATA.
ENDLOOP.
IF SY-SUBRC <> 0.
MESSAGE '请选择条目!'TYPE 'S' DISPLAY LIKE 'W'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_REF_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_REF_ALV .
DATA LS_STBL TYPE LVC_S_STBL.
IF REF_GRID IS INITIAL.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = REF_GRID.
ENDIF.
LS_STBL-ROW = ABAP_TRUE.
LS_STBL-COL = ABAP_TRUE.
* CALL METHOD ref_grid->check_changed_data.
CALL METHOD REF_GRID->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LS_STBL.
ENDFORM.
*----------------------------------------------------------------------*
* INCLUDE TABLECONTROL_FORMS *
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form USER_OK_TC *
*&---------------------------------------------------------------------*
FORM USER_OK_TC USING P_TC_NAME TYPE DYNFNAM
P_TABLE_NAME
P_MARK_NAME
CHANGING P_OK LIKE SY-UCOMM.
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
DATA: L_OK TYPE SY-UCOMM,
L_OFFSET TYPE I.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
*&SPWIZARD: Table control specific operations *
*&SPWIZARD: evaluate TC name and operations *
SEARCH P_OK FOR P_TC_NAME.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
L_OFFSET = STRLEN( P_TC_NAME ) + 1.
L_OK = P_OK+L_OFFSET.
*&SPWIZARD: execute general and TC specific operations *
CASE L_OK.
WHEN 'INSR'. "insert row
PERFORM FCODE_INSERT_ROW USING P_TC_NAME
P_TABLE_NAME.
CLEAR P_OK.
WHEN 'DELE'. "delete row
PERFORM FCODE_DELETE_ROW USING P_TC_NAME
P_TABLE_NAME
P_MARK_NAME.
CLEAR P_OK.
WHEN 'P--' OR "top of list
'P-' OR "previous page
'P+' OR "next page
'P++'. "bottom of list
PERFORM COMPUTE_SCROLLING_IN_TC USING P_TC_NAME
L_OK.
CLEAR P_OK.
* WHEN 'L--'. "total left
* PERFORM FCODE_TOTAL_LEFT USING P_TC_NAME.
*
* WHEN 'L-'. "column left
* PERFORM FCODE_COLUMN_LEFT USING P_TC_NAME.
*
* WHEN 'R+'. "column right
* PERFORM FCODE_COLUMN_RIGHT USING P_TC_NAME.
*
* WHEN 'R++'. "total right
* PERFORM FCODE_TOTAL_RIGHT USING P_TC_NAME.
*
WHEN 'MARK'. "mark all filled lines
PERFORM FCODE_TC_MARK_LINES USING P_TC_NAME
P_TABLE_NAME
P_MARK_NAME .
CLEAR P_OK.
WHEN 'DMRK'. "demark all filled lines
PERFORM FCODE_TC_DEMARK_LINES USING P_TC_NAME
P_TABLE_NAME
P_MARK_NAME .
CLEAR P_OK.
* WHEN 'SASCEND' OR
* 'SDESCEND'. "sort column
* PERFORM FCODE_SORT_TC USING P_TC_NAME
* l_ok.
ENDCASE.
ENDFORM. " USER_OK_TC
*&---------------------------------------------------------------------*
*& Form FCODE_INSERT_ROW *
*&---------------------------------------------------------------------*
FORM FCODE_INSERT_ROW
USING P_TC_NAME TYPE DYNFNAM
P_TABLE_NAME .
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
DATA L_LINES_NAME LIKE FELD-NAME.
DATA L_SELLINE LIKE SY-STEPL.
DATA L_LASTLINE TYPE I.
DATA L_LINE TYPE I.
DATA L_TABLE_NAME LIKE FELD-NAME.
FIELD-SYMBOLS <TC> TYPE CXTAB_CONTROL.
FIELD-SYMBOLS <TABLE> TYPE STANDARD TABLE.
FIELD-SYMBOLS <LINES> TYPE I.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
ASSIGN (P_TC_NAME) TO <TC>.
*&SPWIZARD: get the table, which belongs to the tc *
CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME. "table body
ASSIGN (L_TABLE_NAME) TO <TABLE>. "not headerline
*&SPWIZARD: get looplines of TableControl *
CONCATENATE 'G_' P_TC_NAME '_LINES' INTO L_LINES_NAME.
ASSIGN (L_LINES_NAME) TO <LINES>.
*&SPWIZARD: get current line *
GET CURSOR LINE L_SELLINE.
IF SY-SUBRC <> 0. " append line to table
L_SELLINE = <TC>-LINES + 1.
*&SPWIZARD: set top line *
IF L_SELLINE > <LINES>.
<TC>-TOP_LINE = L_SELLINE - <LINES> + 1 .
ELSE.
<TC>-TOP_LINE = 1.
ENDIF.
ELSE. " insert line into table
L_SELLINE = <TC>-TOP_LINE + L_SELLINE - 1.
L_LASTLINE = <TC>-TOP_LINE + <LINES> - 1.
ENDIF.
*&SPWIZARD: set new cursor line *
L_LINE = L_SELLINE - <TC>-TOP_LINE + 1.
*&SPWIZARD: insert initial line *
INSERT INITIAL LINE INTO <TABLE> INDEX L_SELLINE.
<TC>-LINES = <TC>-LINES + 1.
*&SPWIZARD: set cursor *
SET CURSOR LINE L_LINE.
ENDFORM. " FCODE_INSERT_ROW
*&---------------------------------------------------------------------*
*& Form FCODE_DELETE_ROW *
*&---------------------------------------------------------------------*
FORM FCODE_DELETE_ROW
USING P_TC_NAME TYPE DYNFNAM
P_TABLE_NAME
P_MARK_NAME .
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
DATA L_TABLE_NAME LIKE FELD-NAME.
FIELD-SYMBOLS <TC> TYPE CXTAB_CONTROL.
FIELD-SYMBOLS <TABLE> TYPE STANDARD TABLE.
FIELD-SYMBOLS <WA>.
FIELD-SYMBOLS <MARK_FIELD>.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
ASSIGN (P_TC_NAME) TO <TC>.
*&SPWIZARD: get the table, which belongs to the tc *
CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME. "table body
ASSIGN (L_TABLE_NAME) TO <TABLE>. "not headerline
*&SPWIZARD: delete marked lines *
DESCRIBE TABLE <TABLE> LINES <TC>-LINES.
LOOP AT <TABLE> ASSIGNING <WA>.
*&SPWIZARD: access to the component 'FLAG' of the table header *
ASSIGN COMPONENT P_MARK_NAME OF STRUCTURE <WA> TO <MARK_FIELD>.
IF <MARK_FIELD> = 'X'.
DELETE <TABLE> INDEX SYST-TABIX.
IF SY-SUBRC = 0.
<TC>-LINES = <TC>-LINES - 1.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. " FCODE_DELETE_ROW
*&---------------------------------------------------------------------*
*& Form COMPUTE_SCROLLING_IN_TC
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_TC_NAME name of tablecontrol
* -->P_OK ok code
*----------------------------------------------------------------------*
FORM COMPUTE_SCROLLING_IN_TC USING P_TC_NAME
P_OK.
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
DATA L_TC_NEW_TOP_LINE TYPE I.
DATA L_TC_NAME LIKE FELD-NAME.
DATA L_TC_LINES_NAME LIKE FELD-NAME.
DATA L_TC_FIELD_NAME LIKE FELD-NAME.
FIELD-SYMBOLS <TC> TYPE CXTAB_CONTROL.
FIELD-SYMBOLS <LINES> TYPE I.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
ASSIGN (P_TC_NAME) TO <TC>.
*&SPWIZARD: get looplines of TableControl *
CONCATENATE 'G_' P_TC_NAME '_LINES' INTO L_TC_LINES_NAME.
ASSIGN (L_TC_LINES_NAME) TO <LINES>.
*&SPWIZARD: is no line filled? *
IF <TC>-LINES = 0.
*&SPWIZARD: yes, ... *
L_TC_NEW_TOP_LINE = 1.
ELSE.
*&SPWIZARD: no, ... *
CALL FUNCTION 'SCROLLING_IN_TABLE'
EXPORTING
ENTRY_ACT = <TC>-TOP_LINE
ENTRY_FROM = 1
ENTRY_TO = <TC>-LINES
LAST_PAGE_FULL = 'X'
LOOPS = <LINES>
OK_CODE = P_OK
OVERLAPPING = 'X'
IMPORTING
ENTRY_NEW = L_TC_NEW_TOP_LINE
EXCEPTIONS
* NO_ENTRY_OR_PAGE_ACT = 01
* NO_ENTRY_TO = 02
* NO_OK_CODE_OR_PAGE_GO = 03
OTHERS = 0.
ENDIF.
*&SPWIZARD: get actual tc and column *
GET CURSOR FIELD L_TC_FIELD_NAME
AREA L_TC_NAME.
IF SYST-SUBRC = 0.
IF L_TC_NAME = P_TC_NAME.
*&SPWIZARD: et actual column *
SET CURSOR FIELD L_TC_FIELD_NAME LINE 1.
ENDIF.
ENDIF.
*&SPWIZARD: set the new top line *
<TC>-TOP_LINE = L_TC_NEW_TOP_LINE.
ENDFORM. " COMPUTE_SCROLLING_IN_TC
*&---------------------------------------------------------------------*
*& Form FCODE_TC_MARK_LINES
*&---------------------------------------------------------------------*
* marks all TableControl lines
*----------------------------------------------------------------------*
* -->P_TC_NAME name of tablecontrol
*----------------------------------------------------------------------*
FORM FCODE_TC_MARK_LINES USING P_TC_NAME
P_TABLE_NAME
P_MARK_NAME.
*&SPWIZARD: EGIN OF LOCAL DATA-----------------------------------------*
DATA L_TABLE_NAME LIKE FELD-NAME.
FIELD-SYMBOLS <TC> TYPE CXTAB_CONTROL.
FIELD-SYMBOLS <TABLE> TYPE STANDARD TABLE.
FIELD-SYMBOLS <WA>.
FIELD-SYMBOLS <MARK_FIELD>.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
ASSIGN (P_TC_NAME) TO <TC>.
*&SPWIZARD: get the table, which belongs to the tc *
CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME. "table body
ASSIGN (L_TABLE_NAME) TO <TABLE>. "not headerline
*&SPWIZARD: mark all filled lines *
LOOP AT <TABLE> ASSIGNING <WA>.
*&SPWIZARD: access to the component 'FLAG' of the table header *
ASSIGN COMPONENT P_MARK_NAME OF STRUCTURE <WA> TO <MARK_FIELD>.
<MARK_FIELD> = 'X'.
ENDLOOP.
ENDFORM. "fcode_tc_mark_lines
*&---------------------------------------------------------------------*
*& Form FCODE_TC_DEMARK_LINES
*&---------------------------------------------------------------------*
* demarks all TableControl lines
*----------------------------------------------------------------------*
* -->P_TC_NAME name of tablecontrol
*----------------------------------------------------------------------*
FORM FCODE_TC_DEMARK_LINES USING P_TC_NAME
P_TABLE_NAME
P_MARK_NAME .
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
DATA L_TABLE_NAME LIKE FELD-NAME.
FIELD-SYMBOLS <TC> TYPE CXTAB_CONTROL.
FIELD-SYMBOLS <TABLE> TYPE STANDARD TABLE.
FIELD-SYMBOLS <WA>.
FIELD-SYMBOLS <MARK_FIELD>.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
ASSIGN (P_TC_NAME) TO <TC>.
*&SPWIZARD: get the table, which belongs to the tc *
CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME. "table body
ASSIGN (L_TABLE_NAME) TO <TABLE>. "not headerline
*&SPWIZARD: demark all filled lines *
LOOP AT <TABLE> ASSIGNING <WA>.
*&SPWIZARD: access to the component 'FLAG' of the table header *
ASSIGN COMPONENT P_MARK_NAME OF STRUCTURE <WA> TO <MARK_FIELD>.
<MARK_FIELD> = SPACE.
ENDLOOP.
ENDFORM. "fcode_tc_mark_lines
*&---------------------------------------------------------------------*
*& 包含 ZMMR118_PBO
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'PF_0100'.
SET TITLEBAR 'TITLE_0100' WITH G_TITLE_0200.
ENDMODULE.
*&SPWIZARD: OUTPUT MODULE FOR TC 'TAB_01'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR
MODULE TAB_01_CHANGE_TC_ATTR OUTPUT.
DESCRIBE TABLE GT_SUB LINES TAB_01-lines.
ENDMODULE.
*&SPWIZARD: OUTPUT MODULE FOR TC 'TAB_01'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: GET LINES OF TABLECONTROL
MODULE TAB_01_GET_LINES OUTPUT.
G_TAB_01_LINES = SY-LOOPC.
ENDMODULE.
*&---------------------------------------------------------------------*
*& 包含 ZMMR118_PAI
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module CANCEL INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE CANCEL INPUT.
LEAVE TO SCREEN 0 .
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
OK_SAVE = SY-UCOMM .
CLEAR SY-UCOMM .
CLEAR OK_CODE .
CASE OK_SAVE.
WHEN 'BACK' .
LEAVE TO SCREEN 0 .
WHEN '&OK'.
PERFORM FRM_SPLIT.
WHEN OTHERS .
ENDCASE .
ENDMODULE.
*&SPWIZARD: INPUT MODULE FOR TC 'TAB_01'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: MODIFY TABLE
MODULE TAB_01_MODIFY INPUT.
MODIFY GT_SUB
FROM GT_SUB
INDEX TAB_01-CURRENT_LINE.
ENDMODULE.
*&SPWIZARD: INPUT MODULE FOR TC 'TAB_01'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: PROCESS USER COMMAND
MODULE TAB_01_USER_COMMAND INPUT.
OK_CODE = SY-UCOMM.
PERFORM USER_OK_TC USING 'TAB_01'
'GT_SUB'
' '
CHANGING OK_CODE.
SY-UCOMM = OK_CODE.
ENDMODULE.
AT SELECTION-SCREEN.
PERFORM SCREEN_SETTING.
START-OF-SELECTION.
PERFORM FOM_GETDATA .
PERFORM FRM_DISPLAY.
SD-批量修改SO数量及交期(开发笔记)
最新推荐文章于 2023-06-20 00:00:00 发布