此博客为原创博客,都是个人工作经历所得,转载请注明出处

ZMLSCP1_RE0008-批量创建物料凭证

FS:

1.	检查寄售库存是否足够:
Select SLABS 
From MKOL
Where matnr = 批量输入matnr and werk = 0批量输入plant
 and lifnr = 批量输入 vendor and sobkz = “K”
IF SLABS < 批量输入ENTRY_QNT
     MESSAGE ‘物料代码***的库存数量不足,请检查!’
   EXIT
ENDIF
2.	调用bapi记账(注意该bapi最大记录数量为300条,大于300条要进行拆分)
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
   EXPORTING 
    GOODSMVT_HEADER-PSTING_DATE  =  批量输入BUDAT
    GOODSMVT_HEADER- DOC_DATE  =  批量输入BUDAT
    GOODSMVT_CODE-GM_CODE = “04”
    GOODSMVT_ITEM-MATERIAL = 批量输入MATNR
    GOODSMVT_ITEM-PLANT = 批量输入PLANT
    GOODSMVT_ITEM-STGE_LOC = 批量输入STGE_LOC
    GOODSMVT_ITEM-MOVE_TYPE = “411“
    GOODSMVT_ITEM- SPEC_STOCK = “K”
    GOODSMVT_ITEM- VENDOR =  批量输入VENDOR
    GOODSMVT_ITEM-ENTRY_QNT = 批量输入ENTRY_QNT
    GOODSMVT_ITEM-BATCH = 批量输入BATCH
    GOODSMVT_ITEM- MOVE_PLANT = 批量输入PLANT
    GOODSMVT_ITEM- MOVE_STLOC = 批量输入STGE_LOC
 INPORTING 
    MATERIALDOCUMENT = W_ MATERIALDOCUMENT
    TYPE  =   W_ TYPE
    ID = W_ ID
    NUMBER = W_ NUMBER
    MESSAGE = W_ MESSAGE

输出格式(需要输出时,提供具体输出字段及格式,如果有样板文件,请附上)

  

1.导入格式:

技巧:按300line 分批创建物料凭证,
测试方法:将分批改成按几条来测试;3 line

2.对于程序处理:必须有抬头主键;
技巧:可以自己设定一个XBLNR,

 

3.需要提前检查物料的信息记录价格:BAPI_INFORECORD_GETLIST.

*& 寄售价格是否存在:
    CALL FUNCTION 'BAPI_INFORECORD_GETLIST'
      EXPORTING
        VENDOR              = LS_OUTPUT-LIFNR
        MATERIAL            = LS_OUTPUT-MATNR
        PLANT               = LS_OUTPUT-WERKS
        INFO_TYPE           = '2'
        PURCHORG_DATA       = 'X'
        GENERAL_DATA        = 'X'
      TABLES
        INFORECORD_GENERAL  = LT_GENERAL
        INFORECORD_PURCHORG = LT_PURCHORG
        RETURN              = LT_RETURN.
*& check INFORECORD_PURCHORG-NET_PRICE
    LOOP AT LT_PURCHORG WHERE NET_PRICE NE SPACE AND PRICE_DATE >= LS_OUTPUT-BUDAT.   "2017.12.31
    ENDLOOP.
    IF SY-SUBRC NE 0.
      LV_MSG = '寄售采购信息记录的价格不存在,请检查!'.
      CONCATENATE LS_OUTPUT-MESG LV_MSG INTO LS_OUTPUT-MESG SEPARATED BY ';'.
      G_GR = 'X'.
    ENDIF.

4.检查没有错误才创建GR:

************************************************************************
* MAIN logic'
************************************************************************
START-OF-SELECTION.

  PERFORM FRM_GET_EXCEL_DATA TABLES GT_INTERN.
*&check is all ok,create.
  IF G_GR NE 'X'.
    PERFORM FRM_GOODMVT_CREATE.
  ENDIF.
  PERFORM FRM_SHOW_DATA .

Source CODE:

*&---------------------------------------------------------------------*
*& Report          ZMLSCP1_RE0008
*& TITLE         : 批量创建物料凭证                                    *
*& MODULE NAME   : MM                                                  *
*& AUTHOR           : CX                                                  *
*& CREATE DATE   : 20170315                                            *
*& PROGRAM TYPE  : 功能开发                                            *
*& DESCRIPTION   : 导入excel,选中数据创建物料凭证                      *
*&                 1.excel导入指定字段(必输项?)到系统,
*&                 2.检查物料代码***的库存数量是否足够,不足报错,
*&                 3.对于库存检查ok 数据,每300条分批创建GR,
*&                   拿到返回结果显示ALV
*&---------------------------------------------------------------------*
*& MODIFICATION    LOG                                                    *
*&                                                                     *
*& DATE          AUTHOR             DESCRIPTION                        *
*& <DATE>        <修改人>           <更新的内容>                       *
*&---------------------------------------------------------------------*
REPORT  YDEMO_020 MESSAGE-ID ZMLSCP_001.

INCLUDE <ICON>.
TABLES:SSCRFIELDS.
TABLES:MKPF,
       MSEG,
       MKOL."供应商的特殊库存
*FUNCTION-POOL:SLIS.



