批量创建预留单

创建预留所用BAPI

    CALL FUNCTION 'BAPI_RESERVATION_CREATE'
      EXPORTING
        RESERVATION_HEADER = GS_HEADER   表头
*       NO_COMMIT          =
*       MOVEMENT_AUTO      =
      IMPORTING
        RESERVATION        = L_RSNUM       返回的预留单号
      TABLES
        RESERVATION_ITEMS  = GT_ITEM   表体
        RETURN             = GT_RETURN.     返回消息

 

代码

TYPES : BEGIN OF TY_ALV,
          BOX          TYPE C,
          MATNR        TYPE RESB-MATNR,
          MAKTX        TYPE MAKT-MAKTX,
          WERKS        TYPE RESB-WERKS,
          BWART        TYPE RESB-BWART,
          ERFMG        TYPE RESB-ERFMG,
          MEINS        TYPE MARA-MEINS,
          UMLGO        TYPE RESB-UMLGO,
          LGORT        TYPE RESB-LGORT,
          CHARG        TYPE RESB-CHARG,
          KOSTL        TYPE RKPF-KOSTL,
          AUFNR        TYPE RESB-AUFNR,
          BDTER        TYPE STRING,
          RSNUM        TYPE RESB-RSNUM,
          MESSAGE(100) TYPE C,
        END OF TY_ALV.
DATA : GT_ALV TYPE TABLE OF TY_ALV,
       GS_ALV TYPE TY_ALV.

TYPES : BEGIN OF TY_UPLOAD,
          MATNR TYPE RESB-MATNR,
*          MAKTX TYPE MAKT-MAKTX,
          WERKS TYPE RESB-WERKS,
          BWART TYPE RESB-BWART,
          ERFMG TYPE RESB-ERFMG,
*          MEINS TYPE MARA-MEINS,
          UMLGO TYPE RESB-UMLGO,
          LGORT TYPE RESB-LGORT,
          CHARG TYPE RESB-CHARG,
          KOSTL TYPE RKPF-KOSTL,
          BDTER TYPE STRING,
          AUFNR TYPE RESB-AUFNR,
        END OF TY_UPLOAD.
DATA : GT_UPLOAD TYPE TABLE OF TY_UPLOAD,
       GS_UPLOAD TYPE TY_UPLOAD.

*&---定义ALV显示的字段列及其描述等属性
DATA: GT_FIELDCAT TYPE TABLE OF LVC_S_FCAT,
      GS_FIELDCAT TYPE LVC_S_FCAT,
      GS_LAYOUT   TYPE LVC_S_LAYO,
      G_REPID     LIKE SY-REPID VALUE SY-REPID.

FIELD-SYMBOLS : <FS_ALV> TYPE TY_ALV.
*----------------------------------------------------------------------*
* 定义BAPI参数
*----------------------------------------------------------------------*
DATA : GS_HEADER TYPE BAPIRKPFC,
       GT_ITEM   TYPE TABLE OF BAPIRESBC,
       GS_ITEM   TYPE BAPIRESBC,
       GT_RETURN TYPE TABLE OF BAPIRETURN,
       GS_RETURN TYPE BAPIRETURN.


DEFINE INIT_FIELDCAT.
  CLEAR GS_FIELDCAT.
  GS_FIELDCAT-FIELDNAME = &1.
  GS_FIELDCAT-COLTEXT = &2.
  GS_FIELDCAT-REF_TABLE = &3.
  GS_FIELDCAT-REF_FIELD = &4.
  GS_FIELDCAT-CHECKBOX = &5.
  GS_FIELDCAT-KEY = &6.
  GS_FIELDCAT-ICON = &7.
  GS_FIELDCAT-NO_ZERO = &8.
  APPEND GS_FIELDCAT TO GT_FIELDCAT.
END-OF-DEFINITION.

*----------选择屏幕--------------------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK BLK2 WITH FRAME TITLE TEXT-002.
PARAMETERS:P_PATH  LIKE RLGRAP-FILENAME.         "文件路径
*PARAMETERS: P_FILE TYPE RLGRAP-FILENAME. "文件路径
PARAMETERS : R1 RADIOBUTTON GROUP GRP1,
             R2 RADIOBUTTON GROUP GRP1.

