PP-工单发料批次调整(开发笔记)

*&---------------------------------------------------------------------*
*& 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 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 WITH HEADER LINE.
DATA:LS_STYLE TYPE LVC_S_STYL,
     LT_STYLE TYPE TABLE OF LVC_S_STYL.

TYPESBEGIN 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.

TYPESBEGIN 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.

DATAGT_EXCEL  TYPE TABLE OF GTS_EXCEL WITH HEADER LINE.
DATAGT_DATA   TYPE TABLE OF ZTGDPC  WITH HEADER LINE.
DATAGT_ALV    TYPE TABLE OF GTS_ALV WITH HEADER LINE.
DATAGT_ALV_A  TYPE TABLE OF GTS_ALV WITH HEADER LINE.
DATAGT_ALV_B  TYPE TABLE OF GTS_ALV WITH HEADER LINE.
DATAGT_ALV_C  TYPE TABLE OF GTS_ALV WITH HEADER LINE.
DATAGT_ALV_D  TYPE TABLE OF GTS_ALV WITH HEADER LINE.
DATAGT_ALV_E  TYPE TABLE OF GTS_ALV WITH HEADER LINE.
DATAMESSAGE   TYPE BAPI_MSG.                    "报错信息.

SELECTION-SCREENFUNCTION KEY .

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-OPTIONSS_MATNR  FOR   ZTGDPC-MATNR     MODIF ID MXY .                          "子件物料编码
SELECT-OPTIONSS_AUFN1  FOR   ZTGDPC-AUFNR1    MODIF ID MXY .                          "工单1
SELECT-OPTIONSS_AUFN2  FOR   ZTGDPC-AUFNR2    MODIF ID MXY .                          "工单2
SELECT-OPTIONSS_DATUM  FOR   ZTGDPC-DATUM     MODIF ID MXY .                          "导入日期
SELECT-OPTIONSS_UNAME  FOR   ZTGDPC-UNAME     MODIF ID MXY .                          "用户名
SELECT-OPTIONSS_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 <> 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 * -.
      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 * -.
      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.
  DATAREF TYPE REF TO CL_GUI_ALV_GRID.
  DATA LV_STABLE TYPE LVC_S_STBL.   "刷新稳定性
  RANGESL_WERKS FOR T001W-WERKS.
  RANGESL_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 WITH HEADER LINE.
  DATA RETURN           LIKE BAPIRET2 OCCURS 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 ).
        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 * -.
        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 =  .
      GT_ALV_A-STAND  'E'.
      GT_ALV_A-TYPAI  '@0A@'.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT 'X'.
      GT_ALV_A-COURSE   =  .
      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 WITH HEADER LINE.
  DATA RETURN           LIKE BAPIRET2 OCCURS 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 AND  GT_ALV-STAND  'S' OR GT_ALV-COURSE ).
        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 * -.
        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 =  .
      GT_ALV_A-STAND  'E'.
      GT_ALV_A-TYPAI  '@0A@'.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT 'X'.
      GT_ALV_A-COURSE   =  .
      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 WITH HEADER LINE.
  DATA RETURN           LIKE BAPIRET2 OCCURS WITH HEADER LINE.
  DATA:GT_MSEG          TYPE TABLE OF MSEG WITH HEADER LINE .

  WAIT UP TO SECONDS .

  CLEAR GT_ALV_A[] .
  LOOP AT GT_ALV.
    IF GT_ALV-CKBOX IS NOT INITIAL
      .
      IF GT_ALV-COURSE AND GT_ALV-STAND  'S' OR GT_ALV-COURSE ).
        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 =  .
      GT_ALV_A-STAND  'E'.
      GT_ALV_A-TYPAI  '@0A@'.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT 'X'.
      GT_ALV_A-COURSE  =  .
      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 WITH HEADER LINE.
  DATA RETURN           LIKE BAPIRET2 OCCURS 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 AND  GT_ALV-STAND  'S' OR GT_ALV-COURSE 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 =  .
      GT_ALV_A-STAND  'E'.
      GT_ALV_A-TYPAI  '@0A@'.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT 'X'.
      GT_ALV_A-COURSE  =  .
      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.

  DATALV_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.
  DATALV_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.

  DATALV_FILENAME TYPE STRING,
        LV_RESULT,
        LV_SUBRC    TYPE SY-SUBRC.

  DATALV_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 OR LV_OBJDATA-OBJID EQ SPACE.
    CONCATENATE '模板文件:LV_OBJID '不存在,请用TCODESMW0进行加载'
    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.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值