TYPES:BEGIN OF TY_UPLOAD_STR,
        BUDAT TYPE STRING, "记账日期
        MATNR TYPE STRING, "物料代码
        WERKS TYPE STRING, "发出工厂
        LGORT TYPE STRING, "发出库存地
        MENGE TYPE STRING, "QUAN  13数量
        PLANT TYPE STRING, "接收工厂
        STLOC TYPE STRING, "接收库存地
        LIFNR TYPE STRING, "供应商代码
        CHARG TYPE STRING, "批次号
        MESG  TYPE STRING,
     END OF TY_UPLOAD_STR.

TYPES :BEGIN OF TY_UPLOAD,
        BUDAT TYPE BUDAT, "记账日期
        MATNR TYPE MATNR, "物料代码
        WERKS TYPE WERKS_D,"发出工厂
        LGORT TYPE LGORT_D,"发出库存地
        MENGE TYPE KTMNG,  "数量
        PLANT TYPE PLWRK,  "接收工厂
        STLOC TYPE LGORT_D,"接收库存地
        LIFNR TYPE LIFNR,  "供应商代码
        CHARG TYPE CHARG_D,"批次号
*是否加field?
        MBLNR    TYPE MBLNR, "success
        MESG     TYPE STRING,"error
        MSGTYPE  TYPE C,
        ZICON    TYPE CHAR4,
        LIGHT    TYPE C,
        ZLINE    TYPE SY-TABIX,
        XBLNR    TYPE XBLNR,
*        XSELP    TYPE C,"sel
      END OF TY_UPLOAD.

TYPES:TY_DATA(256)  TYPE C.
TYPES: BEGIN OF TY_MKPF,
        XBLNR TYPE XBLNR,
        BUDAT TYPE DATUM,
*        MBLNR TYPE MBLNR,
*        MJAHR TYPE GJAHR,
      END OF TY_MKPF.

DATA: GT_INTERN TYPE TABLE OF ALSMEX_TABLINE.
DATA: GT_ALV TYPE TABLE OF TY_UPLOAD,
      GT_UPLOAD TYPE TABLE OF TY_UPLOAD_STR,
      GT_FLDCT  TYPE STANDARD TABLE OF LVC_S_FCAT. "字段属性
DATA: GS_LAYOUT TYPE LVC_S_LAYO,
      G_GRID  TYPE REF TO CL_GUI_ALV_GRID.
DATA: G_GR    TYPE C.

* CLASS LCL_EVENT_RECEIVER DEFINITION
CONSTANTS:GCST_EXCEL_FILE     LIKE RLGRAP-FILENAME VALUE 'C:\Users\Administrator\Desktop\ZPP_ML51.xlsx'."EXCEL文件名
CONSTANTS:GCST_EXCEL_TEMPLATE LIKE WWWDATATAB-OBJID VALUE 'ZPP_ML51'. "数据模板,数据模板名称


*----------------------------------------------------------------------
*
*
*----------------------------------------------------------------------
CLASS LCL_EVENT_RECEIVER DEFINITION.
  PUBLIC SECTION.
    METHODS HANDLE_MODIFY
    FOR EVENT DATA_CHANGED_FINISHED OF CL_GUI_ALV_GRID
    IMPORTING E_MODIFIED
              ET_GOOD_CELLS.

ENDCLASS.                    "LCL_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------------
*
*       CLASS LCL_EVENT_RECEIVER IMPLEMENTATION
*----------------------------------------------------------------------
*
*
*----------------------------------------------------------------------
CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.
  METHOD HANDLE_MODIFY.

    DATA STBL TYPE LVC_S_STBL.
    DATA:L_ERR_FLG TYPE C,
         L_FIELDNAME TYPE LVC_FNAME.
    DATA:LT_MSG TYPE STANDARD TABLE OF BAPIRET2.
    DATA:LS_CURRENT_CELL TYPE LVC_S_MODI.

    DATA: L_ROW  TYPE I,
          L_VALUE  TYPE C,
          L_COL  TYPE I,
          LS_ROW_ID  TYPE LVC_S_ROW,
          LS_COL_ID  TYPE LVC_S_COL,
          LS_ROW_NO  TYPE LVC_S_ROID,
          LS_OUTPUT TYPE TY_UPLOAD,
          LV_XBLNR  TYPE XBLNR,
          LV_CHECK  TYPE C.
    CLEAR: LV_XBLNR,LV_CHECK .
    CHECK E_MODIFIED = 'X'.

*    READ TABLE ET_GOOD_CELLS INTO LS_CURRENT_CELL INDEX 1.
*    L_ROW = LS_CURRENT_CELL-ROW_ID.
*    L_FIELDNAME = LS_CURRENT_CELL-FIELDNAME.
*    CHECK L_FIELDNAME = 'XSELP'.
*    READ TABLE GT_ALV INTO LS_OUTPUT INDEX L_ROW.
*    IF SY-SUBRC = 0.
*      LV_XBLNR = LS_OUTPUT-XBLNR.
*      LV_CHECK = LS_OUTPUT-XSELP.
*    ENDIF.
*    LOOP AT GT_ALV INTO LS_OUTPUT WHERE XBLNR = LV_XBLNR  .
*      LS_OUTPUT-XSELP = LV_CHECK.
*      MODIFY GT_ALV FROM LS_OUTPUT TRANSPORTING XSELP.
*    ENDLOOP.

*   稳定刷新
    STBL-ROW = 'X'." 基于行的稳定刷新
    STBL-COL = 'X'." 基于列稳定刷新
    CALL METHOD G_GRID->REFRESH_TABLE_DISPLAY
      EXPORTING
        IS_STABLE = STBL.

  ENDMETHOD.                    "HANDLE_MODIFY

