*&---------------------------------------------------------------------*
*& Report ZSDR004
*&---------------------------------------------------------------------*
*& Author : NathanSun
*& Create Date : 2019-09-16
*& Program Type : Report
*& Description : 工单发料批次调整
*&---------------------------------------------------------------------*
REPORT ZPPR004.
TABLES:AUFK,MATDOC,SSCRFIELDS,ZTGDPC,LIPS,VBAP.
TYPE-POOLS:SLIS,T001W,ICON.
"定义ALV输出所需变量
DATA:S_LAYOUT TYPE SLIS_LAYOUT_ALV,
GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.
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 GT_VBPA LIKE VBPA OCCURS 0 WITH HEADER LINE.
DATA:LS_STYLE TYPE LVC_S_STYL,
LT_STYLE TYPE TABLE OF LVC_S_STYL.
TYPES: BEGIN OF GTS_EXCEL,
MATNR TYPE ZTGDPC-MATNR, "子件物料编码
MENGE TYPE CHAR16, "数量
MEINS TYPE ZTGDPC-MEINS, "单位
AUFNR1 TYPE ZTGDPC-AUFNR1, "工单1
CHARG1 TYPE ZTGDPC-CHARG1, "工单1子件批次
AUFNR2 TYPE ZTGDPC-AUFNR2, "工单2
CHARG2 TYPE ZTGDPC-CHARG2, "工单2子件批次
END OF GTS_EXCEL.
TYPES: BEGIN OF GTS_ALV,
CKBOX TYPE C, "选择列
ZAUFNR TYPE ZTGDPC-ZAUFNR, "流水号
MATNR TYPE ZTGDPC-MATNR, "子件物料编码
MAKTX TYPE MAKT-MAKTX, "子件物料描述
MENGE TYPE ZTGDPC-MENGE, "数量
MEINS TYPE ZTGDPC-MEINS, "单位
WERKS TYPE ZTGDPC-WERKS, "工厂
AUFNR1 TYPE ZTGDPC-AUFNR1, "工单1
MATNRF1 TYPE AFPO-MATNR, "工单1成品
MENGET1 TYPE AUFM-MENGE, "工单1可退数量
CHARG1 TYPE ZTGDPC-CHARG1, "工单1子件批次
AUFNR2 TYPE ZTGDPC-AUFNR2, "工单2
MATNRF2 TYPE AFPO-MATNR, "工单2成品
MENGET2 TYPE AUFM-MENGE, "工单2可退数量
CHARG2 TYPE ZTGDPC-CHARG2, "工单2子件批次
MEPBO TYPE BAPI_MSG, "检查信息
TYPBO TYPE CHAR4, "检查信息类型
MBLNR1 TYPE ZTGDPC-MBLNR1, "工单1退料凭证
MBLNR2 TYPE ZTGDPC-MBLNR2, "工单2退料凭证
MBLNR3 TYPE ZTGDPC-MBLNR3, "工单1发料凭证
MBLNR4 TYPE ZTGDPC-MBLNR4, "工单2发料凭证
DATUM TYPE ZTGDPC-DATUM, "过账日期
UNAME TYPE ZTGDPC-UNAME, "操作用户名
MEPAI TYPE BAPI_MSG, "导入处理的信息
COURSE TYPE ZTGDPC-COURSE, "执行进程
STAND TYPE ZTGDPC-STAND, "执行状态
TYPAI TYPE CHAR4, "导入处理的消息类型
CELLCOLOR TYPE LVC_T_SCOL, "单元格颜色
STYLE TYPE LVC_T_STYL, "控制不可编辑
END OF GTS_ALV.
DATA: GT_EXCEL TYPE TABLE OF GTS_EXCEL WITH HEADER LINE.
DATA: GT_DATA TYPE TABLE OF ZTGDPC WITH HEADER LINE.
DATA: GT_ALV TYPE TABLE OF GTS_ALV WITH HEADER LINE.
DATA: GT_ALV_A TYPE TABLE OF GTS_ALV WITH HEADER LINE.
DATA: GT_ALV_B TYPE TABLE OF GTS_ALV WITH HEADER LINE.
DATA: GT_ALV_C TYPE TABLE OF GTS_ALV WITH HEADER LINE.
DATA: GT_ALV_D TYPE TABLE OF GTS_ALV WITH HEADER LINE.
DATA: GT_ALV_E TYPE TABLE OF GTS_ALV WITH HEADER LINE.
DATA: MESSAGE TYPE BAPI_MSG. "报错信息.
SELECTION-SCREEN: FUNCTION KEY 1 .
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
PARAMETERS P_RD2 RADIOBUTTON GROUP GP1 DEFAULT 'X' USER-COMMAND MXX."用来显示 p_AUFNR
PARAMETERS P_RD1 RADIOBUTTON GROUP GP1 ."用来隐藏 p_AUFNR
PARAMETERS P_RD3 RADIOBUTTON GROUP GP1 ."用来隐藏 p_AUFNR
SELECTION-SCREEN END OF BLOCK B1.
SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME.
PARAMETERS: P_FILE LIKE RLGRAP-FILENAME MODIF ID MXZ .
SELECT-OPTIONS: S_MATNR FOR ZTGDPC-MATNR MODIF ID MXY . "子件物料编码
SELECT-OPTIONS: S_AUFN1 FOR ZTGDPC-AUFNR1 MODIF ID MXY . "工单1
SELECT-OPTIONS: S_AUFN2 FOR ZTGDPC-AUFNR2 MODIF ID MXY . "工单2
SELECT-OPTIONS: S_DATUM FOR ZTGDPC-DATUM MODIF ID MXY . "导入日期
SELECT-OPTIONS: S_UNAME FOR ZTGDPC-UNAME MODIF ID MXY . "用户名
SELECT-OPTIONS: S_COURS FOR ZTGDPC-COURSE MODIF ID MXY . "进程
SELECTION-SCREEN END OF BLOCK B2.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN .
"控制下拉列表(文本框也是一样)的必输性:外观上打钩,但不自动校验
IF ( P_RD1 = 'X' OR P_RD3 = 'X' ) AND SCREEN-GROUP1 = 'MXY'.
"显示
SCREEN-ACTIVE = '1'.
* SCREEN-REQUIRED = '2'."外观上打钩,但不自动校验
MODIFY SCREEN.
ELSEIF SCREEN-GROUP1 = 'MXY'. "
"隐藏
SCREEN-ACTIVE = '0'.
* SCREEN-REQUIRED = '2'.
MODIFY SCREEN.
ENDIF.
IF P_RD2 = 'X' AND SCREEN-GROUP1 = 'MXZ'.
"显示
SCREEN-ACTIVE = '1'.
SCREEN-REQUIRED = '2'."外观上打钩,但不自动校验
MODIFY SCREEN.
ELSEIF SCREEN-GROUP1 = 'MXZ'. "
"隐藏
SCREEN-ACTIVE = '0'.
SCREEN-REQUIRED = '2'.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
MASK = ',Excel Files,*.xls,All Files,*.*.'(101)
TITLE = '选择文件'(100)
IMPORTING
FILENAME = P_FILE
EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 2
SELECTION_CANCEL = 3
SELECTION_ERROR = 4
OTHERS = 5.
IF SY-SUBRC <> 0 AND SY-SUBRC <> 3.
MESSAGE '选择文件出错!' TYPE 'E'.
ENDIF.
FORM FOM_UPDATA .
CLEAR GT_EXDATA[].
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' "读取excel文件中的内容
EXPORTING
FILENAME = P_FILE
I_BEGIN_COL = '1'
I_BEGIN_ROW = '2'
I_END_COL = '20'
I_END_ROW = '5000'
TABLES
INTERN = GT_EXDATA[].
SORT GT_EXDATA BY ROW COL VALUE.
**---整理到内表数据
CLEAR GT_EXCEL[] .
LOOP AT GT_EXDATA.
CLEAR FLAG .
AT END OF ROW .
FLAG = 'X'.
ENDAT .
CASE GT_EXDATA-COL.
WHEN 1.
GT_EXCEL-MATNR = GT_EXDATA-VALUE.
WHEN 2.
GT_EXCEL-MENGE = GT_EXDATA-VALUE.
WHEN 3.
GT_EXCEL-MEINS = GT_EXDATA-VALUE.
WHEN 4.
GT_EXCEL-AUFNR1 = GT_EXDATA-VALUE.
WHEN 5.
GT_EXCEL-CHARG1 = GT_EXDATA-VALUE.
WHEN 6.
GT_EXCEL-AUFNR2 = GT_EXDATA-VALUE.
WHEN 7.
GT_EXCEL-CHARG2 = GT_EXDATA-VALUE.
ENDCASE.
IF FLAG IS NOT INITIAL.
APPEND GT_EXCEL."append要加在最后一列.
CLEAR GT_EXCEL.
ENDIF.
CLEAR GT_EXDATA.
ENDLOOP.
CLEAR GT_ALV[] .
LOOP AT GT_EXCEL.
GT_ALV-MATNR = GT_EXCEL-MATNR .
CALL FUNCTION 'UNITS_STRING_CONVERT'
EXPORTING
UNITS_STRING = GT_EXCEL-MENGE
DCPFM = 'X' "此时为X
IMPORTING
UNITS = GT_ALV-MENGE
EXCEPTIONS
INVALID_TYPE = 1
OTHERS = 2.
GT_ALV-MEINS = GT_EXCEL-MEINS .
GT_ALV-AUFNR1 = GT_EXCEL-AUFNR1 .
GT_ALV-CHARG1 = GT_EXCEL-CHARG1 .
GT_ALV-AUFNR2 = GT_EXCEL-AUFNR2 .
GT_ALV-CHARG2 = GT_EXCEL-CHARG2 .
GT_ALV-DATUM = SY-DATUM .
GT_ALV-UNAME = SY-UNAME .
APPEND GT_ALV .
CLEAR GT_ALV .
CLEAR GT_EXCEL .
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_GETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FOM_GETDATA .
DATA:GT_AUFM TYPE TABLE OF AUFM WITH HEADER LINE .
IF P_RD1 IS NOT INITIAL.
CLEAR GT_ALV[] .
SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_ALV[] FROM ZTGDPC
WHERE STAND <> 'S'
AND MATNR IN S_MATNR
AND AUFNR1 IN S_AUFN1
AND AUFNR2 IN S_AUFN2
AND DATUM IN S_DATUM
AND UNAME IN S_UNAME
AND COURSE IN S_COURS
.
ELSEIF P_RD3 IS NOT INITIAL .
CLEAR GT_ALV[] .
SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_ALV[] FROM ZTGDPC
WHERE MATNR IN S_MATNR
AND AUFNR1 IN S_AUFN1
AND AUFNR2 IN S_AUFN2
AND DATUM IN S_DATUM
AND UNAME IN S_UNAME
AND COURSE IN S_COURS
.
ENDIF.
LOOP AT GT_ALV.
SELECT SINGLE MAKTX INTO GT_ALV-MAKTX FROM MAKT
WHERE MATNR = GT_ALV-MATNR
.
SELECT SINGLE PLNBEZ INTO GT_ALV-MATNRF2 FROM AFKO
WHERE AUFNR = GT_ALV-AUFNR1
.
SELECT SINGLE PLNBEZ INTO GT_ALV-MATNRF2 FROM AFKO
WHERE AUFNR = GT_ALV-AUFNR2
.
SELECT SINGLE WERKS INTO GT_ALV-WERKS FROM AUFM
WHERE AUFNR = GT_ALV-AUFNR1
.
*工单1可退数量
CLEAR GT_AUFM[].
SELECT MENGE BWART INTO CORRESPONDING FIELDS OF TABLE GT_AUFM[] FROM AUFM
WHERE AUFNR = GT_ALV-AUFNR1
AND BWART IN ( '261', '262' )
.
CLEAR GT_ALV-MENGET1 .
LOOP AT GT_AUFM.
IF GT_AUFM-BWART = '262'.
GT_AUFM-MENGE = GT_AUFM-MENGE * -1 .
ENDIF.
GT_ALV-MENGET1 = GT_ALV-MENGET1 + GT_AUFM-MENGE .
CLEAR GT_AUFM.
ENDLOOP.
*工单2可退数量
CLEAR GT_AUFM[].
SELECT MENGE BWART INTO CORRESPONDING FIELDS OF TABLE GT_AUFM[] FROM AUFM
WHERE AUFNR = GT_ALV-AUFNR2
AND BWART IN ( '261', '262' )
.
CLEAR GT_ALV-MENGET2 .
LOOP AT GT_AUFM.
IF GT_AUFM-BWART = '262'.
GT_AUFM-MENGE = GT_AUFM-MENGE * -1 .
ENDIF.
GT_ALV-MENGET2 = GT_ALV-MENGET2 + GT_AUFM-MENGE .
CLEAR GT_AUFM.
ENDLOOP.
IF GT_ALV-COURSE IS INITIAL.
IF GT_ALV-MENGET1 < GT_ALV-MENGE.
GT_ALV-MEPBO = '订单1可退数量不足!'.
GT_ALV-TYPBO = '@0A@'.
CLEAR LT_STYLE[] .
LS_STYLE-FIELDNAME = 'TYPBO'.
LS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
APPEND LS_STYLE TO LT_STYLE.
GT_ALV-STYLE = LT_STYLE.
ELSEIF GT_ALV-MENGET2 < GT_ALV-MENGE.
GT_ALV-MEPBO = '订单2可退数量不足!'.
GT_ALV-TYPBO = '@0A@'.
CLEAR LT_STYLE[] .
LS_STYLE-FIELDNAME = 'TYPBO'.
LS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
APPEND LS_STYLE TO LT_STYLE.
GT_ALV-STYLE = LT_STYLE.
ELSE.
GT_ALV-MEPBO = '数据就绪' .
GT_ALV-TYPBO = '@08@'.
CLEAR LT_STYLE[] .
LS_STYLE-FIELDNAME = 'TYPBO'.
LS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
APPEND LS_STYLE TO LT_STYLE.
GT_ALV-STYLE = LT_STYLE.
ENDIF.
ELSEIF GT_ALV-COURSE = '4'.
GT_ALV-MEPBO = '已完成' .
GT_ALV-TYPBO = '@08@'.
CLEAR LT_STYLE[] .
LS_STYLE-FIELDNAME = 'TYPBO'.
LS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
APPEND LS_STYLE TO LT_STYLE.
GT_ALV-STYLE = LT_STYLE.
ELSE .
GT_ALV-MEPBO = '进行中' .
GT_ALV-TYPBO = '@08@'.
CLEAR LT_STYLE[] .
LS_STYLE-FIELDNAME = 'TYPBO'.
LS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
APPEND LS_STYLE TO LT_STYLE.
GT_ALV-STYLE = LT_STYLE.
ENDIF .
IF GT_ALV-STAND = 'E'.
GT_ALV-TYPAI = '@0A@'.
CLEAR LT_STYLE[] .
LS_STYLE-FIELDNAME = 'TYPAI'.
LS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
APPEND LS_STYLE TO LT_STYLE.
GT_ALV-STYLE = LT_STYLE.
ELSEIF GT_ALV-STAND = 'S'.
GT_ALV-TYPAI = '@08@'.
CLEAR LT_STYLE[] .
LS_STYLE-FIELDNAME = 'TYPAI'.
LS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_BUTTON.
APPEND LS_STYLE TO LT_STYLE.
GT_ALV-STYLE = LT_STYLE.
ENDIF.
MODIFY GT_ALV .
CLEAR GT_ALV .
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-COLTAB_FIELDNAME = 'CELLCOLOR'. "单元格颜色内表字段
* s_layout-box_fieldname = 'BOX'.
PERFORM FRM_FILL_FIELD .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_SAVE = 'A'
IS_LAYOUT = S_LAYOUT
IT_FIELDCAT = GT_FIELDCAT
I_CALLBACK_PROGRAM = SY-REPID
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_ALV[].
ENDFORM.
FORM FRM_FILL_FIELD .
DATA: WA_FIELDCAT TYPE SLIS_FIELDCAT_ALV.
DEFINE FILL_FIELD.
WA_FIELDCAT-FIELDNAME = &1.
WA_FIELDCAT-SELTEXT_L = &2.
IF WA_FIELDCAT-FIELDNAME = 'CKBOX' .
WA_FIELDCAT-CHECKBOX = 'X'.
WA_FIELDCAT-EDIT = 'X'.
ENDIF.
IF WA_FIELDCAT-FIELDNAME = 'MENGE_T' .
WA_FIELDCAT-REF_TABNAME = 'AUFM'.
WA_FIELDCAT-REF_FIELDNAME = 'MENGE'.
WA_FIELDCAT-OUTPUTLEN = '13'.
WA_FIELDCAT-EDIT = 'X'.
ENDIF .
IF WA_FIELDCAT-FIELDNAME = 'LGORT_T' .
WA_FIELDCAT-EDIT = 'X'.
ENDIF .
IF WA_FIELDCAT-FIELDNAME = 'PLNBEZ'
OR WA_FIELDCAT-FIELDNAME = 'MATNR'
OR WA_FIELDCAT-FIELDNAME = 'MATNRT'
.
WA_FIELDCAT-REF_TABNAME = 'MARA'.
WA_FIELDCAT-REF_FIELDNAME = 'MATNR'.
ENDIF.
IF WA_FIELDCAT-FIELDNAME = 'ARKTX' OR WA_FIELDCAT-FIELDNAME = 'WAKTX' .
WA_FIELDCAT-REF_TABNAME = 'VBAP'.
WA_FIELDCAT-REF_FIELDNAME = 'ARKTX'.
ENDIF.
IF WA_FIELDCAT-FIELDNAME = 'AUFNR' .
WA_FIELDCAT-REF_TABNAME = 'AUFK'.
WA_FIELDCAT-REF_FIELDNAME = 'AUFNR'.
ENDIF.
IF WA_FIELDCAT-FIELDNAME = 'BLDAT'
OR WA_FIELDCAT-FIELDNAME = 'BUDAT'
.
WA_FIELDCAT-REF_TABNAME = 'MATDOC'.
WA_FIELDCAT-REF_FIELDNAME = 'BLDAT'.
* WA_FIELDCAT-EDIT = 'X'.
ENDIF.
IF WA_FIELDCAT-FIELDNAME = 'MESSAGE' .
WA_FIELDCAT-OUTPUTLEN = '100'.
ENDIF.
IF WA_FIELDCAT-FIELDNAME = 'TYPBO'
OR WA_FIELDCAT-FIELDNAME = 'TYPAI'
.
WA_FIELDCAT-ICON = 'X'.
WA_FIELDCAT-OUTPUTLEN = '13'.
ENDIF.
APPEND WA_FIELDCAT TO GT_FIELDCAT.
CLEAR WA_FIELDCAT.
END-OF-DEFINITION.
FILL_FIELD :
'CKBOX' '选择列',
'ZAUFNR' '数据流水号',
'WERKS' '工厂',
'MATNR' '子件物料编码',
'MENGE' '数量',
'MEINS' '单位',
'AUFNR1' '工单1',
'MATNRF1' '工单1成品',
'MENGET1' '工单1可退数量',
'CHARG1' '工单1子件批次',
'AUFNR2' '工单2',
'MATNRF2' '工单2成品',
'MENGET2' '工单2可退数量',
'CHARG2' '工单2子件批次',
'MEPBO' '检查信息',
'TYPBO' '检查信息类型',
'MBLNR1' '工单1退料凭证',
'MBLNR2' '工单2退料凭证',
'MBLNR3' '工单1发料凭证',
'MBLNR4' '工单2发料凭证',
'DATUM' '过账日期',
'UNAME' '操作用户名',
'MEPAI' '导入处理的信息',
'COURSE' '进程',
'STAND' '执行状态',
'TYPAI' '导入处理的消息类型'.
ENDFORM.
FORM PF_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.
IF P_RD3 IS NOT INITIAL.
SET PF-STATUS 'STANDARD_FULLSCREEN'.
ELSE.
SET PF-STATUS 'STANDARD_FULLSCREEN1'.
ENDIF.
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.
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_ALV .
GT_ALV-CKBOX = 'X' .
MODIFY GT_ALV .
CLEAR GT_ALV .
ENDLOOP.
WHEN 'SAL'.
LOOP AT GT_ALV .
GT_ALV-CKBOX = '' .
MODIFY GT_ALV .
CLEAR GT_ALV .
ENDLOOP.
WHEN '&IC1'."表示双击
* IF IS_SELFIELD-FIELDNAME = 'VBELN' .
* CHECK IS_SELFIELD-TABINDEX > 0.
* CLEAR GT_ALV .
* READ TABLE GT_ALV INDEX IS_SELFIELD-TABINDEX.
* SET PARAMETER ID 'AUN' FIELD GT_ALV-VBELN.
* CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
* ELSEIF IS_SELFIELD-FIELDNAME = 'VBELN_DN' .
* CHECK IS_SELFIELD-TABINDEX > 0.
* CLEAR GT_ALV .
* READ TABLE GT_ALV INDEX IS_SELFIELD-TABINDEX.
* IF GT_ALV-VBELN_DN IS NOT INITIAL.
* SET PARAMETER ID 'VL' FIELD GT_ALV-VBELN_DN.
* CALL TRANSACTION 'VL03N' AND SKIP FIRST SCREEN.
* ENDIF.
* ELSE .
* MESSAGE '请选择有效字段!'TYPE 'S' DISPLAY LIKE 'W'.
* ENDIF .
WHEN 'RUN'.
*0,Save Data
PERFORM FOM_SAVE.
*1,Post Goods Movements with 631 for aufnr1
PERFORM GOODSMVT_CREATE_T1.
*2,Post Goods Movements with 631 for aufnr2
PERFORM GOODSMVT_CREATE_T2.
*3,Post Goods Movements with 632 for aufnr1
PERFORM GOODSMVT_CREATE_J1.
*4,Post Goods Movements with 632 for aufnr2
PERFORM GOODSMVT_CREATE_J2.
ENDCASE.
CALL METHOD REF->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LV_STABLE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_SAVE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FOM_SAVE .
CLEAR GT_DATA[] .
LOOP AT GT_ALV WHERE CKBOX IS NOT INITIAL AND TYPBO <> '@0A@' AND COURSE IS INITIAL.
GT_DATA-ZAUFNR = GT_ALV-ZAUFNR .
GT_DATA-MATNR = GT_ALV-MATNR .
GT_DATA-MENGE = GT_ALV-MENGE .
GT_DATA-MEINS = GT_ALV-MEINS .
GT_DATA-WERKS = GT_ALV-WERKS .
GT_DATA-AUFNR1 = GT_ALV-AUFNR1 .
GT_DATA-CHARG1 = GT_ALV-CHARG1 .
GT_DATA-AUFNR2 = GT_ALV-AUFNR2 .
GT_DATA-CHARG2 = GT_ALV-CHARG2 .
GT_DATA-DATUM = GT_ALV-DATUM .
GT_DATA-UNAME = GT_ALV-UNAME .
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
NR_RANGE_NR = '01' "上面起始编号前面的序号
OBJECT = 'ZGDPC01' "编号对象
IMPORTING
NUMBER = GT_ALV-ZAUFNR.
GT_DATA-ZAUFNR = GT_ALV-ZAUFNR .
APPEND GT_DATA .
MODIFY GT_ALV .
CLEAR GT_DATA .
CLEAR GT_ALV .
ENDLOOP.
MODIFY ZTGDPC FROM TABLE GT_DATA[] .
COMMIT WORK AND WAIT.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_CREATE_DN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM GOODSMVT_CREATE_T1 .
DATA GT_LIPS TYPE TABLE OF LIPS WITH HEADER LINE .
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_AUFM TYPE TABLE OF AUFM WITH HEADER LINE .
DATA:GT_AUFM_C TYPE TABLE OF AUFM WITH HEADER LINE .
DATA:LV_MENGE TYPE AUFM-MENGE.
CLEAR GT_ALV_A[] .
LOOP AT GT_ALV.
IF GT_ALV-CKBOX IS NOT INITIAL
AND GT_ALV-TYPBO <> '@0A@'
.
IF ( GT_ALV-COURSE IS INITIAL ) OR ( GT_ALV-COURSE = 1 ).
APPEND GT_ALV TO GT_ALV_A[].
ENDIF.
ENDIF.
CLEAR GT_ALV .
ENDLOOP.
LOOP AT GT_ALV_A.
CLEAR GOODSMVT_HEADER .
CLEAR GOODSMVT_CODE .
GOODSMVT_HEADER-PSTNG_DATE = GT_ALV_A-DATUM. "过账日期
GOODSMVT_HEADER-DOC_DATE = GT_ALV_A-DATUM. "凭证日期
GOODSMVT_HEADER-PR_UNAME = GT_ALV-UNAME. "用户名
GOODSMVT_HEADER-HEADER_TXT = '工单发料批次调整'. "抬头文本-退料单号
GOODSMVT_HEADER-REF_DOC_NO = GT_ALV_A-AUFNR1. "参考凭证-工单号1
GOODSMVT_CODE = '03' .
*工单1可退项目
CLEAR GT_AUFM[].
SELECT AUFNR MATNR RSNUM RSPOS MENGE BWART INTO CORRESPONDING FIELDS OF TABLE GT_AUFM[] FROM AUFM
WHERE AUFNR = GT_ALV-AUFNR1
AND BWART IN ( '261', '262' )
.
LV_MENGE = GT_ALV_A-MENGE .
SORT GT_AUFM[] BY AUFNR MATNR RSNUM DESCENDING RSPOS .
GT_AUFM_C[] = GT_AUFM[] .
DELETE ADJACENT DUPLICATES FROM GT_AUFM_C[] COMPARING AUFNR MATNR RSNUM RSPOS.
CLEAR GOODSMVT_ITEM[] .
LOOP AT GT_AUFM_C.
CLEAR GT_AUFM_C-MENGE .
LOOP AT GT_AUFM WHERE AUFNR = GT_AUFM_C-AUFNR
AND MATNR = GT_AUFM_C-MATNR
AND RSNUM = GT_AUFM_C-RSNUM
AND RSPOS = GT_AUFM_C-RSPOS
.
IF GT_AUFM-BWART = '262'.
GT_AUFM-MENGE = GT_AUFM-MENGE * -1 .
ENDIF.
GT_AUFM_C-MENGE = GT_AUFM_C-MENGE + GT_AUFM-MENGE .
CLEAR GT_AUFM.
ENDLOOP.
LV_MENGE = LV_MENGE - GT_AUFM_C-MENGE .
IF LV_MENGE < 0.
LV_MENGE = LV_MENGE + GT_AUFM_C-MENGE .
GOODSMVT_ITEM-MATERIAL_LONG = GT_ALV_A-MATNR. "物料编码
GOODSMVT_ITEM-PLANT = GT_ALV_A-WERKS. "工厂
GOODSMVT_ITEM-STGE_LOC = '0001'. "入库仓库
GOODSMVT_ITEM-BATCH = GT_DATA-CHARG1. "批次
GOODSMVT_ITEM-RESERV_NO = GT_AUFM_C-RSNUM. "预留
GOODSMVT_ITEM-RES_ITEM = GT_AUFM_C-RSPOS. "项目编号
GOODSMVT_ITEM-ENTRY_QNT = LV_MENGE. "入库数量
GOODSMVT_ITEM-ENTRY_UOM = GT_ALV_A-MEINS. "单位
GOODSMVT_ITEM-XSTOB = 'X'. "使用冲销移动类型标识符
GOODSMVT_ITEM-MOVE_TYPE = '262'. "移动类型
APPEND GOODSMVT_ITEM .
CLEAR GOODSMVT_ITEM .
EXIT .
ELSE.
GOODSMVT_ITEM-MATERIAL_LONG = GT_ALV_A-MATNR. "物料编码
GOODSMVT_ITEM-PLANT = GT_ALV_A-WERKS. "工厂
GOODSMVT_ITEM-STGE_LOC = '0001'. "入库仓库
GOODSMVT_ITEM-BATCH = GT_DATA-CHARG1. "批次
GOODSMVT_ITEM-RESERV_NO = GT_AUFM_C-RSNUM. "预留
GOODSMVT_ITEM-RES_ITEM = GT_AUFM_C-RSPOS. "项目编号
GOODSMVT_ITEM-ENTRY_QNT = GT_AUFM_C-MENGE. "入库数量
GOODSMVT_ITEM-ENTRY_UOM = GT_ALV_A-MEINS. "单位
GOODSMVT_ITEM-XSTOB = 'X'. "使用冲销移动类型标识符
GOODSMVT_ITEM-MOVE_TYPE = '262'. "移动类型
APPEND GOODSMVT_ITEM .
CLEAR GOODSMVT_ITEM .
ENDIF.
MODIFY GT_AUFM_C .
CLEAR GT_AUFM_C .
ENDLOOP.
CLEAR GOODSMVT_HEADRET.
CLEAR MATERIALDOCUMENT.
CLEAR MATDOCUMENTYEAR.
CLEAR GT_ALV_A-MEPAI.
CLEAR RETURN[].
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
GOODSMVT_HEADER = GOODSMVT_HEADER
GOODSMVT_CODE = GOODSMVT_CODE
IMPORTING
GOODSMVT_HEADRET = GOODSMVT_HEADRET
MATERIALDOCUMENT = MATERIALDOCUMENT
MATDOCUMENTYEAR = MATDOCUMENTYEAR
TABLES
GOODSMVT_ITEM = GOODSMVT_ITEM
RETURN = RETURN[].
CLEAR FLAG .
LOOP AT RETURN[] TRANSPORTING NO FIELDS WHERE TYPE = 'E' .
FLAG = 'X'.
EXIT.
ENDLOOP.
IF FLAG IS NOT INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
DELETE ADJACENT DUPLICATES FROM RETURN[] COMPARING MESSAGE.
LOOP AT RETURN WHERE TYPE = 'E'.
GT_ALV_A-MEPAI = GT_ALV_A-MEPAI && ';' && RETURN-MESSAGE .
CLEAR RETURN .
ENDLOOP.
GT_ALV_A-COURSE = 1 .
GT_ALV_A-STAND = 'E'.
GT_ALV_A-TYPAI = '@0A@'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
GT_ALV_A-COURSE = 1 .
GT_ALV_A-STAND = 'S'.
GT_ALV_A-MBLNR1 = MATERIALDOCUMENT .
ENDIF.
LOOP AT GT_ALV WHERE ZAUFNR = GT_ALV_A-ZAUFNR .
GT_ALV-TYPAI = GT_ALV_A-TYPAI .
GT_ALV-STAND = GT_ALV_A-STAND .
GT_ALV-COURSE = GT_ALV_A-COURSE .
GT_ALV-MEPAI = GT_ALV_A-MEPAI .
GT_ALV-MBLNR1 = GT_ALV_A-MBLNR1 .
UPDATE ZTGDPC SET
MBLNR1 = GT_ALV-MBLNR1
COURSE = GT_ALV-COURSE
STAND = GT_ALV-STAND
MESSAGE = GT_ALV-MEPAI
WHERE ZAUFNR = GT_ALV-ZAUFNR.
COMMIT WORK .
MODIFY GT_ALV .
CLEAR GT_ALV .
ENDLOOP.
CLEAR GT_ALV_A .
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_CHANGE_DN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM GOODSMVT_CREATE_T2 .
DATA GT_LIPS TYPE TABLE OF LIPS WITH HEADER LINE .
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_AUFM TYPE TABLE OF AUFM WITH HEADER LINE .
DATA:GT_AUFM_C TYPE TABLE OF AUFM WITH HEADER LINE .
DATA:LV_MENGE TYPE AUFM-MENGE.
CLEAR GT_ALV_A[] .
LOOP AT GT_ALV.
IF GT_ALV-CKBOX IS NOT INITIAL
.
IF ( GT_ALV-COURSE = 1 AND GT_ALV-STAND = 'S' ) OR ( GT_ALV-COURSE = 2 ).
APPEND GT_ALV TO GT_ALV_A[].
ENDIF.
ENDIF.
CLEAR GT_ALV .
ENDLOOP.
LOOP AT GT_ALV_A.
CLEAR GOODSMVT_HEADER .
CLEAR GOODSMVT_CODE .
GOODSMVT_HEADER-PSTNG_DATE = GT_ALV_A-DATUM. "过账日期
GOODSMVT_HEADER-DOC_DATE = GT_ALV_A-DATUM. "凭证日期
GOODSMVT_HEADER-PR_UNAME = GT_ALV-UNAME. "用户名
GOODSMVT_HEADER-HEADER_TXT = '工单发料批次调整'. "抬头文本-退料单号
GOODSMVT_HEADER-REF_DOC_NO = GT_ALV_A-AUFNR2. "参考凭证-工单号2
GOODSMVT_CODE = '03' .
*工单1可退项目
CLEAR GT_AUFM[].
SELECT AUFNR MATNR RSNUM RSPOS MENGE BWART INTO CORRESPONDING FIELDS OF TABLE GT_AUFM[] FROM AUFM
WHERE AUFNR = GT_ALV-AUFNR2
AND BWART IN ( '261', '262' )
.
LV_MENGE = GT_ALV_A-MENGE .
SORT GT_AUFM[] BY AUFNR MATNR RSNUM DESCENDING RSPOS .
GT_AUFM_C[] = GT_AUFM[] .
DELETE ADJACENT DUPLICATES FROM GT_AUFM_C[] COMPARING AUFNR MATNR RSNUM RSPOS.
CLEAR GOODSMVT_ITEM[] .
LOOP AT GT_AUFM_C.
CLEAR GT_AUFM_C-MENGE .
LOOP AT GT_AUFM WHERE AUFNR = GT_AUFM_C-AUFNR
AND MATNR = GT_AUFM_C-MATNR
AND RSNUM = GT_AUFM_C-RSNUM
AND RSPOS = GT_AUFM_C-RSPOS
.
IF GT_AUFM-BWART = '262'.
GT_AUFM-MENGE = GT_AUFM-MENGE * -1 .
ENDIF.
GT_AUFM_C-MENGE = GT_AUFM_C-MENGE + GT_AUFM-MENGE .
CLEAR GT_AUFM.
ENDLOOP.
LV_MENGE = LV_MENGE - GT_AUFM_C-MENGE .
IF LV_MENGE < 0.
LV_MENGE = LV_MENGE + GT_AUFM_C-MENGE .
GOODSMVT_ITEM-MATERIAL_LONG = GT_ALV_A-MATNR. "物料编码
GOODSMVT_ITEM-PLANT = GT_ALV_A-WERKS. "工厂
GOODSMVT_ITEM-STGE_LOC = '0001'. "入库仓库
GOODSMVT_ITEM-BATCH = GT_DATA-CHARG2. "批次
GOODSMVT_ITEM-RESERV_NO = GT_AUFM_C-RSNUM. "预留
GOODSMVT_ITEM-RES_ITEM = GT_AUFM_C-RSPOS. "项目编号
GOODSMVT_ITEM-ENTRY_QNT = LV_MENGE. "入库数量
GOODSMVT_ITEM-ENTRY_UOM = GT_ALV_A-MEINS. "单位
GOODSMVT_ITEM-XSTOB = 'X'. "使用冲销移动类型标识符
GOODSMVT_ITEM-MOVE_TYPE = '262'. "移动类型
APPEND GOODSMVT_ITEM .
CLEAR GOODSMVT_ITEM .
EXIT .
ELSE.
GOODSMVT_ITEM-MATERIAL_LONG = GT_ALV_A-MATNR. "物料编码
GOODSMVT_ITEM-PLANT = GT_ALV_A-WERKS. "工厂
GOODSMVT_ITEM-STGE_LOC = '0001'. "入库仓库
GOODSMVT_ITEM-BATCH = GT_DATA-CHARG2. "批次
GOODSMVT_ITEM-RESERV_NO = GT_AUFM_C-RSNUM. "预留
GOODSMVT_ITEM-RES_ITEM = GT_AUFM_C-RSPOS. "项目编号
GOODSMVT_ITEM-ENTRY_QNT = GT_AUFM_C-MENGE. "入库数量
GOODSMVT_ITEM-ENTRY_UOM = GT_ALV_A-MEINS. "单位
GOODSMVT_ITEM-XSTOB = 'X'. "使用冲销移动类型标识符
GOODSMVT_ITEM-MOVE_TYPE = '262'. "移动类型
APPEND GOODSMVT_ITEM .
CLEAR GOODSMVT_ITEM .
ENDIF.
MODIFY GT_AUFM_C .
CLEAR GT_AUFM_C .
ENDLOOP.
CLEAR GOODSMVT_HEADRET.
CLEAR MATERIALDOCUMENT.
CLEAR MATDOCUMENTYEAR.
CLEAR GT_ALV_A-MEPAI.
CLEAR RETURN[].
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
GOODSMVT_HEADER = GOODSMVT_HEADER
GOODSMVT_CODE = GOODSMVT_CODE
IMPORTING
GOODSMVT_HEADRET = GOODSMVT_HEADRET
MATERIALDOCUMENT = MATERIALDOCUMENT
MATDOCUMENTYEAR = MATDOCUMENTYEAR
TABLES
GOODSMVT_ITEM = GOODSMVT_ITEM
RETURN = RETURN[].
CLEAR FLAG .
LOOP AT RETURN[] TRANSPORTING NO FIELDS WHERE TYPE = 'E' .
FLAG = 'X'.
EXIT.
ENDLOOP.
IF FLAG IS NOT INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
DELETE ADJACENT DUPLICATES FROM RETURN[] COMPARING MESSAGE.
LOOP AT RETURN WHERE TYPE = 'E'.
GT_ALV_A-MEPAI = GT_ALV_A-MEPAI && ';' && RETURN-MESSAGE .
CLEAR RETURN .
ENDLOOP.
GT_ALV_A-COURSE = 2 .
GT_ALV_A-STAND = 'E'.
GT_ALV_A-TYPAI = '@0A@'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
GT_ALV_A-COURSE = 2 .
GT_ALV_A-STAND = 'S'.
GT_ALV_A-MBLNR2 = MATERIALDOCUMENT .
ENDIF.
LOOP AT GT_ALV WHERE ZAUFNR = GT_ALV_A-ZAUFNR .
GT_ALV-TYPAI = GT_ALV_A-TYPAI .
GT_ALV-STAND = GT_ALV_A-STAND .
GT_ALV-COURSE = GT_ALV_A-COURSE .
GT_ALV-MEPAI = GT_ALV_A-MEPAI .
GT_ALV-MBLNR2 = GT_ALV_A-MBLNR2 .
UPDATE ZTGDPC SET
MBLNR2 = GT_ALV-MBLNR2
COURSE = GT_ALV-COURSE
STAND = GT_ALV-STAND
MESSAGE = GT_ALV-MEPAI
WHERE ZAUFNR = GT_ALV-ZAUFNR.
COMMIT WORK .
MODIFY GT_ALV .
CLEAR GT_ALV .
ENDLOOP.
CLEAR GT_ALV_A .
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GOODSMVT_CREATE_J1
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM GOODSMVT_CREATE_J1 .
DATA GT_LIPS TYPE TABLE OF LIPS WITH HEADER LINE .
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_MSEG TYPE TABLE OF MSEG WITH HEADER LINE .
WAIT UP TO 5 SECONDS .
CLEAR GT_ALV_A[] .
LOOP AT GT_ALV.
IF GT_ALV-CKBOX IS NOT INITIAL
.
IF ( GT_ALV-COURSE = 2 AND GT_ALV-STAND = 'S' ) OR ( GT_ALV-COURSE = 3 ).
APPEND GT_ALV TO GT_ALV_A[].
ENDIF.
ENDIF.
CLEAR GT_ALV .
ENDLOOP.
LOOP AT GT_ALV_A.
CLEAR GOODSMVT_HEADER .
CLEAR GOODSMVT_CODE .
GOODSMVT_HEADER-PSTNG_DATE = GT_ALV_A-DATUM. "过账日期
GOODSMVT_HEADER-DOC_DATE = GT_ALV_A-DATUM. "凭证日期
GOODSMVT_HEADER-PR_UNAME = GT_ALV-UNAME. "用户名
GOODSMVT_HEADER-HEADER_TXT = '工单发料批次调整'. "抬头文本-退料单号
GOODSMVT_HEADER-REF_DOC_NO = GT_ALV_A-AUFNR1. "参考凭证-工单号1
GOODSMVT_CODE = '03' .
CLEAR GT_MSEG[].
SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_MSEG[] FROM MSEG
WHERE MBLNR = GT_ALV_A-MBLNR1
.
LOOP AT GT_MSEG.
GOODSMVT_ITEM-MATERIAL_LONG = GT_MSEG-MATNR. "物料编码
GOODSMVT_ITEM-PLANT = GT_MSEG-WERKS. "工厂
GOODSMVT_ITEM-STGE_LOC = '0001'. "入库仓库
GOODSMVT_ITEM-BATCH = GT_ALV_A-CHARG2. "批次
GOODSMVT_ITEM-RESERV_NO = GT_MSEG-RSNUM. "预留
GOODSMVT_ITEM-RES_ITEM = GT_MSEG-RSPOS. "项目编号
GOODSMVT_ITEM-ENTRY_QNT = GT_MSEG-MENGE. "入库数量
GOODSMVT_ITEM-ENTRY_UOM = GT_MSEG-MEINS. "单位
GOODSMVT_ITEM-MOVE_TYPE = '261'. "移动类型
APPEND GOODSMVT_ITEM .
CLEAR GOODSMVT_ITEM .
CLEAR GT_MSEG .
ENDLOOP.
CLEAR GOODSMVT_HEADRET.
CLEAR MATERIALDOCUMENT.
CLEAR MATDOCUMENTYEAR.
CLEAR GT_ALV_A-MEPAI.
CLEAR RETURN[].
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
GOODSMVT_HEADER = GOODSMVT_HEADER
GOODSMVT_CODE = GOODSMVT_CODE
IMPORTING
GOODSMVT_HEADRET = GOODSMVT_HEADRET
MATERIALDOCUMENT = MATERIALDOCUMENT
MATDOCUMENTYEAR = MATDOCUMENTYEAR
TABLES
GOODSMVT_ITEM = GOODSMVT_ITEM
RETURN = RETURN[].
CLEAR FLAG .
LOOP AT RETURN[] TRANSPORTING NO FIELDS WHERE TYPE = 'E' .
FLAG = 'X'.
EXIT.
ENDLOOP.
IF FLAG IS NOT INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
DELETE ADJACENT DUPLICATES FROM RETURN[] COMPARING MESSAGE.
LOOP AT RETURN WHERE TYPE = 'E'.
GT_ALV_A-MEPAI = GT_ALV_A-MEPAI && ';' && RETURN-MESSAGE .
CLEAR RETURN .
ENDLOOP.
GT_ALV_A-COURSE = 3 .
GT_ALV_A-STAND = 'E'.
GT_ALV_A-TYPAI = '@0A@'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
GT_ALV_A-COURSE = 3 .
GT_ALV_A-STAND = 'S'.
GT_ALV_A-MBLNR3 = MATERIALDOCUMENT .
ENDIF.
LOOP AT GT_ALV WHERE ZAUFNR = GT_ALV_A-ZAUFNR .
GT_ALV-TYPAI = GT_ALV_A-TYPAI .
GT_ALV-STAND = GT_ALV_A-STAND .
GT_ALV-COURSE = GT_ALV_A-COURSE .
GT_ALV-MEPAI = GT_ALV_A-MEPAI .
GT_ALV-MBLNR3 = GT_ALV_A-MBLNR3 .
UPDATE ZTGDPC SET
MBLNR3 = GT_ALV-MBLNR3
COURSE = GT_ALV-COURSE
STAND = GT_ALV-STAND
MESSAGE = GT_ALV-MEPAI
WHERE ZAUFNR = GT_ALV-ZAUFNR.
COMMIT WORK .
MODIFY GT_ALV .
CLEAR GT_ALV .
ENDLOOP.
*
CLEAR GT_ALV_A .
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GOODSMVT_CREATE_J2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM GOODSMVT_CREATE_J2 .
DATA GT_LIPS TYPE TABLE OF LIPS WITH HEADER LINE .
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_MSEG TYPE TABLE OF MSEG WITH HEADER LINE .
CLEAR GT_ALV_A[] .
LOOP AT GT_ALV.
IF GT_ALV-CKBOX IS NOT INITIAL
.
IF ( GT_ALV-COURSE = 3 AND GT_ALV-STAND = 'S' ) OR ( GT_ALV-COURSE = 4 AND GT_ALV-STAND = 'E').
APPEND GT_ALV TO GT_ALV_A[].
ENDIF.
ENDIF.
CLEAR GT_ALV .
ENDLOOP.
LOOP AT GT_ALV_A.
CLEAR GOODSMVT_HEADER .
CLEAR GOODSMVT_CODE .
GOODSMVT_HEADER-PSTNG_DATE = GT_ALV_A-DATUM. "过账日期
GOODSMVT_HEADER-DOC_DATE = GT_ALV_A-DATUM. "凭证日期
GOODSMVT_HEADER-PR_UNAME = GT_ALV-UNAME. "用户名
GOODSMVT_HEADER-HEADER_TXT = '工单发料批次调整'. "抬头文本-退料单号
GOODSMVT_HEADER-REF_DOC_NO = GT_ALV_A-AUFNR2. "参考凭证-工单号2
GOODSMVT_CODE = '03' .
CLEAR GT_MSEG[].
SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_MSEG[] FROM MSEG
WHERE MBLNR = GT_ALV_A-MBLNR2
.
LOOP AT GT_MSEG.
GOODSMVT_ITEM-MATERIAL_LONG = GT_MSEG-MATNR. "物料编码
GOODSMVT_ITEM-PLANT = GT_MSEG-WERKS. "工厂
GOODSMVT_ITEM-STGE_LOC = '0001'. "入库仓库
GOODSMVT_ITEM-BATCH = GT_ALV_A-CHARG1. "批次
GOODSMVT_ITEM-RESERV_NO = GT_MSEG-RSNUM. "预留
GOODSMVT_ITEM-RES_ITEM = GT_MSEG-RSPOS. "项目编号
GOODSMVT_ITEM-ENTRY_QNT = GT_MSEG-MENGE. "入库数量
GOODSMVT_ITEM-ENTRY_UOM = GT_MSEG-MEINS. "单位
GOODSMVT_ITEM-MOVE_TYPE = '261'. "移动类型
APPEND GOODSMVT_ITEM .
CLEAR GOODSMVT_ITEM .
CLEAR GT_MSEG .
ENDLOOP.
CLEAR GOODSMVT_HEADRET.
CLEAR MATERIALDOCUMENT.
CLEAR MATDOCUMENTYEAR.
CLEAR GT_ALV_A-MEPAI.
CLEAR RETURN[].
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
GOODSMVT_HEADER = GOODSMVT_HEADER
GOODSMVT_CODE = GOODSMVT_CODE
IMPORTING
GOODSMVT_HEADRET = GOODSMVT_HEADRET
MATERIALDOCUMENT = MATERIALDOCUMENT
MATDOCUMENTYEAR = MATDOCUMENTYEAR
TABLES
GOODSMVT_ITEM = GOODSMVT_ITEM
RETURN = RETURN[].
CLEAR FLAG .
LOOP AT RETURN[] TRANSPORTING NO FIELDS WHERE TYPE = 'E' .
FLAG = 'X'.
EXIT.
ENDLOOP.
IF FLAG IS NOT INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
DELETE ADJACENT DUPLICATES FROM RETURN[] COMPARING MESSAGE.
LOOP AT RETURN WHERE TYPE = 'E'.
GT_ALV_A-MEPAI = GT_ALV_A-MEPAI && ';' && RETURN-MESSAGE .
CLEAR RETURN .
ENDLOOP.
GT_ALV_A-COURSE = 4 .
GT_ALV_A-STAND = 'E'.
GT_ALV_A-TYPAI = '@0A@'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
GT_ALV_A-COURSE = 4 .
GT_ALV_A-STAND = 'S'.
GT_ALV_A-MBLNR3 = MATERIALDOCUMENT .
ENDIF.
LOOP AT GT_ALV WHERE ZAUFNR = GT_ALV_A-ZAUFNR .
GT_ALV-TYPAI = GT_ALV_A-TYPAI .
GT_ALV-STAND = GT_ALV_A-STAND .
GT_ALV-COURSE = GT_ALV_A-COURSE .
GT_ALV-MEPAI = GT_ALV_A-MEPAI .
GT_ALV-MBLNR4 = GT_ALV_A-MBLNR4 .
UPDATE ZTGDPC SET
MBLNR4 = GT_ALV-MBLNR4
COURSE = GT_ALV-COURSE
STAND = GT_ALV-STAND
MESSAGE = GT_ALV-MEPAI
WHERE ZAUFNR = GT_ALV-ZAUFNR.
COMMIT WORK .
MODIFY GT_ALV .
CLEAR GT_ALV .
ENDLOOP.
*
CLEAR GT_ALV_A .
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_FULLPATH
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_GET_FULLPATH CHANGING PV_FULLPATH TYPE STRING
PV_PATH TYPE STRING
PV_NAME TYPE STRING.
DATA: LV_INIT_PATH TYPE STRING,
LV_INIT_FNAME TYPE STRING,
LV_PATH TYPE STRING,
LV_FILENAME TYPE STRING,
LV_FULLPATH TYPE STRING.
*&---初始名称(输出的文件名称)
* concatenate 'Material_Doc_' SY-DATUM '.xslx' into L_INIT_FNAME.
LV_INIT_FNAME = L_FILENAME.
* 获取桌面路径
CALL METHOD CL_GUI_FRONTEND_SERVICES=>GET_DESKTOP_DIRECTORY
CHANGING
DESKTOP_DIRECTORY = LV_INIT_PATH
EXCEPTIONS
CNTL_ERROR = 1
ERROR_NO_GUI = 2
NOT_SUPPORTED_BY_GUI = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
*&---用户选择名称、路径
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
EXPORTING
* window_title = '指定保存文件名'
* default_extension = 'DOC'
DEFAULT_FILE_NAME = LV_INIT_FNAME
FILE_FILTER = CL_GUI_FRONTEND_SERVICES=>FILETYPE_EXCEL
* FILE_FILTER = CL_GUI_FRONTEND_SERVICES=>FILETYPE_WORD
INITIAL_DIRECTORY = LV_INIT_PATH
PROMPT_ON_OVERWRITE = 'X'
CHANGING
FILENAME = LV_FILENAME
PATH = LV_PATH
FULLPATH = LV_FULLPATH
* USER_ACTION =
* FILE_ENCODING =
EXCEPTIONS
CNTL_ERROR = 1
ERROR_NO_GUI = 2
NOT_SUPPORTED_BY_GUI = 3
OTHERS = 4.
IF SY-SUBRC = 0.
PV_FULLPATH = LV_FULLPATH.
PV_PATH = LV_PATH.
ENDIF.
ENDFORM.
*--------------------------------------------------------------------*
* 下载文件
*--------------------------------------------------------------------*
FORM FRM_DOWN USING PR_FILENAME.
DATA: LV_OBJDATA LIKE WWWDATATAB,
LV_MIME LIKE W3MIME,
LV_DESTINATION LIKE RLGRAP-FILENAME,
LV_OBJNAM TYPE STRING,
LV_RC LIKE SY-SUBRC,
LV_ERRTXT TYPE STRING.
DATA: LV_FILENAME TYPE STRING,
LV_RESULT,
LV_SUBRC TYPE SY-SUBRC.
DATA: LV_OBJID TYPE WWWDATATAB-OBJID .
LV_OBJID = L_MUBAN. "上传的模版名称
*&---查找文件是否存在。
SELECT SINGLE RELID OBJID
FROM WWWDATA
INTO CORRESPONDING FIELDS OF LV_OBJDATA
WHERE SRTF2 = 0
AND RELID = 'MI'
AND OBJID = LV_OBJID.
*&---判断模版不存在则报错
IF SY-SUBRC NE 0 OR LV_OBJDATA-OBJID EQ SPACE.
CONCATENATE '模板文件:' LV_OBJID '不存在,请用TCODE:SMW0进行加载'
INTO LV_ERRTXT.
MESSAGE LV_ERRTXT TYPE 'E'.
ENDIF.
LV_FILENAME = PR_FILENAME.
"判断本地地址是否已经存在此文件。
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST
EXPORTING
FILE = LV_FILENAME
RECEIVING
RESULT = LV_RESULT
EXCEPTIONS
CNTL_ERROR = 1
ERROR_NO_GUI = 2
WRONG_PARAMETER = 3
NOT_SUPPORTED_BY_GUI = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
CASE SY-SUBRC.
WHEN 1.
WHEN 2.
WHEN OTHERS.
ENDCASE.
ENDIF.
IF LV_RESULT EQ 'X'. "如果存在则删除原始文件,重新覆盖
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_DELETE
EXPORTING
FILENAME = LV_FILENAME
CHANGING
RC = LV_SUBRC
EXCEPTIONS
FILE_DELETE_FAILED = 1
CNTL_ERROR = 2
ERROR_NO_GUI = 3
FILE_NOT_FOUND = 4
ACCESS_DENIED = 5
UNKNOWN_ERROR = 6
NOT_SUPPORTED_BY_GUI = 7
WRONG_PARAMETER = 8
OTHERS = 9.
IF SY-SUBRC <> 0.
CASE SY-SUBRC.
WHEN 1.
WHEN 2.
WHEN OTHERS.
ENDCASE.
ENDIF.
IF LV_SUBRC <> 0. "如果删除失败,则报错。
CONCATENATE '同名EXCEL文件已打开' '请关闭该EXCEL后重试。'
INTO LV_ERRTXT.
MESSAGE LV_ERRTXT TYPE 'E'.
ENDIF.
ENDIF.
LV_DESTINATION = PR_FILENAME.
*&---下载模版。
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
KEY = LV_OBJDATA
DESTINATION = LV_DESTINATION
IMPORTING
RC = LV_RC.
IF LV_RC NE 0.
CONCATENATE '模板文件' '下载失败' INTO LV_ERRTXT.
MESSAGE LV_ERRTXT TYPE 'E'.
ENDIF.
ENDFORM.
INITIALIZATION.
SSCRFIELDS-FUNCTXT_01 = '@49@ 模板下载'.
AT SELECTION-SCREEN .
CASE SSCRFIELDS-UCOMM.
WHEN 'FC01'.
L_FILENAME = '工单批次调整导入模板.xls'.
L_MUBAN = 'ZPPR004'.
*&---下载模板
PERFORM FRM_GET_FULLPATH CHANGING GV_FULLPATH GV_PATH GV_NAME.
*&---路径为空则退出
IF GV_FULLPATH IS INITIAL.
MESSAGE '用户取消操作' TYPE 'S'.
RETURN.
ENDIF.
PERFORM FRM_DOWN USING GV_FULLPATH.
WHEN OTHERS.
ENDCASE.
START-OF-SELECTION.
IF P_RD2 IS NOT INITIAL.
IF P_FILE IS INITIAL .
MESSAGE '请选择文件!' TYPE 'S' DISPLAY LIKE 'E'.
ELSE.
PERFORM FOM_UPDATA.
PERFORM FOM_GETDATA.
PERFORM FRM_DISPLAY.
ENDIF.
ELSE.
PERFORM FOM_GETDATA.
PERFORM FRM_DISPLAY.
ENDIF.
PP-工单发料批次调整(开发笔记)
最新推荐文章于 2024-02-11 19:14:44 发布