MM-盘点差异导入程序

*&---------------------------------------------------------------------*
*& Report ZMMR110
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZMMR110.
TABLES:SSCRFIELDS.
TYPE-POOLS:SLIS.

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

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

TYPESBEGIN OF GTS_DATA,
         MTSNR     TYPE  GOHEAD-MTSNR,                      "物料单
         BKTXT     TYPE  GOHEAD-BKTXT,                      "凭证抬头文本
         MATNR     TYPE  MARD-MATNR,                        "物料
         MAKTX     TYPE  MAKT-MAKTX,                        "物料描述
         WERKS     TYPE  MARD-WERKS,                        "工厂
         LGORT     TYPE  MARD-LGORT,                        "仓库
         SOBKZ     TYPE  MSKA-SOBKZ,                        "特殊库存
         VBELN     TYPE  MSKA-VBELN,                        "销售订单
         POSNR     TYPE  MSKA-POSNR,                        "销售订单项目号
         LIFNR     TYPE  MSLB-LIFNR,                        "供应商编码
         CHARG     TYPE  MCHB-CHARG,                        "批次
         MEINS     TYPE  MARA-MEINS,                        "单位
         LABST     TYPE  MARD-LABST,                        "差异数量
         BWART     TYPE  MSEG-BWART,                        "移动类型
         MATDOC    TYPE  BAPI2017_GM_HEAD_RET-MAT_DOC,      "物料凭证
         ZSFCG     TYPE  CHAR3,                             "是否成功
         MESSAGE   TYPE  BAPI_MSG,                          "报错信息
         CELLCOLOR TYPE  LVC_T_SCOL,                        "单元格颜色
       END OF GTS_DATA.

DATAGT_DATA   TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGT_DATA_A TYPE TABLE OF GTS_DATA WITH HEADER LINE.

SELECTION-SCREENFUNCTION KEY 1.

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
PARAMETERSP_BLDAT TYPE MATDOC-BLDAT MODIF ID C1 OBLIGATORY.                    "凭证日期
PARAMETERSP_BUDAT TYPE  MATDOC-BUDAT  MODIF ID C1 OBLIGATORY.                  "过账日期
PARAMETERSP_FILE LIKE RLGRAP-FILENAME OBLIGATORY.
SELECTION-SCREEN END OF BLOCK B1.

IF P_FILE IS INITIAL .
  MESSAGE  '没有选择文件!TYPE 'E'.
ENDIF.

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_DATA[] .
  LOOP AT GT_EXDATA.
    CASE GT_EXDATA-COL.
      WHEN 1.
        GT_DATA-MTSNR GT_EXDATA-VALUE.
      WHEN 2.
        GT_DATA-BKTXT GT_EXDATA-VALUE.
      WHEN 3.
        GT_DATA-MATNR GT_EXDATA-VALUE.
      WHEN 4.
        GT_DATA-MAKTX GT_EXDATA-VALUE.
      WHEN 5.
        GT_DATA-WERKS GT_EXDATA-VALUE.
      WHEN 6.
        GT_DATA-LGORT GT_EXDATA-VALUE.
      WHEN 7.
        GT_DATA-SOBKZ GT_EXDATA-VALUE.
      WHEN 8.
        GT_DATA-VBELN GT_EXDATA-VALUE.
      WHEN 9.
        GT_DATA-POSNR GT_EXDATA-VALUE.
      WHEN 10.
        GT_DATA-LIFNR GT_EXDATA-VALUE.
      WHEN 11.
        GT_DATA-CHARG GT_EXDATA-VALUE.
      WHEN 12.
        GT_DATA-MEINS GT_EXDATA-VALUE.
      WHEN 13.
        GT_DATA-LABST GT_EXDATA-VALUE.
      WHEN 14.
        GT_DATA-BWART GT_EXDATA-VALUE.
        APPEND GT_DATA."append要加在最后一列.
        CLEAR GT_DATA.
    ENDCASE.
  ENDLOOP.

  LOOP AT GT_DATA.

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

    IF GT_DATA-VBELN IS NOT INITIAL.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  GT_DATA-VBELN
        
IMPORTING
          OUTPUT GT_DATA-VBELN.
    ENDIF.

    IF GT_DATA-POSNR IS NOT INITIAL.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  GT_DATA-POSNR
        
IMPORTING
          OUTPUT GT_DATA-POSNR.
    ENDIF.

    TRANSLATE GT_DATA-LGORT TO UPPER CASE.
    TRANSLATE GT_DATA-MATNR TO UPPER CASE.

    CLEAR GOODSMVT_HEADER .
    CLEAR GOODSMVT_CODE .
    GOODSMVT_HEADER-PSTNG_DATE   P_BUDAT.         "过账日期
    GOODSMVT_HEADER-DOC_DATE     P_BLDAT.         "凭证日期
    GOODSMVT_HEADER-PR_UNAME     SY-UNAME.        "用户名
    GOODSMVT_HEADER-REF_DOC_NO   GT_DATA-MTSNR.   "物料单
    GOODSMVT_HEADER-HEADER_TXT   GT_DATA-BKTXT.   "凭证抬头文本
    GOODSMVT_CODE '05' .

    CLEAR GOODSMVT_ITEM[] .
    GOODSMVT_ITEM-MATERIAL_LONG   GT_DATA-MATNR.  "物料编码