ENDCLASS.                    "LCL_EVENT_RECEIVER IMPLEMENTATION

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-T01.

SELECTION-SCREEN:FUNCTION KEY 1.
PARAMETERS:P_UPLOAD LIKE RLGRAP-FILENAME MEMORY ID WS OBLIGATORY ."DEFAULT GCST_EXCEL_FILE.
PARAMETERS:P_COUNT TYPE SY-TABIX DEFAULT 300 NO-DISPLAY.
SELECTION-SCREEN END OF BLOCK B1.

*&->(添加模板导入)
INITIALIZATION.
  DATA LS_FUNCTXT TYPE SMP_DYNTXT.
*&启用自定义工具
  CLEAR LS_FUNCTXT.
  LS_FUNCTXT-ICON_TEXT = '下载模板'.
  LS_FUNCTXT-ICON_ID   = '@49@'.
  LS_FUNCTXT-QUICKINFO = '下载模板'.
  SSCRFIELDS-FUNCTXT_01 = LS_FUNCTXT.
  GET PARAMETER ID 'WS' FIELD P_UPLOAD.
  IF P_UPLOAD IS INITIAL.
* BREAK LZH.
    P_UPLOAD = GCST_EXCEL_FILE.
  ENDIF.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_UPLOAD.
  PERFORM FRM_OPEN_DIALOG.

************************************************************************
* AT SELECTION-SCREEN
************************************************************************
AT SELECTION-SCREEN.
  CLEAR SY-UCOMM.
  CASE SSCRFIELDS-UCOMM.
    WHEN 'FC01'.
      PERFORM FRM_DOWNLOAD_TEMPLATE CHANGING P_UPLOAD.
* WHEN 'FC02'.  "开启文件
*  PERFORM frm_open_excel_file USING p_file.
  ENDCASE.

  LOOP AT SCREEN.
    IF SCREEN-NAME EQ 'P_COUNT'.
      SCREEN-INPUT = '0'.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.

************************************************************************
* MAIN logic'
************************************************************************
START-OF-SELECTION.

  PERFORM FRM_GET_EXCEL_DATA TABLES GT_INTERN.
*&check is all ok,create.
  IF G_GR NE 'X'.
    PERFORM FRM_GOODMVT_CREATE.
  ENDIF.
  PERFORM FRM_SHOW_DATA .

  SET PARAMETER ID 'WS' FIELD P_UPLOAD.

*&---------------------------------------------------------------------*
*&      Form  FRM_OPEN_DIALOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_OPEN_DIALOG .
  DATA : LT_FILE_TABLE TYPE FILETABLE,
         LV_RC         TYPE I.
  DATA : LV_FILENAME TYPE STRING.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
    EXPORTING
      WINDOW_TITLE            = 'Select file'
*     default_extension       = 'XLS'
*     default_filename        =
*     file_filter             = cl_gui_frontend_services=>filetype_excel
*     with_encoding           =
*     initial_directory       =
      MULTISELECTION          = ' '
    CHANGING
      FILE_TABLE              = LT_FILE_TABLE
      RC                      = LV_RC
*     user_action             =
*     file_encoding           =
    EXCEPTIONS
      FILE_OPEN_DIALOG_FAILED = 1
      CNTL_ERROR              = 2
      ERROR_NO_GUI            = 3
      NOT_SUPPORTED_BY_GUI    = 4
      OTHERS                  = 5.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.

  READ TABLE LT_FILE_TABLE INTO LV_FILENAME INDEX 1.
  P_UPLOAD = LV_FILENAME.
ENDFORM.                    "frm_open_dialog
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_EXCEL_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GT_INTERN  text
*----------------------------------------------------------------------*
FORM FRM_GET_EXCEL_DATA TABLES PT_INTERN STRUCTURE ALSMEX_TABLINE.

  DATA: LS_INTERN TYPE ALSMEX_TABLINE.
  DATA: LS_INTERN_TEMP TYPE ALSMEX_TABLINE.
  DATA: LV_VALUE TYPE TY_DATA.
  DATA: LS_UPLOAD TYPE TY_UPLOAD_STR.
  DATA: LT_UPLOAD TYPE TABLE OF TY_UPLOAD_STR.
  DATA: LT_UPLOAD_DEL TYPE TABLE OF TY_UPLOAD_STR.
  FIELD-SYMBOLS: <FV_UPLOAD> TYPE ANY ."symbols.
  DATA:L_LINE TYPE SY-TABIX,
       L_LINE1 TYPE SY-TABIX.


  REFRESH PT_INTERN.
  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      FILENAME                = P_UPLOAD
      I_BEGIN_COL             = 1
      I_BEGIN_ROW             = 1
      I_END_COL               = 100
      I_END_ROW               = 10000
*     sheet_name              =
    TABLES
      INTERN                  = PT_INTERN
    EXCEPTIONS
      INCONSISTENT_PARAMETERS = 1
      UPLOAD_OLE              = 2
      OTHERS                  = 3.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE 'E' NUMBER SY-MSGNO
          WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4 .
  ENDIF.

  LOOP AT PT_INTERN INTO LS_INTERN_TEMP WHERE ROW > 1.
    LS_INTERN = LS_INTERN_TEMP.
    ASSIGN COMPONENT LS_INTERN-COL OF STRUCTURE LS_UPLOAD TO <FV_UPLOAD>.
    <FV_UPLOAD> = LS_INTERN-VALUE.

    AT END OF ROW.
      APPEND LS_UPLOAD TO LT_UPLOAD.
      CLEAR: LS_UPLOAD.
    ENDAT.
    CLEAR: LS_INTERN.
  ENDLOOP.

