SD-寄售仓库调拨程序(开发笔记)

*&---------------------------------------------------------------------*
*& Report ZSDR004
*&---------------------------------------------------------------------*
*& Author              :  NathanSun
*& Create Date         :  2019-06-26
*& Program Type        :  Report
*& Description         :  寄售仓库调拨程序
*&---------------------------------------------------------------------*
REPORT ZSDR004.

TABLES:AUFK,MATDOC,SSCRFIELDS,ZTJSDB,LIPS,VBAP.

TYPE-POOLS:SLIS,T001W,ICON.

"定义ALV输出所需变量
DATAS_LAYOUT    TYPE SLIS_LAYOUT_ALV,
      GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.

DATAGT_EXDATA TYPE ALSMEX_TABLINE OCCURS WITH HEADER LINE.
DATAIW_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.
DATALS_STYLE TYPE LVC_S_STYL,
      LT_STYLE TYPE TABLE OF LVC_S_STYL.

TYPESBEGIN OF GTS_EXCEL,
         VBELN    TYPE  ZTJSDB-VBELN,             "寄售补充订单
         POSNR    TYPE  ZTJSDB-POSNR,             "订单行项目
         KUNNR    TYPE  ZTJSDB-KUNNR,             "第三方仓的客户
         MATNR    TYPE  ZTJSDB-MATNR,             "物料
*         KWMENG   TYPE  ZTJSDB-KWMENG,           "调拨数量(库存单位)
         KWMENG   TYPE  CHAR18,                   "调拨数量(库存单位)
         DATUM_DB TYPE  ZTJSDB-DATUM_DB,          "调拨日期(实际过账日期)
       END OF GTS_EXCEL.

TYPESBEGIN OF GTS_ALV,
         CKBOX     TYPE  C,                       "选择列
         ZAUFNR    TYPE  ZTJSDB-ZAUFNR,           "流水号
         VBELN     TYPE  ZTJSDB-VBELN,            "寄售补充订单
         POSNR     TYPE  ZTJSDB-POSNR,            "订单行项目
         KUNNR     TYPE  ZTJSDB-KUNNR,            "第三方仓的客户
         KWMENG    TYPE  ZTJSDB-KWMENG,           "调拨数量(库存单位)
         DATUM_DB  TYPE  ZTJSDB-DATUM_DB,         "调拨日期(实际过账日期)
         KUNNR_SO  TYPE  VBAK-KUNNR,              "客户
         NAME1     TYPE  KNA1-NAME1,              "客户名称
         MATNR     TYPE  VBAP-MATNR,              "物料
         MAKTX     TYPE  MAKT-MAKTX,              "物料描述
         CMGST     TYPE  VBAK-CMGST,              "信用状态
         ABGRU     TYPE  VBAP-ABGRU,              "拒绝原因
         WERKS     TYPE  VBAP-WERKS,              "工厂
         LIFSK     TYPE  VBAK-LIFSK,              "交货冻结
         LFGSA     TYPE  VBAP-LFGSA,              "项目交货状态
         EDATU     TYPE  VBEP-EDATU,              "订单首个交期
         KWMENG_SO TYPE  VBAP-KWMENG,             "订单数量
         VRKME     TYPE  VBAP-VRKME,              "单位
         OMENG     TYPE  VBBE-OMENG,              "未清数量
         MEPBO     TYPE  BAPI_MSG,                "检查信息
         TYPBO     TYPE  CHAR4,                   "检查信息类型
         VBELN_DN  TYPE  ZTJSDB-VBELN_DN,         "KB-DN单号#
         MBLNR_DN  TYPE  ZTJSDB-MBLNR_DN,         "DN单发货过账凭证
         MBLNR_ZC  TYPE  ZTJSDB-MBLNR_ZC,         "总仓退仓凭证
         MBLNR_DB  TYPE  ZTJSDB-MBLNR_DB,         "调拨至第三方仓凭证
         MEPAI     TYPE  BAPI_MSG,                "导入处理的信息
         COURSE    TYPE  ZTJSDB-COURSE,           "执行进程
         STAND     TYPE  ZTJSDB-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 ZTJSDB WITH HEADER LINE.