SELECTION-SCREEN END OF BLOCK BLK2.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_PATH.

*  PERFORM FRM_F4_FOR_P_FILE.         "选择屏幕获取本地EXCEL
  PERFORM FRM_BROWSER_FILE.         "选择屏幕获取本地EXCEL

AT SELECTION-SCREEN.

*-----------------模板下载------------
  IF R2 = 'X'.

    PERFORM FRM_DOWNLOAD.

  ENDIF.

START-OF-SELECTION.

  IF R1 = 'X'.

    IF  P_PATH IS INITIAL.
      MESSAGE '请选择导入文件' TYPE 'S' DISPLAY LIKE 'W'.
      STOP.
    ENDIF.

    PERFORM FRM_UPLOAD_DATA.

*--------------判断上传模板中是否有数据------------
    IF GT_UPLOAD IS INITIAL.
      MESSAGE '上传模板数据不能为空' TYPE 'S' DISPLAY LIKE 'E'.
      EXIT.
    ENDIF.
    PERFORM FRM_DISPLAY.


  ENDIF.


END-OF-SELECTION.

*&---------------------------------------------------------------------*
*& Form FRM_F4_FOR_P_FILE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
*FORM FRM_F4_FOR_P_FILE .
*  CALL FUNCTION 'F4_FILENAME'
*    EXPORTING
*      FIELD_NAME = 'P_FILE'
*    IMPORTING
*      FILE_NAME  = P_FILE.
*ENDFORM.


FORM FRM_BROWSER_FILE .
  DATA: LV_RC   TYPE I,
        LV_USER TYPE I,
        LT_FILE TYPE FILETABLE,
        LS_FILE TYPE FILE_TABLE.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
    EXPORTING
      WINDOW_TITLE            = '选择文件'
      FILE_FILTER             = 'EXCEL文件(*.XLSX)|*.XLS|*.XLSX|全部文件 (*.*)|*.*|'
    CHANGING
      FILE_TABLE              = LT_FILE
      RC                      = LV_RC
      USER_ACTION             = LV_USER
    EXCEPTIONS
      FILE_OPEN_DIALOG_FAILED = 1
      CNTL_ERROR              = 2
      ERROR_NO_GUI            = 3
      NOT_SUPPORTED_BY_GUI    = 4
      OTHERS                  = 5.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
               WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ELSE.
    CHECK LV_RC = 1
      AND LV_USER <> 9.
    READ TABLE LT_FILE INTO LS_FILE INDEX 1.
    P_PATH = LS_FILE-FILENAME.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DOWNLOAD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DOWNLOAD .
*&---变量定义
  DATA:LV_TEXT       TYPE STRING,                   "MESSAGE
       LV_FILENAME   TYPE STRING,                   "DOWNLOAD FILE NAME
       LV_PATH       TYPE STRING,                   "DOWNLOAD FILE PATH
       LV_FUNCTXT    TYPE SMP_DYNTXT,               "MENU NAME
       LV_FILEPATH   TYPE RLGRAP-FILENAME VALUE 'C', "FILE PATCH
       LV_TITLE      TYPE STRING ,                  "TITLE
       LV_TITLE_NAME TYPE STRING,                   "TITLE NAME
       LV_MOD(20),                                  "MODEL
       LV_FULLPATH   TYPE STRING,                   "FULL PATH
       LV_OBJECT     TYPE WWWDATATAB,               "OBJECT NAME
       LV_RC         TYPE SY-SUBRC.                 "RETURN CODE

* SMWO 模板名称

  LV_MOD = ''. "XXX下载文件名


* 调用OS 操作系统对话框

  LV_TITLE_NAME = '预留'.
  LV_TITLE      = '模板下载'.

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
    EXPORTING
      WINDOW_TITLE      = LV_TITLE
      DEFAULT_FILE_NAME = LV_TITLE_NAME
    CHANGING
      FILENAME          = LV_FILENAME
      PATH              = LV_PATH
      FULLPATH          = LV_FULLPATH.