*&A1.检查数据重复:
  L_LINE = LINES( LT_UPLOAD[] ).
  SORT LT_UPLOAD BY BUDAT MATNR WERKS LGORT PLANT STLOC LIFNR.
  IF L_LINE = 0.
    MESSAGE I001 WITH '没有上传数据!'.
    STOP.
  ENDIF.

  LT_UPLOAD_DEL[] =  LT_UPLOAD[].
  SORT LT_UPLOAD_DEL.
  DELETE ADJACENT DUPLICATES FROM LT_UPLOAD_DEL COMPARING ALL FIELDS.
*         COMPARING BUDAT MATNR WERKS LGORT PLANT STLOC LIFNR.
  L_LINE1 = LINES( LT_UPLOAD_DEL[] ).
  IF L_LINE1 LT L_LINE.
    MESSAGE I001 WITH '导入数据有重复条目,请检查!'.
  ENDIF.

*&move data into GT_ALV[].
  PERFORM FRM_INVALID_CHECK TABLES LT_UPLOAD.

ENDFORM.                    "frm_get_excel_data
*&---------------------------------------------------------------------*
*&      Form  FRM_SHOW_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SHOW_DATA .
  DATA: L_S_GLAY TYPE LVC_S_GLAY .
  DATA: LT_EVENTS TYPE SLIS_T_EVENT.

  L_S_GLAY-EDT_CLL_CB = 'X'.
*  设置布局
  PERFORM FRM_LAYOUT_SET.
*  设置字段
  PERFORM FRM_SET_ALY_FIELDCAT_ACC.
*  设置ALV事件
*  PERFORM FRM_EVENTS_SET TABLES LT_EVENTS.
* 显示ALV
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
      IS_LAYOUT_LVC            = GS_LAYOUT           "布局
      IT_FIELDCAT_LVC          = GT_FLDCT[]          "字段
*     I_CALLBACK_PF_STATUS_SET = 'FRM_SET_STATUS' "状态
*     I_CALLBACK_USER_COMMAND  = 'FRM_USER_COMMAND' "用户自定义命令
      I_GRID_SETTINGS          = L_S_GLAY
*     IT_EVENTS                = LT_EVENTS
      I_SAVE                   = 'A'
    TABLES
      T_OUTTAB                 = GT_ALV[]        "输出内表
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
ENDFORM.                    "frm_show_data
*&---------------------------------------------------------------------*
*&      Form  FRM_LAYOUT_SET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_LAYOUT_SET .
  GS_LAYOUT-DETAILINIT = 'X'.
  GS_LAYOUT-ZEBRA = 'X'.
  GS_LAYOUT-CWIDTH_OPT = 'X'."CWIDTH_OPT
*  GS_LAYOUT-EXCP_FNAME = 'ZICON'.   "例外行
ENDFORM.                    "frm_layout_set
*&---------------------------------------------------------------------*
*&      Form  FRM_SET_ALY_FIELDCAT_ACC
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SET_ALY_FIELDCAT_ACC .
  DATA: L_INDEX TYPE SY-INDEX.
  DATA: LS_FLDCT TYPE LVC_S_FCAT.

  DEFINE SET_FIELDCAT.
    LS_FLDCT-TABNAME   = 'GT_ALV'.
    LS_FLDCT-COL_POS   = L_INDEX.
    LS_FLDCT-FIELDNAME = '&1'.
    LS_FLDCT-SCRTEXT_M   = &2.
    LS_FLDCT-OUTPUTLEN   = &3.
    LS_FLDCT-EDIT = &4.
    LS_FLDCT-CHECKBOX = &5.
    APPEND LS_FLDCT TO GT_FLDCT.
    CLEAR LS_FLDCT.
    L_INDEX = L_INDEX + 1.
  END-OF-DEFINITION.
*        BUDAT  "记账日期
*        MATNR  "物料代码
*        WERKS  "发出工厂
*        LGORT  "发出库存地
*        MENGE  "QUAN  13数量
*        PLANT  "接收工厂
*        STLOC  "接收库存地
*        LIFNR  "供应商代码
*        CHARG  "批次号
*  SET_FIELDCAT XSELP ''           '5' 'X' 'X' .
  SET_FIELDCAT ZICON  '状态'       '5' '' '' .
  SET_FIELDCAT BUDAT  '记账日期'   '10' '' '' .
  SET_FIELDCAT MATNR  '物料代码'   '18' '' ''.
  SET_FIELDCAT WERKS  '发出工厂'   '4' '' ''.
  SET_FIELDCAT LGORT  '发出库存地' '4' '' ''.
  SET_FIELDCAT MENGE  '数量'       ' ' '' ''.
  SET_FIELDCAT PLANT  '接收工厂'   '4' '' ''.
  SET_FIELDCAT STLOC  '接收库存地' '4' '' ''.
  SET_FIELDCAT LIFNR  '供应商代码' '10' '' ''.
  SET_FIELDCAT CHARG  '批次号'     '12' '' ''.

  SET_FIELDCAT MBLNR  '凭证号'     '10' '' ''.
  SET_FIELDCAT MESG  '错误信息' '12' '' ''.

*  LOOP AT GT_FLDCT