*    GOODSMVT_ITEM-ITEM_TEXT       = GT_DATA-MAKTX.  "物料描述
    GOODSMVT_ITEM-PLANT           GT_DATA-WERKS.  "工厂
    GOODSMVT_ITEM-STGE_LOC        GT_DATA-LGORT.  "入库仓库
    GOODSMVT_ITEM-SPEC_STOCK      GT_DATA-SOBKZ.  "特殊库存
    GOODSMVT_ITEM-VAL_SALES_ORD   GT_DATA-VBELN.  "销售订单
    GOODSMVT_ITEM-VAL_S_ORD_ITEM  GT_DATA-POSNR.  "销售订单项目号
    GOODSMVT_ITEM-VENDOR          GT_DATA-LIFNR.  "供应商编码
    GOODSMVT_ITEM-BATCH           GT_DATA-CHARG.  "批次
    GOODSMVT_ITEM-ENTRY_UOM       GT_DATA-MEINS.  "单位
    GOODSMVT_ITEM-ENTRY_QNT       GT_DATA-LABST.  "入库数量
    GOODSMVT_ITEM-MOVE_TYPE       GT_DATA-BWART.  "移动类型
    APPEND GOODSMVT_ITEM .
    CLEAR GOODSMVT_ITEM .

    CLEAR GOODSMVT_ITEM .
    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 GT_DATA-MESSAGE .
    LOOP AT RETURN WHERE TYPE 'E'.
      GT_DATA-MESSAGE GT_DATA-MESSAGE && RETURN-MESSAGE .
    ENDLOOP.

    IF SY-SUBRC .
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      GT_DATA-ZSFCG '!' .

      CLEAR IW_CELLCOLOR .
      IW_CELLCOLOR-FNAME 'MESSAGE'.
      IW_CELLCOLOR-COLOR-COL 6.
      IW_CELLCOLOR-COLOR-INT 0.
      IW_CELLCOLOR-COLOR-INV 0.
      APPEND IW_CELLCOLOR TO GT_DATA-CELLCOLOR.

    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT 'X'.

      GT_DATA-ZSFCG '.
      GT_DATA-MATDOC MATERIALDOCUMENT .

    ENDIF.

    MODIFY GT_DATA .
    CLEAR GT_DATA.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY .
  CLEAR S_LAYOUT.
  S_LAYOUT-ZEBRA 'X'.
  S_LAYOUT-COLWIDTH_OPTIMIZE 'X'.
  S_LAYOUT-COLTAB_FIELDNAME 'CELLCOLOR'"单元格颜色内表字段
*  s_layout-box_fieldname    = 'BOX'.
  PERFORM FRM_FILL_FIELD .

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      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[].
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 =  'MSLJH' or wa_fieldcat-fieldname =  'WCBJH'.
*      wa_fieldcat-EMPHASIZE = 'C600'. "设置字段的颜色
*    ENDIF.
*
*    IF wa_fieldcat-fieldname =  'MSLMB' or wa_fieldcat-fieldname =  'WCBMB'.
*      wa_fieldcat-EMPHASIZE = 'C710'. "设置字段的颜色
*    ENDIF.

    IF wa_fieldcat-fieldname 'PLNBEZ' OR wa_fieldcat-fieldname 'MATNR' .
      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.

    APPEND wa_fieldcat TO gt_fieldcat.
    CLEAR wa_fieldcat.
  END-OF-DEFINITION.
  FILL_FIELD :
        'MTSNR'    '物料单',
        'BKTXT'    '凭证抬头文本',
        'MATNR'    '物料',
        'MAKTX'    '物料描述',
        'WERKS'    '工厂',
        'LGORT'    '仓库',
        'SOBKZ'    '特殊库存',
        'VBELN'    '销售订单',
        'POSNR'    '销售订单项目号',
        'LIFNR'    '供应商编码',
        'CHARG'    '批次',
        'MEINS'    '单位',
        'LABST'    '差异数量',
        'BWART'    '移动类型',
        'MATDOC'   '物料凭证',
        'ZSFCG'    '是否成功',
        'MESSAGE'  '报错信息'.
ENDFORM.

FORM PF_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.
  SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM.

FORM USER_COMMAND USING I_UCOMM LIKE SY-UCOMM
                    IS_SELFIELD 
TYPE SLIS_SELFIELD.
  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 '&IC1'."表示双击

    WHEN 'POST_T'.
  ENDCASE.

  CALL METHOD REF->REFRESH_TABLE_DISPLAY
    
EXPORTING
      IS_STABLE LV_STABLE.
ENDFORM.

*--------------------------------------------------------------------*
*       获取下载到本地的路径
*--------------------------------------------------------------------*
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 'ZMMR110'.
*&---下载模板
      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.
  PERFORM FOM_UPDATA.
  PERFORM FRM_DISPLAY.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值