* 操作系统文件路径
  CONCATENATE LV_PATH
  LV_FILENAME
  '.XLS'
  INTO LV_FILEPATH.
* OS长度控制/下载模板
  IF STRLEN( LV_FILEPATH ) <> 4.
* 查询模板.
    SELECT SINGLE RELID
    OBJID
    FROM WWWDATA
    INTO CORRESPONDING FIELDS OF LV_OBJECT
    WHERE SRTF2 = '0'
    AND OBJID = LV_MOD.                                     "SMW0里对象名称
    IF SY-SUBRC <> 0 OR LV_OBJECT-OBJID = SPACE .
      CONCATENATE TEXT-021"'模板文件:'
      LV_MOD
      TEXT-022"'不存在,请用SMW0进行加载.'
      INTO LV_TEXT.
      MESSAGE LV_TEXT TYPE 'E'.
      STOP.
    ENDIF.
* 下载模板
    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        KEY         = LV_OBJECT
        DESTINATION = LV_FILEPATH
      IMPORTING
        RC          = LV_RC.
    IF LV_RC <> 0.
      CONCATENATE '模板文件:' LV_MOD  '下载失败,请与开发人员联系.'"''下载失败,请与开发人员联系.'
      INTO LV_TEXT.
      MESSAGE LV_TEXT TYPE 'E'.
      STOP.
    ENDIF.
* '已下载'
    MESSAGE '已下载' TYPE 'S'.
  ELSE.
* '已取消下载'
    MESSAGE '已取消下载' TYPE 'S'.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_UPLOAD_DATA .
  DATA : LT_DATA TYPE TRUXS_T_TEXT_DATA,
         LT_PATH TYPE RLGRAP-FILENAME.
  LT_PATH = P_PATH.
  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
      I_LINE_HEADER        = 'X'
      I_TAB_RAW_DATA       = LT_DATA
      I_FILENAME           = LT_PATH
    TABLES
      I_TAB_CONVERTED_DATA = GT_UPLOAD
    EXCEPTIONS
      CONVERSION_FAILED    = 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.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY .
  PERFORM FRM_SET_DATA.
  PERFORM FRM_LAYOUT.
  PERFORM FRM_FIELDCAT.
  PERFORM FRM_OUTPUT.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_DATA .
  DATA : LV_MATNR TYPE MARC-MATNR.
*==========将excel上传数据给到alv
  LOOP AT GT_UPLOAD INTO GS_UPLOAD.
    MOVE-CORRESPONDING GS_UPLOAD TO GS_ALV.

    IF GS_ALV-MATNR IS NOT INITIAL.
*&---物料前导零
      CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
        EXPORTING
          INPUT  = GS_ALV-MATNR
        IMPORTING
          OUTPUT = GS_ALV-MATNR.
    ENDIF.