ENDFORM.                    "frm_set_aly_fieldcat_acc
**---------------------------------------------------------------------*
**       FORM FRM_USER_COMMAND                                         *
**---------------------------------------------------------------------*
**       ........       用户命令                                        *
**---------------------------------------------------------------------*
**  -->  P_UCOMM                                                       *
**  -->  P_SELFIELD                                                    *
**---------------------------------------------------------------------*
*FORM FRM_USER_COMMAND USING P_UCOMM    TYPE SY-UCOMM
*                            P_SELFIELD TYPE SLIS_SELFIELD.
*  DATA STBL TYPE LVC_S_STBL.
*  P_SELFIELD-REFRESH = 'X'.
*  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
*    IMPORTING
*      E_GRID = G_GRID.
*  CASE P_UCOMM.
*    WHEN '&SELECTALL'.                  "全选
*      PERFORM FRM_SEL_ALL USING 'X'.
*    WHEN '&DISSELA'.                 "全选取消
*      PERFORM FRM_SEL_ALL USING ''.
*    WHEN '&GENERATE'.
*      CALL METHOD G_GRID->CHECK_CHANGED_DATA. "取得屏幕的值
*      PERFORM FRM_ORDER_SAVE.
*      PERFORM FRM_REFRESH_ALV.
*      MESSAGE TEXT-004 TYPE 'S'.
*  ENDCASE.
*ENDFORM.                    "FRM_USER_COMMAND
**---------------------------------------------------------------------*
**       FORM FRM_SET_STATUS                                           *
**---------------------------------------------------------------------*
**       ........根据事务码的不同设置不同的GUI状态栏                     *
**---------------------------------------------------------------------*
*FORM FRM_SET_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.
*  CLEAR: RT_EXTAB.
*  REFRESH: RT_EXTAB.
*  SET PF-STATUS '1000'." EXCLUDING rt_extab.
*ENDFORM .                    "frm_set_status

*&---------------------------------------------------------------------*
*&      Form  FRM_INVALID_CHECK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_INVALID_CHECK TABLES PT_UPLOAD LIKE GT_UPLOAD.

  DATA: LS_UPLOAD TYPE TY_UPLOAD_STR.
  DATA: LS_OUTPUT TYPE TY_UPLOAD.
  DATA: O_CX  TYPE  REF  TO  CX_ROOT.
  DATA: LV_MSG TYPE CHAR255.
*  DATA:LT_GENERAL  LIKE TABLE OF BAPIEINA WITH HEADER LINE,
*       LT_PURCHORG LIKE TABLE OF BAPIEINE WITH HEADER LINE,
*       LT_RETURN   LIKE TABLE OF BAPIRETURN WITH HEADER LINE.
  DATA:LT_GENERAL  LIKE BAPIEINA OCCURS 0,
       LT_PURCHORG LIKE BAPIEINE OCCURS 0 WITH HEADER LINE,
       LT_RETURN   LIKE BAPIRETURN OCCURS 0.
  LOOP AT PT_UPLOAD INTO LS_UPLOAD .
    LS_OUTPUT-ZLINE = SY-TABIX.
    LS_OUTPUT-BUDAT = LS_UPLOAD-BUDAT.
    LS_OUTPUT-MATNR = LS_UPLOAD-MATNR.
    LS_OUTPUT-WERKS = LS_UPLOAD-WERKS.
    LS_OUTPUT-LGORT = LS_UPLOAD-LGORT.
*    LS_OUTPUT-MENGE = LS_UPLOAD-MENGE.
    LS_OUTPUT-PLANT = LS_UPLOAD-PLANT.
    LS_OUTPUT-STLOC = LS_UPLOAD-STLOC.
    LS_OUTPUT-LIFNR = LS_UPLOAD-LIFNR.
    LS_OUTPUT-CHARG = LS_UPLOAD-CHARG.

    TRY .
        MOVE LS_UPLOAD-MENGE TO LS_OUTPUT-MENGE.
      CATCH  CX_ROOT INTO  O_CX.
        LV_MSG =  O_CX->IF_MESSAGE~GET_TEXT( ).
        CONCATENATE LS_OUTPUT-MESG LV_MSG INTO LS_OUTPUT-MESG SEPARATED BY ';'.
    ENDTRY.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  = LS_OUTPUT-MATNR
      IMPORTING
        OUTPUT = LS_OUTPUT-MATNR.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  = LS_OUTPUT-LIFNR
      IMPORTING
        OUTPUT = LS_OUTPUT-LIFNR.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  = LS_OUTPUT-CHARG
      IMPORTING
        OUTPUT = LS_OUTPUT-CHARG.

*& check mkol-寄售库存
    CLEAR:MKOL.
    SELECT SINGLE SLABS INTO MKOL-SLABS
      FROM MKOL
     WHERE MATNR = LS_OUTPUT-MATNR
       AND WERKS = LS_OUTPUT-WERKS
       AND LGORT = LS_OUTPUT-LGORT
       AND CHARG = LS_OUTPUT-CHARG
       AND LIFNR = LS_OUTPUT-LIFNR
       AND SOBKZ = 'K'.

    IF MKOL-SLABS < LS_OUTPUT-MENGE.
      LV_MSG = '物料代码' && LS_OUTPUT-MATNR && '的库存数量不足,请检查!'.
      CONCATENATE LS_OUTPUT-MESG LV_MSG INTO LS_OUTPUT-MESG SEPARATED BY ';'.
      G_GR = 'X'.
    ENDIF.

    CLEAR:LT_GENERAL[] ,
          LT_PURCHORG[],
          LT_RETURN[].