DATAGT_ALV    TYPE TABLE OF GTS_ALV WITH HEADER LINE.
DATAGT_ALV_A  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
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_VBEDN  FOR   LIPS-VBELN       MODIF ID MXY .                          "DN
SELECT-OPTIONSS_VBELN  FOR   VBAP-VBELN       MODIF ID MXY .                          "SO
SELECT-OPTIONSS_DATUM  FOR   ZTJSDB-DATUM     MODIF ID MXY .                          "导入日期
SELECT-OPTIONSS_UNAME  FOR   ZTJSDB-UNAME     MODIF ID MXY .                          "用户名
SELECT-OPTIONSS_STAND  FOR   ZTJSDB-STAND     MODIF ID MXY .                          "处理状态
PARAMETERS:     P_VSTEL  TYPE  VSTEL            MODIF ID MXY DEFAULT 'FG01' OBLIGATORY"装运地点
SELECTION-SCREEN END OF BLOCK B2.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN  .
    "控制下拉列表(文本框也是一样)的必输性:外观上打钩,但不自动校验
    IF P_RD1 '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 '3'
      I_END_COL   '50'
      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-VBELN GT_EXDATA-VALUE.
      WHEN 2.
        GT_EXCEL-POSNR GT_EXDATA-VALUE.
      WHEN 3.
        GT_EXCEL-KUNNR GT_EXDATA-VALUE.
      WHEN 4.
        GT_EXCEL-MATNR GT_EXDATA-VALUE.
      WHEN 5.
        GT_EXCEL-KWMENG GT_EXDATA-VALUE.
      WHEN 6.
        GT_EXCEL-DATUM_DB GT_EXDATA-VALUE.
    ENDCASE.

    IF FLAG IS NOT INITIAL.
      APPEND GT_EXCEL."append要加在最后一列.
      CLEAR GT_EXCEL.
    ENDIF.
    CLEAR GT_EXDATA.
  ENDLOOP.

  CLEAR GT_DATA[] .
  LOOP AT GT_EXCEL.
    GT_DATA-VBELN    GT_EXCEL-VBELN .
    GT_DATA-POSNR    GT_EXCEL-POSNR .
    GT_DATA-KUNNR    GT_EXCEL-KUNNR .
    GT_DATA-MATNR    GT_EXCEL-MATNR .
*    GT_DATA-KWMENG   = GT_EXCEL-KWMENG .
    GT_DATA-DATUM_DB GT_EXCEL-DATUM_DB .

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  GT_DATA-VBELN
      
IMPORTING
        OUTPUT GT_DATA-VBELN.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  GT_DATA-KUNNR
      
IMPORTING
        OUTPUT GT_DATA-KUNNR.

    CALL FUNCTION 'UNITS_STRING_CONVERT'
      EXPORTING
        UNITS_STRING GT_EXCEL-KWMENG
        DCPFM        
'X'       "此时为X
*       MLLN         = 'M'
*       TSND         = 'T'
      IMPORTING
        UNITS        GT_DATA-KWMENG
      
EXCEPTIONS
        INVALID_TYPE 1
        OTHERS       2.

    CALL FUNCTION 'NUMBER_GET_NEXT'
      EXPORTING
        NR_RANGE_NR '01' "上面起始编号前面的序号
        OBJECT      'ZTLD01' "编号对象
      IMPORTING
        NUMBER      GT_DATA-ZAUFNR.

    GT_DATA-DATUM SY-DATUM .
    GT_DATA-UZEIT SY-UZEIT .
    GT_DATA-UNAME SY-UNAME .
    APPEND GT_DATA .
    CLEAR  GT_DATA .
    CLEAR  GT_EXCEL .
  ENDLOOP.

  MODIFY ZTJSDB FROM TABLE GT_DATA[] .
  COMMIT WORK .
  MESSAGE '保存成功!TYPE 'S'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_GETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FOM_GETDATA .
  DATA GT_VBBE TYPE TABLE OF VBBE WITH HEADER LINE .
  DATA GT_VBAP TYPE TABLE OF VBAP WITH HEADER LINE .

  CLEAR GT_ALV[].
  SELECT
    ZTJSDB~ZAUFNR
    ZTJSDB
~VBELN
    ZTJSDB
~POSNR
    ZTJSDB
~MATNR
    ZTJSDB
~KWMENG
    ZTJSDB
~KUNNR
    ZTJSDB
~DATUM_DB
    ZTJSDB
~VBELN_DN
    ZTJSDB
~MBLNR_DN
    ZTJSDB