*&---订单号前导零
    IF GS_ALV-AUFNR IS NOT INITIAL.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = GS_ALV-AUFNR
        IMPORTING
          OUTPUT = GS_ALV-AUFNR.
    ENDIF.

    SELECT SINGLE MATNR
      FROM MARC
      INTO LV_MATNR
      WHERE MATNR =  GS_ALV-MATNR AND
            WERKS =  GS_ALV-WERKS.

    IF LV_MATNR IS INITIAL.
      MESSAGE '物料不存在' TYPE 'S'  DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING AND RETURN TO SCREEN 0.

    ELSE.

      SELECT SINGLE MAKTX
        INTO GS_ALV-MAKTX
        FROM MAKT
        WHERE MATNR = GS_ALV-MATNR AND
              SPRAS = SY-LANGU.

      SELECT SINGLE MEINS
        INTO GS_ALV-MEINS
        FROM MARA
        WHERE MATNR = GS_ALV-MATNR.

    ENDIF.

    APPEND GS_ALV TO GT_ALV.
    CLEAR GS_ALV.
  ENDLOOP.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_FIELDCAT .

  INIT_FIELDCAT 'RSNUM' '预留' '' '' '' '' '' 'X'.
  INIT_FIELDCAT 'MATNR' '物料编号' '' '' '' '' '' 'X'.
  INIT_FIELDCAT 'MAKTX' '物料描述' '' '' '' '' '' ''.
  INIT_FIELDCAT 'WERKS' '工厂' '' '' '' '' '' ''.

  INIT_FIELDCAT 'BWART' '移动类型' '' '' '' '' '' ''.
  INIT_FIELDCAT 'ERFMG' '数量' '' '' '' '' '' ''.
  INIT_FIELDCAT 'MEINS' '单位' '' '' '' '' '' ''.
  INIT_FIELDCAT 'UMLGO' '收货库位' '' '' '' '' '' ''.
  INIT_FIELDCAT 'LGORT' '发货库位' '' '' '' '' '' ''.
  INIT_FIELDCAT 'CHARG' '批次' '' '' '' '' '' ''.
  INIT_FIELDCAT 'KOSTL' '成本中心' '' '' '' '' '' ''.

  INIT_FIELDCAT 'AUFNR' '内部订单' '' '' '' '' '' ''.
  INIT_FIELDCAT 'BDTER' '需求日期' '' '' '' '' '' ''.
  INIT_FIELDCAT 'MESSAGE' '信息' '' '' '' '' '' ''.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_LAYOUT .
  GS_LAYOUT-ZEBRA = 'X'.
  GS_LAYOUT-CWIDTH_OPT = 'X'.
  GS_LAYOUT-SEL_MODE = 'A'.
  GS_LAYOUT-BOX_FNAME = 'BOX'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_OUTPUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_OUTPUT .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
      I_CALLBACK_PF_STATUS_SET = 'ALV_STATUS'
      I_CALLBACK_USER_COMMAND  = 'ALV_COMMAND'
      IS_LAYOUT_LVC            = GS_LAYOUT
      IT_FIELDCAT_LVC          = GT_FIELDCAT
    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.
*&      FORM  ALV_PF_STATUS
*&---------------------------------------------------------------------*
*       GUI状态设置
*----------------------------------------------------------------------*
*      -->RT_EXTAB   GUI状态设置
*----------------------------------------------------------------------*
FORM ALV_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.
  SET PF-STATUS 'STAUS1'.
ENDFORM.                    "ALV_PF_STATUS
*&---------------------------------------------------------------------*
*&      FORM  ALV_USER_COMMAND
*&---------------------------------------------------------------------*
*       ALV执行查询后的事件响应
*----------------------------------------------------------------------*
*      -->R_UCOMN      响应码
*      -->RS_SELFIELD  当前行信息
*----------------------------------------------------------------------*
FORM ALV_COMMAND USING PV_UCOMM LIKE SY-UCOMM
                        RS_SELFIELD TYPE SLIS_SELFIELD.
  DATA:LV_INDEX TYPE SY-TABIX.
  DATA: GV_GRID TYPE REF TO CL_GUI_ALV_GRID .

*--------------------刷新-------------------*
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = GV_GRID.

  CALL METHOD GV_GRID->CHECK_CHANGED_DATA.

  CALL METHOD GV_GRID->REFRESH_TABLE_DISPLAY.

  RS_SELFIELD-REFRESH = 'X'.


  CASE PV_UCOMM.
    WHEN 'ZSAVE1'.

      IF GT_ALV IS  INITIAL .
        MESSAGE '请选择一条数据' TYPE 'E'.
      ELSE.
        PERFORM FRM_BAPI.
      ENDIF.


  ENDCASE.
  RS_SELFIELD-REFRESH = 'X'.