*& 寄售价格是否存在:
    CALL FUNCTION 'BAPI_INFORECORD_GETLIST'
      EXPORTING
        VENDOR              = LS_OUTPUT-LIFNR
        MATERIAL            = LS_OUTPUT-MATNR
        PLANT               = LS_OUTPUT-WERKS
        INFO_TYPE           = '2'
        PURCHORG_DATA       = 'X'
        GENERAL_DATA        = 'X'
      TABLES
        INFORECORD_GENERAL  = LT_GENERAL
        INFORECORD_PURCHORG = LT_PURCHORG
        RETURN              = LT_RETURN.
*& check INFORECORD_PURCHORG-NET_PRICE
    LOOP AT LT_PURCHORG WHERE NET_PRICE NE SPACE AND PRICE_DATE >= LS_OUTPUT-BUDAT.   "2017.12.31
    ENDLOOP.
    IF SY-SUBRC NE 0.
      LV_MSG = '寄售采购信息记录的价格不存在,请检查!'.
      CONCATENATE LS_OUTPUT-MESG LV_MSG INTO LS_OUTPUT-MESG SEPARATED BY ';'.
      G_GR = 'X'.
    ENDIF.

    IF LS_OUTPUT-MESG NE SPACE.
      LS_OUTPUT-LIGHT = 1.
      LS_OUTPUT-ZICON = '@02@'.
    ELSE.
      LS_OUTPUT-LIGHT = 3.
      LS_OUTPUT-ZICON = '@01@'.
    ENDIF.

    SHIFT LS_OUTPUT-MESG LEFT DELETING LEADING ';'.
    SHIFT:LS_OUTPUT-CHARG LEFT DELETING LEADING '0',
          LS_OUTPUT-MATNR LEFT DELETING LEADING '0',
          LS_OUTPUT-LIFNR LEFT DELETING LEADING '0'.
    APPEND LS_OUTPUT TO GT_ALV.
    CLEAR: LS_OUTPUT,
           LV_MSG.
  ENDLOOP.
  SORT GT_ALV BY  BUDAT MATNR WERKS LIFNR.

ENDFORM.                    "frm_invalid_check
*&---------------------------------------------------------------------*
*&      Form  FRM_GOODMVT_CREATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_GOODMVT_CREATE .
  DATA:LT_ALV TYPE TABLE OF TY_UPLOAD,
       WA_ALV TYPE TY_UPLOAD,
       L_TABIX TYPE SY-TABIX.
  DATA:LT_MKPF TYPE TABLE OF TY_MKPF,
       WA_MKPF TYPE TY_MKPF.
  DATA:L_DIV  TYPE SY-TABIX,
       L_MOD  TYPE SY-TABIX.
*  DATA:L_PACK TYPE SY-TABIX.
  DATA:L_LINE TYPE SY-TABIX,
       L_FLAG TYPE C.
  RANGES:R_XBLNR FOR SY-TABIX.
*&-bapi use.
  DATA: LS_GOODSMVT_HEADER TYPE BAPI2017_GM_HEAD_01,
        LS_GOODSMVT_CODE   TYPE BAPI2017_GM_CODE,
*        lv_materialdocument TYPE bapi2017_gm_head_ret-mat_doc,
        LV_MATDOCUMENTYEAR TYPE BAPI2017_GM_HEAD_RET-DOC_YEAR,
        LT_GOODSMVT_ITEM   TYPE TABLE OF BAPI2017_GM_ITEM_CREATE,
        LS_GOODSMVT_ITEM   TYPE BAPI2017_GM_ITEM_CREATE,
        LT_RETURN          TYPE TABLE OF BAPIRET2,
        LS_RETURN          TYPE BAPIRET2,
        LS_OUTPUT          TYPE TY_UPLOAD.
  DATA: LV_MATERIALDOCUMENT TYPE MBLNR,
        LV_MESSAGE          TYPE CHAR255.

  CLEAR:L_TABIX,LT_ALV[],LT_MKPF[].

  LT_ALV[] = GT_ALV[].
  DELETE LT_ALV WHERE MESG NE SPACE.
  L_TABIX = LINES( LT_ALV[] ).

*&创建GR table
  LOOP AT LT_ALV INTO WA_ALV WHERE MESG EQ SPACE.

    CLEAR:L_DIV,L_MOD.
    L_TABIX = WA_ALV-ZLINE.
    IF SY-TABIX <= P_COUNT.
      WA_ALV-XBLNR = P_COUNT.
    ELSE.
      L_DIV = SY-TABIX DIV P_COUNT.
      L_MOD = SY-TABIX MOD P_COUNT.
      IF L_MOD > 0.
        WA_ALV-XBLNR = ( L_DIV + 1 ) * P_COUNT .
      ELSE.
        WA_ALV-XBLNR = L_DIV  * P_COUNT .
      ENDIF.
    ENDIF.

    WA_MKPF-XBLNR = WA_ALV-XBLNR.
    WA_MKPF-BUDAT = WA_ALV-BUDAT.
    COLLECT WA_MKPF INTO LT_MKPF.
    CLEAR WA_MKPF.
    MODIFY LT_ALV FROM WA_ALV TRANSPORTING XBLNR WHERE ZLINE = L_TABIX.
    MODIFY GT_ALV FROM WA_ALV TRANSPORTING XBLNR WHERE ZLINE = L_TABIX.

    CLEAR WA_ALV.
  ENDLOOP.

*  BREAK LZH.
  LOOP AT LT_MKPF INTO WA_MKPF.

