创建预留所用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.