~MBLNR_ZC
    ZTJSDB
~MBLNR_DB
    ZTJSDB
~COURSE
    ZTJSDB
~STAND
    ZTJSDB
~MESSAGE AS MEPAI
    
INTO CORRESPONDING FIELDS OF TABLE GT_ALV[] FROM ZTJSDB
    
WHERE VBELN    IN S_VBELN
      
AND VBELN_DN IN S_VBEDN
      
AND DATUM    IN S_DATUM
      
AND UNAME    IN S_UNAME
      
AND STAND    IN S_STAND
      
.

  LOOP AT GT_ALV.
*未清数量
    CLEAR GT_VBAP .
    SELECT SINGLE UMZIZ UMZIN INTO CORRESPONDING FIELDS OF GT_VBAP FROM VBAP
      
WHERE VBELN GT_ALV-VBELN
        
AND POSNR GT_ALV-POSNR
        
.
    CLEAR GT_VBBE[] .
    SELECT VBELN POSNR OMENG INTO CORRESPONDING FIELDS OF TABLE GT_VBBE FROM VBBE
      
WHERE VBELN GT_ALV-VBELN
        
AND POSNR GT_ALV-POSNR
        
.
    LOOP AT GT_VBBE.
      IF GT_VBAP-UMZIZ <> 0.
        GT_VBBE-OMENG GT_VBBE-OMENG * GT_VBAP-UMZIN / GT_VBAP-UMZIZ .
      ENDIF.
      GT_ALV-OMENG GT_ALV-OMENG + GT_VBBE-OMENG .
      CLEAR  GT_VBBE .
    ENDLOOP.

    SELECT SINGLE VBELN INTO @DATA(LV_VBELNFROM VBAK
      
WHERE VBELN @GT_ALV-VBELN
        
AND AUART 'KB'
        .
    IF GT_ALV-COURSE IS INITIAL.
      .
      IF LV_VBELN IS INITIAL.
        GT_ALV-MEPBO '不存在订单!'.
        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 .
        SELECT SINGLE KUNNR INTO @DATA(LV_KUNNRFROM KNA1
          
WHERE KUNNR @GT_ALV-KUNNR
            
.
        IF LV_KUNNR IS INITIAL.
          GT_ALV-MEPBO '第三方仓客户不存在!'.
          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 .
          SELECT SINGLE MATNR INTO @DATA(LV_MATNRFROM VBAP
            
WHERE VBELN @GT_ALV-VBELN
              
AND POSNR @GT_ALV-POSNR
*            AND MATNR = @GT_ALV-MATNR
              .
          IF LV_MATNR <> GT_ALV-MATNR .
            GT_ALV-MEPBO '订单行项目物料和导入文档的物料不一致!'.
            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.
            IF GT_ALV-KWMENG > GT_ALV-OMENG.
              GT_ALV-MEPBO '导入转移总数为&& GT_ALV-KWMENG && '大于未清数量&& GT_ALV-OMENG .
              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 .
              SELECT ZAUFNR INTO TABLE @DATA(GT_ZAUFNRFROM ZTJSDB
                
WHERE VBELN @GT_ALV-VBELN
                  
AND POSNR @GT_ALV-POSNR
                  
AND KUNNR @GT_ALV-KUNNR
                  
.
              IF LINESGT_ZAUFNR[] 1.
                GT_ALV-MEPBO '同第三方仓的客户、订单、项目的数据存在多条!.
                GT_ALV-TYPBO '@09@'.
                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.
            ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.
    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 .
    SELECT SINGLE KUNNR CMGST LIFSK INTO GT_ALV-KUNNR_SO ,GT_ALV-CMGST ,GT_ALV-LIFSK FROM VBAK
      
WHERE VBELN GT_ALV-VBELN
      
.
    SELECT SINGLE ABGRU LFGSA KWMENG VRKME WERKS INTO GT_ALV-ABGRU ,GT_ALV-LFGSA ,GT_ALV-KWMENG_SO ,GT_ALV-VRKME ,GT_ALV-WERKS FROM VBAP
      
WHERE VBELN GT_ALV-VBELN
        
AND POSNR GT_ALV-POSNR
       
.
    SELECT SINGLE EDATU INTO GT_ALV-EDATU FROM VBEP
      
WHERE VBELN GT_ALV-VBELN
        
AND POSNR GT_ALV-POSNR
        
.
    SELECT SINGLE NAME1 INTO GT_ALV-NAME1 FROM KNA1
      
WHERE KUNNR GT_ALV-KUNNR_SO
      
.
    SELECT SINGLE MAKTX INTO GT_ALV-MAKTX FROM MAKT
      
WHERE MATNR GT_ALV-MATNR
      
.

    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.
    CLEAR LV_VBELN.
    CLEAR LV_KUNNR.
    CLEAR LV_MATNR.
    CLEAR GT_ZAUFNR.
  ENDLOOP.

  SORT GT_ALV[] BY KUNNR VBELN_DN VBELN POSNR .

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 .
  IF P_RD2 IS NOT INITIAL.
    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_DATA[].
  ELSE .
    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[].
  ENDIF.
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.
  IF P_RD2 IS NOT INITIAL.
    FILL_FIELD :
   'ZAUFNR'   '数据流水号',
   'VBELN'    '寄售补充订单',
   'POSNR'    '订单行项目',
   'KUNNR'    '第三方仓的客户',
   'MATNR'    '物料',
   'MAKTX'    '物料描述',
   'KWMENG'   '调拨数量(库存单位)',
   'DATUM_DB' '调拨日期(实际过账日期)'.
  ELSE.
    FILL_FIELD :
   'CKBOX'    '选择列',
   'ZAUFNR'   '数据流水号',
   'VBELN'    '寄售补充订单',
   'POSNR'    '订单行项目',
   'KUNNR'    '第三方仓的客户',
   'KWMENG'   '调拨数量(库存单位)',
   'DATUM_DB' '调拨日期(实际过账日期)',
   'KUNNR_SO' '客户',
   'NAME1'    '客户名称',
   'MATNR'    '物料',
   'MAKTX'    '物料描述',
   'CMGST'    '信用状态',
   'ABGRU'    '拒绝原因',
   'LIFSK'    '交货冻结',
   'LFGSA'    '项目交货状态',
   'EDATU'    '订单首个交期',
   'KWMENG_SO'  '订单数量',
   'OMENG'    '未清数量',
   'MEPBO'    '检查信息',
   'TYPBO'    '检查信息类型',
   'VBELN_DN' 'KB-DN单号',
   'MBLNR_DN' 'DN单发货过账凭证',
   'MBLNR_ZC' '总仓退仓凭证',
   'MBLNR_DB' '调拨至第三方仓凭证',
   'MEPAI'    '导入处理的信息',
   'COURSE'   '进程',
*   'STAND'    '执行状态',
   'TYPAI'    '导入处理的消息类型'.
  ENDIF.
ENDFORM.

FORM PF_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.
  IF P_RD2 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'.
*1,Generates Delivery for Customer Order
      PERFORM FOM_CREATE_DN.
*2,Outbound Delivery Confirmation
      PERFORM FOM_POST_DN.
*3,Post Goods Movements with 632
      PERFORM GOODSMVT_CREATE_T.
*3,Post Goods Movements with 631
      PERFORM GOODSMVT_CREATE_J.
  ENDCASE.

  CALL METHOD REF->REFRESH_TABLE_DISPLAY
    
EXPORTING
      IS_STABLE LV_STABLE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_CREATE_DN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FOM_CREATE_DN .
  DATA LV_SHIP_POINT TYPE          BAPIDLVCREATEHEADER-SHIP_POINT,
         LV_DUE_DATE   TYPE          BAPIDLVCREATEHEADER-DUE_DATE,
         LV_DELIVERY   TYPE          BAPISHPDELIVNUMB-DELIV_NUMB,
         LT_SO_ITEMS   LIKE TABLE OF BAPIDLVREFTOSALESORDER,
         LS_SO_ITEM    LIKE          BAPIDLVREFTOSALESORDER,
         LT_STO_ITEMS  LIKE TABLE OF BAPIDLVREFTOSTO,
         LS_STO_ITEM   LIKE          BAPIDLVREFTOSTO,
         LT_RETURN     LIKE TABLE OF BAPIRET2,
         LS_RETURN     LIKE          BAPIRET2.

  CLEAR GT_ALV_A[] .
  LOOP AT GT_ALV.
    IF GT_ALV-CKBOX IS NOT INITIAL
      AND GT_ALV-CKBOX <> '@0A@'
      .
      IF GT_ALV-COURSE IS INITIAL OR GT_ALV-COURSE ).
        APPEND GT_ALV TO GT_ALV_A[].
      ENDIF.
    ENDIF.
    CLEAR GT_ALV .
  ENDLOOP.
  SORT GT_ALV_A[] BY KUNNR VBELN_DN VBELN POSNR.
  DELETE ADJACENT DUPLICATES FROM GT_ALV_A[] COMPARING KUNNR VBELN_DN VBELN.

  LOOP AT GT_ALV_A.
    CLEAR GT_ALV_A-MEPAI .
    LV_SHIP_POINT GT_ALV_A-WERKS.
    LV_DUE_DATE   SY-DATUM .
*    LV_DUE_DATE   = GT_ALV_A-DATUM_DB ."调拨日期
    CLEAR LT_SO_ITEMS[].
    LOOP AT GT_ALV WHERE KUNNR GT_ALV_A-KUNNR AND VBELN_DN IS INITIAL AND VBELN GT_ALV_A-VBELN AND CKBOX <> '@0A@' AND CKBOX IS NOT INITIAL.
      CLEAR LS_SO_ITEM.
      LS_SO_ITEM-REF_DOC    GT_ALV-VBELN.
      LS_SO_ITEM-REF_ITEM   GT_ALV-POSNR.
      LS_SO_ITEM-DLV_QTY    GT_ALV-KWMENG"数量
      LS_SO_ITEM-SALES_UNIT GT_ALV-VRKME.  "单位
      APPEND LS_SO_ITEM TO LT_SO_ITEMS.
      CLEAR GT_ALV .
    ENDLOOP.

* Call BAPI to Create DN
    CLEAR LT_RETURN[].
    CLEAR LV_DELIVERY.
    CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_SLS'
      EXPORTING
        SHIP_POINT        LV_SHIP_POINT
        DUE_DATE          
LV_DUE_DATE
      
IMPORTING
        DELIVERY          LV_DELIVERY
      
TABLES
        SALES_ORDER_ITEMS LT_SO_ITEMS
        
RETURN            LT_RETURN.

    CLEAR FLAG .
    LOOP AT LT_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 LT_RETURN[] COMPARING MESSAGE.
      LOOP AT LT_RETURN INTO LS_RETURN WHERE TYPE 'E'.
        GT_ALV_A-MEPAI GT_ALV_A-MEPAI && ';' && LS_RETURN-MESSAGE .
        CLEAR LS_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-VBELN_DN = LV_DELIVERY .
      GT_ALV_A-COURSE   =  .
      GT_ALV_A-STAND    'S'.

      UPDATE LIKP SET
        WADAT_IST GT_ALV_A-DATUM_DB
        LIFEX     
GT_ALV_A-KUNNR
      
WHERE VBELN LV_DELIVERY.
      COMMIT WORK .
    ENDIF.

    LOOP AT GT_ALV WHERE KUNNR GT_ALV_A-KUNNR AND VBELN_DN IS INITIAL AND VBELN GT_ALV_A-VBELN AND CKBOX <> '@0A@' AND CKBOX IS NOT INITIAL.
      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-VBELN_DN LV_DELIVERY .

      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.

      UPDATE ZTJSDB SET
          VBELN_DN GT_ALV-VBELN_DN
          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 FOM_POST_DN .
  DATA:
    HEADER_DATA    LIKE  BAPIOBDLVHDRCON                     "Header Data
    HEADER_CONTROL LIKE  BAPIOBDLVHDRCTRLCON                 "Control Data Confirmation Header Data
    DELIVERY       LIKE  BAPIOBDLVHDRCON-DELIV_NUMB          "DN

  DATA:
    RETURN LIKE TABLE OF BAPIRET2 WITH HEADER LINE .

  CLEAR GT_ALV_A[] .
  LOOP AT GT_ALV.
    IF GT_ALV-CKBOX IS NOT INITIAL
      AND GT_ALV-CKBOX <> '@0A@'
      .
      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.
  SORT GT_ALV_A[] BY VBELN_DN.
  DELETE ADJACENT DUPLICATES FROM GT_ALV_A[] COMPARING VBELN_DN .

  LOOP AT GT_ALV_A.

    CLEAR GT_ALV_A-MEPAI .
    CLEAR HEADER_DATA .
    CLEAR HEADER_CONTROL .
    CLEAR DELIVERY .
    DELIVERY                    GT_ALV_A-VBELN_DN.
    HEADER_DATA-DELIV_NUMB      GT_ALV_A-VBELN_DN.
    HEADER_CONTROL-DELIV_NUMB   GT_ALV_A-VBELN_DN.
    HEADER_CONTROL-POST_GI_FLG  'X'.
    HEADER_CONTROL-VOLUME_FLG   'X'.

    CLEAR RETURN[].
    CALL FUNCTION 'BAPI_OUTB_DELIVERY_CONFIRM_DEC'
      EXPORTING
        HEADER_DATA    HEADER_DATA
        HEADER_CONTROL 
HEADER_CONTROL
        DELIVERY       
DELIVERY
      
TABLES
        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'.

      SELECT SINGLE VBELN INTO GT_ALV_A-MBLNR_DN FROM VBFA
        
WHERE VBELV   GT_ALV_A-VBELN_DN
          
AND VBTYP_N 'R'
          AND BWART   '631'
          .
    ENDIF.

    LOOP AT GT_ALV WHERE VBELN_DN GT_ALV_A-VBELN_DN .
      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-MBLNR_DN GT_ALV_A-MBLNR_DN .

      UPDATE ZTJSDB SET
          MBLNR_DN GT_ALV-MBLNR_DN
          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_T
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM GOODSMVT_CREATE_T .
  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.

  CLEAR GT_ALV_A[] .
  LOOP AT GT_ALV.
    IF GT_ALV-CKBOX IS NOT INITIAL
      AND GT_ALV-CKBOX <> '@0A@'
      .
      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.
  SORT GT_ALV_A[] BY VBELN_DN.
  DELETE ADJACENT DUPLICATES FROM GT_ALV_A[] COMPARING VBELN_DN .

  LOOP AT GT_ALV_A.

    CLEAR GOODSMVT_HEADER .
    CLEAR GOODSMVT_CODE .
    GOODSMVT_HEADER-PSTNG_DATE   GT_ALV_A-DATUM_DB.         "过账日期
    GOODSMVT_HEADER-DOC_DATE     GT_ALV_A-DATUM_DB.         "凭证日期
    GOODSMVT_HEADER-PR_UNAME     SY-UNAME.                  "用户名
    GOODSMVT_HEADER-HEADER_TXT   GT_ALV_A-VBELN_DN.         "抬头文本-退料单号
    GOODSMVT_CODE '03' .

    SELECT INTO CORRESPONDING FIELDS OF TABLE GT_LIPS[] FROM LIPS
      
WHERE VBELN GT_ALV_A-VBELN_DN
        
AND PSTYV 'TAN'
        .
    CLEAR GT_VBPA[] .
    SELECT PARVW  KUNNR INTO CORRESPONDING FIELDS OF TABLE GT_VBPA[] FROM VBPA
      
WHERE VBELN GT_ALV_A-VBELN
      
.

    LOOP AT GT_LIPS.
      GOODSMVT_ITEM-MATERIAL_LONG   GT_LIPS-MATNR.     "物料编码
      GOODSMVT_ITEM-PLANT           GT_LIPS-WERKS.     "工厂
      GOODSMVT_ITEM-STGE_LOC        P_VSTEL.           "入库仓库
      GOODSMVT_ITEM-BATCH           GT_LIPS-CHARG.     "批次
      GOODSMVT_ITEM-SALES_ORD       GT_ALV_A-VBELN.    "SO
      GOODSMVT_ITEM-S_ORD_ITEM      GT_ALV_A-POSNR.    "SO_ITEM
      GOODSMVT_ITEM-ENTRY_QNT       GT_LIPS-LFIMG.     "入库数量
      GOODSMVT_ITEM-ENTRY_UOM       GT_LIPS-MEINS.     "单位
      CLEAR GT_VBPA .
      READ TABLE GT_VBPA WITH KEY PARVW 'WE'.
      GOODSMVT_ITEM-CUSTOMER        GT_VBPA-KUNNR.     "客户
      GOODSMVT_ITEM-SPEC_STOCK      'E'.               "特殊库存标识
      GOODSMVT_ITEM-MOVE_TYPE       '632'.             "移动类型
      APPEND GOODSMVT_ITEM .
      CLEAR GOODSMVT_ITEM .
      CLEAR GT_LIPS .
    ENDLOOP.

    CLEAR GOODSMVT_HEADRET.
    CLEAR MATERIALDOCUMENT.
    CLEAR MATDOCUMENTYEAR.
    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-MBLNR_ZC MATERIALDOCUMENT .
    ENDIF.

    LOOP AT GT_ALV WHERE VBELN_DN GT_ALV_A-VBELN_DN .
      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-MBLNR_ZC GT_ALV_A-MBLNR_ZC .

      UPDATE ZTJSDB SET
          MBLNR_ZC GT_ALV-MBLNR_ZC
          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_J
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM GOODSMVT_CREATE_J .
  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.

  CLEAR GT_ALV_A[] .
  LOOP AT GT_ALV.
    IF GT_ALV-CKBOX IS NOT INITIAL
      AND GT_ALV-CKBOX <> '@0A@'
      .
      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.
  SORT GT_ALV_A[] BY VBELN_DN.
  DELETE ADJACENT DUPLICATES FROM GT_ALV_A[] COMPARING VBELN_DN .

  LOOP AT GT_ALV_A.

    CLEAR GOODSMVT_HEADER .
    CLEAR GOODSMVT_CODE .
    GOODSMVT_HEADER-PSTNG_DATE   GT_ALV_A-DATUM_DB.         "过账日期
    GOODSMVT_HEADER-DOC_DATE     GT_ALV_A-DATUM_DB.         "凭证日期
    GOODSMVT_HEADER-PR_UNAME     SY-UNAME.                  "用户名
    GOODSMVT_HEADER-HEADER_TXT   GT_ALV_A-VBELN_DN.         "抬头文本-退料单号
    GOODSMVT_CODE '03' .

    SELECT INTO CORRESPONDING FIELDS OF TABLE GT_LIPS[] FROM LIPS
      
WHERE VBELN GT_ALV_A-VBELN_DN
        
AND PSTYV 'TAN'
        .
    CLEAR GT_VBPA[] .
    SELECT PARVW  KUNNR INTO CORRESPONDING FIELDS OF TABLE GT_VBPA[] FROM VBPA
      
WHERE VBELN GT_ALV_A-VBELN
      
.
    LOOP AT GT_LIPS.
      GOODSMVT_ITEM-MATERIAL_LONG   GT_LIPS-MATNR.     "物料编码
      GOODSMVT_ITEM-PLANT           GT_LIPS-WERKS.     "工厂
      GOODSMVT_ITEM-STGE_LOC        P_VSTEL.           "入库仓库
      GOODSMVT_ITEM-BATCH           GT_LIPS-CHARG.     "批次
      GOODSMVT_ITEM-SALES_ORD       GT_ALV_A-VBELN.    "SO
      GOODSMVT_ITEM-S_ORD_ITEM      GT_ALV_A-POSNR.    "SO_ITEM
      GOODSMVT_ITEM-ENTRY_QNT       GT_LIPS-LFIMG.     "入库数量
      GOODSMVT_ITEM-ENTRY_UOM       GT_LIPS-MEINS.     "单位
      CLEAR GT_VBPA .
      READ TABLE GT_VBPA WITH KEY PARVW 'WE'.
      GOODSMVT_ITEM-CUSTOMER        GT_VBPA-KUNNR.    "客户
      GOODSMVT_ITEM-SPEC_STOCK      'E'.               "特殊库存标识
      GOODSMVT_ITEM-MOVE_TYPE       '631'.             "移动类型
      APPEND GOODSMVT_ITEM .
      CLEAR GOODSMVT_ITEM .
      CLEAR GT_LIPS .
    ENDLOOP.

    CLEAR GOODSMVT_HEADRET.
    CLEAR MATERIALDOCUMENT.
    CLEAR MATDOCUMENTYEAR.
    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-MBLNR_DB MATERIALDOCUMENT .
    ENDIF.

    LOOP AT GT_ALV WHERE VBELN_DN GT_ALV_A-VBELN_DN .
      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-MBLNR_DB GT_ALV_A-MBLNR_DB .

      UPDATE ZTJSDB SET
          MBLNR_DB GT_ALV-MBLNR_DB
          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 'ZSDR004'.
*&---下载模板
      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 FRM_DISPLAY.
    ENDIF.
  ELSE .
    PERFORM FOM_GETDATA.
    PERFORM FRM_DISPLAY.
  ENDIF.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值