*&s1.head
    LS_GOODSMVT_HEADER-PSTNG_DATE = WA_MKPF-BUDAT."过账
    LS_GOODSMVT_HEADER-DOC_DATE = WA_MKPF-BUDAT."凭证
    LS_GOODSMVT_HEADER-PR_UNAME = SY-UNAME.
* LS_GOODSMVT_HEADER-REF_DOC_NO = WA_ALV-XBLNR. "单号
* LS_GOODSMVT_HEADER-HEADER_TXT = WA_ALV-BKTXT. "备注
    LS_GOODSMVT_CODE = '04'.     "MB1B - Transfer Posting
*&s2.item
    LOOP AT LT_ALV INTO WA_ALV WHERE XBLNR = WA_MKPF-XBLNR
                                  AND BUDAT = WA_MKPF-BUDAT.

      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = WA_ALV-MATNR
        IMPORTING
          OUTPUT = WA_ALV-MATNR.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = WA_ALV-LIFNR
        IMPORTING
          OUTPUT = WA_ALV-LIFNR.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = LS_OUTPUT-CHARG
        IMPORTING
          OUTPUT = LS_OUTPUT-CHARG.
*&s1.item data,
      LS_GOODSMVT_ITEM-MATERIAL  = WA_ALV-MATNR.
      LS_GOODSMVT_ITEM-PLANT     = WA_ALV-WERKS.
      LS_GOODSMVT_ITEM-STGE_LOC  = WA_ALV-LGORT.
      LS_GOODSMVT_ITEM-MOVE_TYPE = '411'.
      LS_GOODSMVT_ITEM-SPEC_STOCK = 'K'.
      LS_GOODSMVT_ITEM-VENDOR    = WA_ALV-LIFNR.
      LS_GOODSMVT_ITEM-ENTRY_QNT = WA_ALV-MENGE.
      LS_GOODSMVT_ITEM-BATCH     = WA_ALV-CHARG.
      LS_GOODSMVT_ITEM-MOVE_PLANT = WA_ALV-PLANT.
      LS_GOODSMVT_ITEM-MOVE_STLOC = WA_ALV-STLOC.
* IF LS_OUTPUT-BWART = '262' OR LS_OUTPUT-BWART = 'Y62'. "部分冲销
*   LS_GOODSMVT_ITEM-XSTOB     = 'X'.
* ENDIF.
      APPEND LS_GOODSMVT_ITEM TO LT_GOODSMVT_ITEM.

    ENDLOOP.
*&S3.create
    CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
      EXPORTING
        GOODSMVT_HEADER  = LS_GOODSMVT_HEADER
        GOODSMVT_CODE    = LS_GOODSMVT_CODE
      IMPORTING
        MATERIALDOCUMENT = LV_MATERIALDOCUMENT
        MATDOCUMENTYEAR  = LV_MATDOCUMENTYEAR
      TABLES
        GOODSMVT_ITEM    = LT_GOODSMVT_ITEM[]
        RETURN           = LT_RETURN[].

    IF LV_MATERIALDOCUMENT IS INITIAL.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      WA_ALV-MSGTYPE = 'E'.
      WA_ALV-LIGHT = '1'.
      WA_ALV-ZICON = '@02@'.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.
      WA_ALV-MSGTYPE = 'S'.
      WA_ALV-MESG  = '转库成功!'.
      WA_ALV-LIGHT = '3'.
      WA_ALV-ZICON = '@01@'.
      WA_ALV-MBLNR = LV_MATERIALDOCUMENT.
    ENDIF.

    LOOP AT LT_RETURN INTO LS_RETURN WHERE TYPE = 'E' .
      CONCATENATE LV_MESSAGE
                  LS_RETURN-MESSAGE
                  LS_RETURN-MESSAGE_V1
                  LS_RETURN-MESSAGE_V2
                  LS_RETURN-MESSAGE_V3
                  LS_RETURN-MESSAGE_V4
                  INTO WA_ALV-MESG.
    ENDLOOP.
*&s1.clear:
    CLEAR:LS_GOODSMVT_HEADER,LS_GOODSMVT_CODE,
          LV_MATERIALDOCUMENT,LV_MATDOCUMENTYEAR,
          LS_GOODSMVT_ITEM,  LT_GOODSMVT_ITEM[],LT_RETURN[].

* MODIFY LT_ALV FROM WA_ALV
    MODIFY GT_ALV FROM WA_ALV TRANSPORTING MSGTYPE MESG LIGHT MBLNR ZICON WHERE XBLNR = WA_MKPF-XBLNR
                                                                            AND BUDAT = WA_MKPF-BUDAT.
    CLEAR:WA_MKPF,WA_ALV.
  ENDLOOP.

ENDFORM.                    " FRM_GOODMVT_CREATE
*&---------------------------------------------------------------------*
*&      Form  FRM_DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_P_UPLOAD  text
*----------------------------------------------------------------------*
FORM FRM_DOWNLOAD_TEMPLATE  CHANGING IC_FILE.
*数据定义
  DATA:LC_FILE   TYPE STRING,
       LC_RESULT TYPE C.         "标识: 空表示文件不存在;否则,表示存在
  DATA:LC_DEST   TYPE LOCALFILE. "目标文件
  DATA:LS_KEY   TYPE WWWDATATAB,
       LV_SUBRC TYPE SY-SUBRC.