ENDFORM.                    "ALV_USER_COMMAND
*&---------------------------------------------------------------------*
*& Form FRM_BAPI
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_BAPI .

  DATA L_RSNUM TYPE BAPIRKPFC-RES_NO.

  DATA: LT_ALV TYPE TABLE OF TY_ALV,
        LS_ALV LIKE LINE OF LT_ALV.

  APPEND LINES OF GT_ALV TO LT_ALV.

  SORT LT_ALV BY BWART KOSTL AUFNR UMLGO BDTER .
  DELETE ADJACENT DUPLICATES FROM LT_ALV COMPARING BWART KOSTL AUFNR UMLGO BDTER.

  LOOP AT LT_ALV INTO LS_ALV.

    CLEAR : GS_HEADER,
            GS_ITEM,
            GT_RETURN.

    GS_HEADER-PLANT = LS_ALV-WERKS.
    GS_HEADER-MOVE_TYPE = LS_ALV-BWART.
    GS_HEADER-COST_CTR = LS_ALV-KOSTL.
    GS_HEADER-MOVE_STLOC = LS_ALV-UMLGO.
    GS_HEADER-ORDER_NO = LS_ALV-AUFNR.
    GS_HEADER-RES_DATE = LS_ALV-BDTER.
    GS_HEADER-MOVE_PLANT = LS_ALV-WERKS.

    LOOP AT GT_ALV ASSIGNING <FS_ALV> WHERE  BWART = LS_ALV-BWART AND
                                      KOSTL = LS_ALV-KOSTL AND
                                      UMLGO = LS_ALV-UMLGO AND
                                      AUFNR = LS_ALV-AUFNR AND
                                      BDTER = LS_ALV-BDTER.

      GS_ITEM-MATERIAL = <FS_ALV>-MATNR.
      GS_ITEM-PLANT = <FS_ALV>-WERKS.
      GS_ITEM-STORE_LOC = <FS_ALV>-LGORT.
      GS_ITEM-REQ_DATE = <FS_ALV>-BDTER.
      GS_ITEM-UNIT  = <FS_ALV>-MEINS.
      GS_ITEM-QUANTITY = <FS_ALV>-ERFMG.
      GS_ITEM-BATCH = <FS_ALV>-CHARG.

      APPEND GS_ITEM TO  GT_ITEM.
      CLEAR GS_ITEM.

    ENDLOOP.

    CLEAR L_RSNUM.

    CALL FUNCTION 'BAPI_RESERVATION_CREATE'
      EXPORTING
        RESERVATION_HEADER = GS_HEADER
*       NO_COMMIT          =
*       MOVEMENT_AUTO      =
      IMPORTING
        RESERVATION        = L_RSNUM
      TABLES
        RESERVATION_ITEMS  = GT_ITEM
        RETURN             = GT_RETURN.


    LOOP AT GT_RETURN INTO GS_RETURN WHERE TYPE = 'E'
                                        OR  TYPE = 'A'.
      GS_ALV-MESSAGE = GS_RETURN-MESSAGE.
    ENDLOOP.

    IF SY-SUBRC EQ 0.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      LOOP AT GT_ALV ASSIGNING <FS_ALV> WHERE BDTER = LS_ALV-BDTER
                                           AND BWART = LS_ALV-BWART
                                           AND UMLGO = LS_ALV-UMLGO
                                           AND KOSTL = LS_ALV-KOSTL
                                           AND AUFNR = LS_ALV-AUFNR
                                           AND BOX   = 'X'.
        <FS_ALV>-MESSAGE = GS_RETURN-MESSAGE.
      ENDLOOP.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.

      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
        EXPORTING
          INPUT  = L_RSNUM
        IMPORTING
          OUTPUT = L_RSNUM.

      LOOP AT GT_ALV ASSIGNING <FS_ALV> WHERE BDTER = LS_ALV-BDTER
                                           AND BWART = LS_ALV-BWART
                                           AND UMLGO = LS_ALV-UMLGO
                                           AND KOSTL = LS_ALV-KOSTL
                                           AND AUFNR = LS_ALV-AUFNR
                                           AND BOX   = 'X'.


        <FS_ALV>-MESSAGE = L_RSNUM && '创建成功'.
        <FS_ALV>-RSNUM = L_RSNUM.
      ENDLOOP.

    ENDIF.

  ENDLOOP.


ENDFORM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值