*S1.判断文件是否存在
  LC_FILE = IC_FILE.
  CLEAR LC_RESULT.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST
    EXPORTING
      FILE                 = LC_FILE
    RECEIVING
      RESULT               = LC_RESULT
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      WRONG_PARAMETER      = 3
      NOT_SUPPORTED_BY_GUI = 4
      OTHERS               = 5.

  IF LC_RESULT IS NOT  INITIAL.
*&S2."文件已经存在,是否选择覆盖,
    DATA LC_ANSWER TYPE C.
    CLEAR LC_ANSWER.
    CALL FUNCTION 'POPUP_TO_CONFIRM'
      EXPORTING
        TITLEBAR              = TEXT-S01 "'请确认 '
        TEXT_QUESTION         = TEXT-S02 "'文件已经存在,是否要覆盖?'
        TEXT_BUTTON_1         = 'Yes'(S03)
        TEXT_BUTTON_2         = 'No'(S04)
        DEFAULT_BUTTON        = '2'      "缺省选中按钮: 1 是; 2 否
        DISPLAY_CANCEL_BUTTON = ''       "标识: 为空,不显示 取消按钮
      IMPORTING
        ANSWER                = LC_ANSWER "标识: 1 是;
      EXCEPTIONS
        TEXT_NOT_FOUND        = 1
        OTHERS                = 2.
    IF LC_ANSWER NE '1'.
      EXIT.
    ENDIF.
  ENDIF.

*下载EXCEL模板
*  IF IC_FILE NS '.xls' AND IC_FILE NS '.xls'.
*    CONCATENATE IC_FILE '.xls' INTO IC_FILE.
*  ENDIF.
  LC_DEST = IC_FILE.
  LS_KEY-RELID = 'MI'.
  LS_KEY-OBJID = GCST_EXCEL_TEMPLATE.   "Z01MM090"SY-TCODE.

  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      KEY         = LS_KEY
      DESTINATION = LC_DEST
    IMPORTING
      RC          = LV_SUBRC.
  IF LV_SUBRC <> 0.
    MESSAGE E001 WITH 'Template file does not exist, or the file path error!'. "(ZMLSCP_001) TYPE 'E'.
    EXIT.
  ENDIF.
** 打开EXCEL模板文件
  PERFORM FRM_OPEN_EXCEL_FILE
                 USING IC_FILE.

ENDFORM.                    "FRM_DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
*&      Form  FRM_OPEN_EXCEL_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_IC_FILE  text
*----------------------------------------------------------------------*
FORM FRM_OPEN_EXCEL_FILE  USING   IC_FILE.
*数据定义
  TYPE-POOLS:OLE2.         "OLE声明
  DATA:LO_EXCEL     TYPE OLE2_OBJECT,   "EXCEL应用程序
       LO_WORKBOOKS TYPE OLE2_OBJECT,   "EXCEL文件窗口
       LO_WORKBOOK  TYPE OLE2_OBJECT,   "EXCEL文件
       LO_SHEET     TYPE OLE2_OBJECT.   "EXCEL 文件的SHEET页
  DATA:LC_FILE   TYPE STRING,
       LC_RESULT TYPE C. "标识: 空表示文件不存在;否则,表示存在
*******程序主体*******
**判断文件是否存在
  LC_FILE = IC_FILE.
  CLEAR LC_RESULT.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST
    EXPORTING
      FILE                 = LC_FILE
    RECEIVING
      RESULT               = LC_RESULT
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      WRONG_PARAMETER      = 3
      NOT_SUPPORTED_BY_GUI = 4
      OTHERS               = 5.
  IF LC_RESULT IS INITIAL.
    MESSAGE E001 WITH '文件不存在!'.
    EXIT.
  ENDIF.

**打开EXCEL文件
  CREATE OBJECT LO_EXCEL 'EXCEL.APPLICATION'.
  IF SY-SUBRC NE 0 .
    CREATE OBJECT LO_EXCEL 'ET.APPLICATION'.
    IF SY-SUBRC NE 0.
      MESSAGE E001 WITH '无法创建OLE OBJECT,请检查是否安装金山WPS或微软Office!'." '无法创建OLE OBJECT,请检查是否安装金山WPS或微软Office!'.
    ENDIF.
  ENDIF .
  CALL METHOD OF
      LO_EXCEL
      'WORKBOOKS' = LO_WORKBOOKS.
  CALL METHOD OF
      LO_WORKBOOKS
      'OPEN'       = LO_WORKBOOK
    EXPORTING
      #1           = IC_FILE.
  CALL METHOD OF
      LO_WORKBOOK
      'WORKSHEETS' = LO_SHEET
    EXPORTING
      #1           = 1.
** PERFORM FRM_EXPORT_FILL_HEADER.
*  PERFORM FRM_EXPORT_FILL.
*  CALL METHOD OF SHEET 'CELLS' = CELL EXPORTING #1 = 1 #2 = 1.
*  CALL METHOD OF CELL 'SELECT'.
*  SET PROPERTY OF EXCEL 'CUTCOPYMODE' = 0.
** SET PROPERTY OF WORKBOOK 'SAVED' = 1.
  SET PROPERTY OF LO_EXCEL 'VISIBLE' = 1.
*  CALL METHOD OF WORKBOOK 'SAVE'.
  FREE OBJECT:
    LO_EXCEL,LO_WORKBOOKS,LO_WORKBOOK.   ",SHEET,RANGE,CELL.

ENDFORM.                    "FRM_OPEN_EXCEL_FILE

 

posted @ 2017-03-20 09:51  Rainystuday  阅读(561)  评论(0)    收藏  举报