1. 依据MAKT-MATNR=发料编码 AND MAKT-SPRAS=ZH 获取MAKT-MAKTX
2. 根据MARA-MATNR=发料编码获取MARA-MEINS
3. 移动类型:若发料数量>0,显示261,若发料数量<0,显示262,若发料数量=0,此处显示空值
4. 根据T001L-WERKS=工厂 AND T001L-LGORT=库存地点 获取T001L-LGOBE库存地点描述
5. 若订单状态为空 或 发料数量=0 则分别显示E,否则通过测试模式调用BAPI获取反馈消息类型。
6. 若订单状态为空 或 发料数量=0 则分别显示“订单状态不允许发料”“发料数量不得为空”,否则通过测试模式调用BAPI获取反馈消息文本。
7.读取生产订单状态,若状态为REL(I0002)和TECO(I00045)两个状态存在且激活,
若状态为REL,直接导入
若状态为TECO,判断生产订单技术性关闭日期:AUFK-IDAT2,若日期与当前系统日期在同一自然月,调BAPI取消生产订单技术性关闭,执行投料创建物料凭证,完成后调BAPI重新技术性关闭;若日期与系统当前日期不在同一自然月,报消息:该生产订单于“AUFK-IDAT2”关闭,不可投料。
*&---------------------------------------------------------------------*
*& Report ZMMF039
*&---------------------------------------------------------------------*
*&*描述: 生产投料(计划外)物料凭证导入
*作者: HANDZK
*日期: 2017/10/09
*&---------------------------------------------------------------------*
REPORT ZMMF039 NO STANDARD PAGE HEADING.
*&---------------------------------------------------------------------*
*& TYPE-POOLS
*&---------------------------------------------------------------------*
TYPE-POOLS: SLIS,TRUXS,ABAP.
*&---------------------------------------------------------------------*
*& TABLES
*&---------------------------------------------------------------------*
TABLES: SSCRFIELDS.
*&---------------------------------------------------------------------*
*& EXCEL TYPES
*&---------------------------------------------------------------------*
TYPES: BEGIN OF TY_EXCEL,
AUFNR TYPE AUFK-AUFNR, "订单号
MATNR TYPE MARA-MATNR, "发料编码
MENGE TYPE MSEG-MENGE, "发料数量
LGORT TYPE T001L-LGORT, "库存地点
END OF TY_EXCEL.
DATA: GT_EXCEL TYPE TABLE OF TY_EXCEL,
GS_EXCEL LIKE LINE OF GT_EXCEL.
*&---------------------------------------------------------------------*
*& ALV TYPES
*&---------------------------------------------------------------------*
TYPES: BEGIN OF TY_ALV,
AUFNR TYPE AUFK-AUFNR, "订单号
WERKS TYPE AUFK-WERKS, "工厂
NAME1 TYPE T001W-NAME1, "工厂名称
ZCPWL TYPE AFPO-MATNR, "成品物料
ZCPMC TYPE MAKT-MAKTX, "成品名称
TXT04 TYPE TJ02T-TXT04, "订单状态
MATNR TYPE MSEG-MATNR, "发料编码
MAKTX TYPE MAKT-MAKTX, "发料名称
MENGE TYPE MSEG-MENGE, "发料数量
MEINS TYPE MARA-MEINS, "单位
ZYDLX(3) TYPE C, "移动类型
LGORT TYPE T001L-LGORT, "库位
LGOBE TYPE T001L-LGOBE, "库位地点描述
IDAT2 TYPE AUFK-IDAT2,
OBJNR TYPE JEST-OBJNR,
STATU TYPE JEST-STAT,
MSGTP TYPE C, "消息类型
MSGTX(100) TYPE C, "消息文本
END OF TY_ALV.
DATA: GT_ALV TYPE TABLE OF TY_ALV,
GS_ALV LIKE LINE OF GT_ALV.
*&---------------------------------------------------------------------*
*& MAKT 物料描述
*&---------------------------------------------------------------------*
TYPES: BEGIN OF TY_MAKT,
MATNR TYPE MAKT-MATNR,
MAKTX TYPE MAKT-MAKTX,
END OF TY_MAKT.
DATA: GT_MAKT TYPE TABLE OF TY_MAKT,
GS_MAKT LIKE LINE OF GT_MAKT.
*&---------------------------------------------------------------------*
*& T001W 工厂名称 T001L 库位名称
*&---------------------------------------------------------------------*
TYPES: BEGIN OF TY_T001W,
WERKS TYPE T001W-WERKS,
NAME1 TYPE T001W-NAME1,
END OF TY_T001W.
DATA: GT_T001W TYPE TABLE OF TY_T001W,
GS_T001W LIKE LINE OF GT_T001W.
*&---------------------------------------------------------------------*
*& MARA 单位
*&---------------------------------------------------------------------*
TYPES: BEGIN OF TY_MARA,
MATNR TYPE MARA-MATNR,
MEINS TYPE MARA-MEINS,
END OF TY_MARA.
DATA: GT_MARA TYPE TABLE OF TY_MARA,
GS_MARA LIKE LINE OF GT_MARA.
*&---------------------------------------------------------------------*
*& WERKS
*&---------------------------------------------------------------------*
TYPES: BEGIN OF TY_AUFK,
AUFNR TYPE AUFK-AUFNR,
OBJNR TYPE AUFK-OBJNR,
WERKS TYPE AUFK-WERKS,
IDAT2 TYPE AUFK-IDAT2,
END OF TY_AUFK.
DATA: GT_AUFK TYPE TABLE OF TY_AUFK,
GS_AUFK LIKE LINE OF GT_AUFK.
*&---------------------------------------------------------------------*
*& AFPO-MATNR 成品物料
*&---------------------------------------------------------------------*
TYPES: BEGIN OF TY_AFPO,
AUFNR TYPE AFPO-AUFNR,
POSNR TYPE AFPO-POSNR,
MATNR TYPE AFPO-MATNR,
END OF TY_AFPO.
DATA: GT_AFPO TYPE TABLE OF TY_AFPO,
GS_AFPO LIKE LINE OF GT_AFPO.
*----------------------------------------------------------------------*
* 定义ALV数据
*----------------------------------------------------------------------*
DATA:
FUNCTXT TYPE SMP_DYNTXT,
GS_LAYOUT_ALV TYPE SLIS_LAYOUT_ALV,
GT_FIELDCAT_ALV TYPE SLIS_T_FIELDCAT_ALV,
GS_FIELDCAT_ALV TYPE SLIS_FIELDCAT_ALV,
GV_REF_GRID TYPE REF TO CL_GUI_ALV_GRID. "定义引用
*----------------------------------------------------------------------*
* 是否重复执行的标志
*----------------------------------------------------------------------*
DATA: FLAG TYPE C.
*----------------------------------------------------------------------*
* 定义BAPI参数
*----------------------------------------------------------------------*
DATA: GT_HEAD TYPE TABLE OF BAPI2017_GM_HEAD_01, "物料凭证抬头
GS_MODE TYPE BAPI2017_GM_CODE,
GS_HEAD TYPE BAPI2017_GM_HEAD_01,
GV_MAT_DOC TYPE BAPI2017_GM_HEAD_RET-MAT_DOC,
GV_DOC_YEAR TYPE BAPI2017_GM_HEAD_RET-DOC_YEAR,
GT_ITEM TYPE TABLE OF BAPI2017_GM_ITEM_CREATE, "物料凭证行项目
GS_ITEM TYPE BAPI2017_GM_ITEM_CREATE,
GT_RETURN TYPE TABLE OF BAPIRET2, "接收返回数据
GS_RETURN TYPE BAPIRET2.
FIELD-SYMBOLS: <FS_ALV> TYPE TY_ALV.
*&---------------------------------------------------------------------*
* 选择屏幕
*&---------------------------------------------------------------------*
SELECTION-SCREEN: FUNCTION KEY 1."在屏幕定义功能码
SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME TITLE TEXT-001.
PARAMETERS:P_FILE TYPE LOCALFILE MODIF ID M1 . "文件名
SELECTION-SCREEN END OF BLOCK BLK1 .
*&---------------------------------------------------------------------*
*& INITIALIZATION.
*&---------------------------------------------------------------------*
INITIALIZATION.
FUNCTXT-ICON_ID = ICON_EXPORT.
FUNCTXT-QUICKINFO = '下载模板'.
FUNCTXT-ICON_TEXT = '下载模板'.
SSCRFIELDS-FUNCTXT_01 = FUNCTXT.
*----------------------------------------------------------------------*
* At Selection Screen Value Request
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
CALL FUNCTION 'F4_FILENAME'
IMPORTING
FILE_NAME = P_FILE.
*&---------------------------------------------------------------------*
*& AT SELECTION-SCREEN
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN.
CASE SSCRFIELDS-UCOMM.
WHEN 'FC01'."系统预留的功能码
"下载模板文件
PERFORM FRM_DOWNLOAD_EXCEL.
WHEN OTHERS.
ENDCASE.
*&---------------------------------------------------------------------*
*& START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
IF P_FILE IS INITIAL.
MESSAGE '请输入文件路径!' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
PERFORM FRM_UPLOAD_DATA.
PERFORM FRM_DATA_SEL.
*&---------------------------------------------------------------------*
*& END-OF-SELECTION
*&---------------------------------------------------------------------*
END-OF-SELECTION.
PERFORM FRM_SHOW_ALV.
*&---------------------------------------------------------------------*
*& Form frm_download_excel
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM FRM_DOWNLOAD_EXCEL .
DATA:
L_FULLPATH TYPE STRING,
L_PATH TYPE STRING,
L_NAME TYPE STRING.
DATA: LD_SEPARATOR TYPE C.
* 用户选择保存路径
PERFORM FRM_GET_FULLPATH CHANGING L_FULLPATH L_PATH L_NAME.
* 路径为空则退出
IF L_FULLPATH IS INITIAL.
MESSAGE '用户取消操作' TYPE 'S'.
RETURN.
ENDIF.
"下载模板
PERFORM FRM_DOWNLOAD_EXCEL_FROM_SERVER USING L_FULLPATH.
ENDFORM. "frm_download_excel
*&---------------------------------------------------------------------*
*& Form frm_get_fullpath
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_FULLPATH text
* -->P_PATH text
* -->P_NAME text
*----------------------------------------------------------------------*
FORM FRM_GET_FULLPATH CHANGING P_FULLPATH
P_PATH
P_NAME.
DATA: L_INIT_PATH TYPE STRING,
L_INIT_FNAME TYPE STRING,
L_PATH TYPE STRING,
L_FILENAME TYPE STRING,
L_FULLPATH TYPE STRING.
* 初始名称(输出的文件名称)
* L_INIT_FNAME = '物料凭证导入模板' && '.xlsx'.
CONCATENATE '物料凭证导入模板' '.xlsx' INTO L_INIT_FNAME.
* 获取桌面路径
CALL METHOD CL_GUI_FRONTEND_SERVICES=>GET_DESKTOP_DIRECTORY
CHANGING
DESKTOP_DIRECTORY = L_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 = 'XLSX'
DEFAULT_FILE_NAME = L_INIT_FNAME
FILE_FILTER = CL_GUI_FRONTEND_SERVICES=>FILETYPE_ALL "文件类型 all代表全部类型,但是下载输出时必须指明文件类型,不然是白的
INITIAL_DIRECTORY = L_INIT_PATH
PROMPT_ON_OVERWRITE = 'X'
CHANGING
FILENAME = L_FILENAME
PATH = L_PATH
FULLPATH = L_FULLPATH
* USER_ACTION =
* FILE_ENCODING =
EXCEPTIONS
CNTL_ERROR = 1
ERROR_NO_GUI = 2
NOT_SUPPORTED_BY_GUI = 3
OTHERS = 4.
IF SY-SUBRC = 0.
P_FULLPATH = L_FULLPATH.
P_PATH = L_PATH.
ENDIF.
ENDFORM. "frm_get_fullpath
*&---------------------------------------------------------------------*
*& Form frm_download_excel_from_server
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_FILENAME text
*----------------------------------------------------------------------*
FORM FRM_DOWNLOAD_EXCEL_FROM_SERVER USING P_FILENAME.
DATA: L_OBJDATA LIKE WWWDATATAB,
L_MIME LIKE W3MIME,
L_DESTINATION LIKE RLGRAP-FILENAME,
L_OBJNAM TYPE STRING,
L_RC LIKE SY-SUBRC,
L_ERRTXT TYPE STRING.
DATA: L_FILENAME TYPE STRING,
L_RESULT,
L_SUBRC TYPE SY-SUBRC.
DATA: L_OBJID TYPE WWWDATATAB-OBJID .
L_OBJID = 'ZMMF040'. "上传的模版名称 需要下载的模板名称
"查找文件是否存在。
SELECT SINGLE RELID OBJID
FROM WWWDATA
INTO CORRESPONDING FIELDS OF L_OBJDATA
WHERE SRTF2 = 0
AND RELID = 'MI'
AND OBJID = L_OBJID.
"判断模版不存在则报错
IF SY-SUBRC NE 0 OR L_OBJDATA-OBJID EQ SPACE.
CONCATENATE '模板文件:' L_OBJID '不存在,请用TCODE:SMW0进行加载'
INTO L_ERRTXT.
MESSAGE E000(SU) WITH L_ERRTXT.
ENDIF.
L_FILENAME = P_FILENAME.
"判断本地地址是否已经存在此文件。
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST
EXPORTING
FILE = L_FILENAME
RECEIVING
RESULT = L_RESULT
EXCEPTIONS
CNTL_ERROR = 1
ERROR_NO_GUI = 2
WRONG_PARAMETER = 3
NOT_SUPPORTED_BY_GUI = 4
OTHERS = 5.
IF L_RESULT EQ 'X'. "如果存在则删除原始文件,重新覆盖
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_DELETE
EXPORTING
FILENAME = L_FILENAME
CHANGING
RC = L_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 L_SUBRC <> 0. "如果删除失败,则报错。
CONCATENATE '同名EXCEL文件已打开' '请关闭该EXCEL后重试。'
INTO L_ERRTXT.
MESSAGE E000(SU) WITH L_ERRTXT.
ENDIF.
ENDIF.
L_DESTINATION = P_FILENAME.
"下载模版。
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
KEY = L_OBJDATA
DESTINATION = L_DESTINATION
IMPORTING
RC = L_RC.
IF L_RC NE 0.
CONCATENATE '模板文件' '下载失败' INTO L_ERRTXT.
MESSAGE E000(SU) WITH L_ERRTXT.
ENDIF.
ENDFORM. "frm_download_excel_from_server
*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_UPLOAD_DATA .
DATA: L_DATA TYPE TRUXS_T_TEXT_DATA,
LV_MATNR TYPE MARA-MATNR,
LV_AUFNR TYPE AFKO-AUFNR,
LV_LGORT TYPE T001L-LGORT,
LV_MSG(50) TYPE C.
CLEAR GT_EXCEL.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
I_LINE_HEADER = 'X'
I_TAB_RAW_DATA = L_DATA
I_FILENAME = P_FILE
TABLES
I_TAB_CONVERTED_DATA = GT_EXCEL[].
IF GT_EXCEL[] IS NOT INITIAL.
LOOP AT GT_EXCEL INTO GS_EXCEL.
MOVE-CORRESPONDING GS_EXCEL TO GS_ALV.
IF GS_ALV-MATNR = SPACE.
MESSAGE '物料号不能为空' TYPE 'E'.
ENDIF.
IF GS_ALV-AUFNR = SPACE.
MESSAGE '生产订单号不能为空' TYPE 'E'.
ENDIF.
IF GS_ALV-LGORT = SPACE.
MESSAGE '库存地点不能为空' TYPE 'E'.
ENDIF.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
INPUT = GS_ALV-MATNR
IMPORTING
OUTPUT = GS_ALV-MATNR.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = GS_ALV-AUFNR
IMPORTING
OUTPUT = GS_ALV-AUFNR.
"检查物料编码是否存在
SELECT SINGLE MATNR
INTO LV_MATNR
FROM MARA
WHERE MATNR = GS_ALV-MATNR.
IF SY-SUBRC <> 0.
CONCATENATE '物料号' GS_ALV-MATNR '不存在,请检查!' INTO LV_MSG.
MESSAGE LV_MSG TYPE 'E'.
ENDIF.
"检查订单号是否存在
SELECT SINGLE AUFNR
INTO LV_AUFNR
FROM AFKO
WHERE AUFNR = GS_ALV-AUFNR.
IF SY-SUBRC <> 0.
CONCATENATE '订单号' GS_ALV-AUFNR '不存在,请检查!' INTO LV_MSG.
MESSAGE LV_MSG TYPE 'E'.
ENDIF.
"检查库存地点是否存在
SELECT SINGLE LGORT
INTO LV_LGORT
FROM T001L
WHERE LGORT = GS_ALV-LGORT.
IF SY-SUBRC <> 0.
CONCATENATE '库存地点' GS_ALV-LGORT '不存在,请检查!' INTO LV_MSG.
MESSAGE LV_MSG TYPE 'E'.
ENDIF.
"检查数量,給值移动类型
IF GS_ALV-MENGE = 0.
GS_ALV-ZYDLX = ''.
ELSEIF GS_ALV-MENGE < 0.
GS_ALV-ZYDLX = '262'.
GS_ALV-MENGE = ABS( GS_ALV-MENGE ).
ELSEIF GS_ALV-MENGE > 0.
GS_ALV-ZYDLX = '261'.
ENDIF.
APPEND GS_ALV TO GT_ALV.
CLEAR GS_ALV.
ENDLOOP.
ELSE.
MESSAGE '上传文件不包含任何有效数据!' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DATA_SEL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_DATA_SEL .
DATA: LV_MSG(100) TYPE C,
LT_JEST TYPE TABLE OF JEST,
LS_JEST LIKE LINE OF LT_JEST.
DATA: LV_DATE TYPE CHAR2,
L_DATE TYPE CHAR2.
IF GT_ALV IS INITIAL.
MESSAGE 'GT_ALV 数据为空,请检查!' TYPE 'S' DISPLAY LIKE 'E'.
STOP.
ENDIF.
"取物料描述
SELECT MATNR
MAKTX
INTO TABLE GT_MAKT
FROM MAKT
FOR ALL ENTRIES IN GT_ALV
WHERE MATNR = GT_ALV-MATNR AND
SPRAS = '1'.
"取工厂
SELECT AUFNR
OBJNR
WERKS
IDAT2
INTO TABLE GT_AUFK
FROM AUFK
FOR ALL ENTRIES IN GT_ALV
WHERE AUFNR = GT_ALV-AUFNR.
"取成品物料
SELECT AUFNR
POSNR
MATNR
INTO TABLE GT_AFPO
FROM AFPO
FOR ALL ENTRIES IN GT_ALV
WHERE AUFNR = GT_ALV-AUFNR AND
POSNR = 1.
"取单位
SELECT MATNR
MEINS
INTO TABLE GT_MARA
FROM MARA
FOR ALL ENTRIES IN GT_ALV
WHERE MATNR = GT_ALV-MATNR.
SORT GT_MAKT BY MATNR.
SORT GT_AUFK BY AUFNR.
SORT GT_MARA BY MATNR.
SORT GT_AFPO BY AUFNR.
LOOP AT GT_ALV INTO GS_ALV.
CLEAR: LV_DATE,L_DATE.
"读取发料名称
READ TABLE GT_MAKT INTO GS_MAKT WITH KEY MATNR = GS_ALV-MATNR
BINARY SEARCH.
IF SY-SUBRC = 0.
GS_ALV-MAKTX = GS_MAKT-MAKTX.
ENDIF.
"读取工厂
READ TABLE GT_AUFK INTO GS_AUFK WITH KEY AUFNR = GS_ALV-AUFNR
BINARY SEARCH.
IF SY-SUBRC = 0.
GS_ALV-WERKS = GS_AUFK-WERKS.
GS_ALV-IDAT2 = GS_AUFK-IDAT2.
GS_ALV-OBJNR = GS_AUFK-OBJNR.
L_DATE = SY-DATUM+4(2).
LV_DATE = GS_ALV-IDAT2+4(2).
"取工厂名称
SELECT SINGLE NAME1
INTO GS_ALV-NAME1
FROM T001W
WHERE WERKS = GS_ALV-WERKS.
"读取库位名称
SELECT SINGLE LGOBE
INTO GS_ALV-LGOBE
FROM T001L
WHERE WERKS = GS_ALV-WERKS AND
LGORT = GS_ALV-LGORT.
"检查订单状态
SELECT *
INTO TABLE LT_JEST
FROM JEST
WHERE OBJNR = GS_AUFK-OBJNR AND
STAT = 'I0002' AND
INACT = ''.
IF SY-SUBRC = 0.
GS_ALV-TXT04 = 'REL'.
ELSE.
GS_ALV-TXT04 = SPACE.
ENDIF.
IF GS_ALV-TXT04 = SPACE.
SELECT *
INTO TABLE LT_JEST
FROM JEST
WHERE OBJNR = GS_AUFK-OBJNR AND
STAT = 'I0045' AND
INACT = ''.
IF SY-SUBRC = 0.
GS_ALV-TXT04 = 'TECO'.
IF LV_DATE <> L_DATE.
GS_ALV-MSGTP = 'E'.
GS_ALV-MSGTX = '该生产订单于' && GS_ALV-IDAT2 && '关闭,不可投料'.
ENDIF.
* ELSE.
* gs_alv-txt04 = ''.
ENDIF.
ENDIF.
ENDIF.
"读取对象状态
READ TABLE LT_JEST INTO LS_JEST WITH KEY OBJNR = GS_ALV-OBJNR.
IF SY-SUBRC = 0.
GS_ALV-STATU = LS_JEST-STAT.
ENDIF.
"读取单位
READ TABLE GT_MARA INTO GS_MARA WITH KEY MATNR = GS_ALV-MATNR
BINARY SEARCH.
IF SY-SUBRC = 0.
GS_ALV-MEINS = GS_MARA-MEINS.
ENDIF.
"读取成品物料
READ TABLE GT_AFPO INTO GS_AFPO WITH KEY AUFNR = GS_ALV-AUFNR
BINARY SEARCH.
IF SY-SUBRC = 0.
GS_ALV-ZCPWL = GS_AFPO-MATNR.
"读取成品名称
SELECT SINGLE MAKTX
INTO GS_ALV-ZCPMC
FROM MAKT
WHERE MATNR = GS_AFPO-MATNR AND
SPRAS = '1'.
ENDIF.
IF GS_ALV-TXT04 = SPACE.
GS_ALV-MSGTP = 'E'.
GS_ALV-MSGTX = '订单状态不允许发料!' && '/' && GS_ALV-MSGTX.
ENDIF.
IF GS_ALV-MENGE = 0.
GS_ALV-MSGTP = 'E'.
GS_ALV-MSGTX = '发料数量不能为零!' && '/' && GS_ALV-MSGTX.
ENDIF.
"单位转换
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
EXPORTING
INPUT = GS_ALV-MEINS
IMPORTING
OUTPUT = GS_ALV-MEINS.
IF GS_ALV-MSGTP = SPACE.
GS_ALV-MSGTP = 'S'.
GS_ALV-MSGTX = '数据无误,可执行导入!'.
ENDIF.
MODIFY GT_ALV FROM GS_ALV.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_PROCESS_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_PROCESS_DATA .
IF FLAG = 'X'.
MESSAGE '已经执行过一次后需要退出alv界面才能再次导入!' TYPE 'E'.
ENDIF.
FLAG = 'X'.
DATA ZSTONR TYPE TJ30-STONR.
DATA: LT_RETURN TYPE TABLE OF BAPIRET2,
LS_RETURN TYPE BAPIRET2,
LT_METHODS TYPE TABLE OF BAPI_ALM_ORDER_METHOD,
LS_METHODS TYPE BAPI_ALM_ORDER_METHOD,
ET_NUMBERS TYPE TABLE OF BAPI_ALM_NUMBERS,
LT_AUFNR TYPE TABLE OF BAPI_ORDER_KEY,
LS_AUFNR TYPE BAPI_ORDER_KEY,
LT_DETAIL TYPE TABLE OF BAPI_ORDER_RETURN,
LS_DETAIL TYPE BAPI_ORDER_RETURN.
DATA: LT_JSTAT TYPE TABLE OF JSTAT,
LS_JSTAT TYPE JSTAT,
LV_ERROR TYPE STRING,
LV_OBJECT_NOT_FOUND TYPE STRING,
LV_STATUS_INCONSISTENT TYPE STRING,
LV_STATUS_NOT_ALLOWED TYPE STRING.
DATA: LV_MENGE(17) TYPE C,
LV_MSG(50) TYPE C,
LV_AUFNR TYPE AUFK-AUFNR.
READ TABLE GT_ALV INTO GS_ALV WITH KEY MSGTP = 'E'.
IF SY-SUBRC = 0.
MESSAGE '请处理所有错误消息后重新执行导入!' TYPE 'E'.
ENDIF.
SORT GT_ALV BY AUFNR.
LOOP AT GT_ALV ASSIGNING <FS_ALV> WHERE MSGTP <> 'E'.
CLEAR: GS_HEAD,
GS_ITEM,
GS_RETURN.
LV_AUFNR = <FS_ALV>-AUFNR.
AT NEW AUFNR.
GS_MODE-GM_CODE = '03'.
GS_HEAD-PSTNG_DATE = SY-DATUM.
GS_HEAD-DOC_DATE = SY-DATUM.
APPEND GS_HEAD TO GT_HEAD.
IF <FS_ALV>-TXT04 = 'REL'.
GS_ITEM-ORDERID = <FS_ALV>-AUFNR.
LOOP AT GT_ALV INTO GS_ALV WHERE AUFNR = LV_AUFNR.
WRITE GS_ALV-MENGE TO LV_MENGE.
CONDENSE LV_MENGE NO-GAPS.
GS_ITEM-MOVE_TYPE = GS_ALV-ZYDLX."移动类型
GS_ITEM-MATERIAL = GS_ALV-MATNR."物料编码
GS_ITEM-PLANT = GS_ALV-WERKS."工厂
GS_ITEM-STGE_LOC = GS_ALV-LGORT."库位
GS_ITEM-ENTRY_QNT = LV_MENGE."数量
APPEND GS_ITEM TO GT_ITEM.
ENDLOOP.
"调用创建物料凭证BAPI
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
GOODSMVT_HEADER = GS_HEAD
GOODSMVT_CODE = GS_MODE
IMPORTING
MATERIALDOCUMENT = GV_MAT_DOC
MATDOCUMENTYEAR = GV_DOC_YEAR
TABLES
GOODSMVT_ITEM = GT_ITEM
RETURN = GT_RETURN.
"判断是否存在错误信息
LOOP AT GT_RETURN INTO GS_RETURN WHERE TYPE = 'A' OR TYPE = 'E'.
ENDLOOP.
IF SY-SUBRC <> 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
COMMIT WORK.
LOOP AT GT_ALV INTO GS_ALV WHERE AUFNR = LV_AUFNR.
GS_ALV-MSGTP = 'S'.
GS_ALV-MSGTX = '数据导入成功!'.
MODIFY GT_ALV FROM GS_ALV.
ENDLOOP.
CONCATENATE '物料凭证号' GV_MAT_DOC '已保存' INTO LV_MSG.
MESSAGE LV_MSG TYPE 'S'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ROLLBACK WORK.
LOOP AT GT_RETURN INTO GS_RETURN WHERE TYPE = 'A' OR TYPE = 'E'.
LOOP AT GT_ALV INTO GS_ALV WHERE AUFNR = LV_AUFNR.
GS_ALV-MSGTP = 'E'.
GS_ALV-MSGTX = GS_RETURN-MESSAGE.
MODIFY GT_ALV FROM GS_ALV.
ENDLOOP.
ENDLOOP.
ENDIF.
ELSE.
LS_AUFNR-ORDER_NUMBER = <FS_ALV>-AUFNR.
APPEND LS_AUFNR TO LT_AUFNR.
CLEAR LS_AUFNR.
LS_JSTAT-STAT = <FS_ALV>-STATU.
LS_JSTAT-INACT = 'X'.
APPEND LS_JSTAT TO LT_JSTAT.
CLEAR LS_JSTAT.
LS_JSTAT-STAT = 'I0002'.
LS_JSTAT-INACT = ''.
APPEND LS_JSTAT TO LT_JSTAT.
CLEAR LS_JSTAT.
CALL FUNCTION 'STATUS_CHANGE_INTERN'
EXPORTING
* CHECK_ONLY = ' '
CLIENT = SY-MANDT
OBJNR = <FS_ALV>-OBJNR
* ZEILE = ' '
* SET_CHGKZ =
IMPORTING
ERROR_OCCURRED = LV_ERROR
OBJECT_NOT_FOUND = LV_OBJECT_NOT_FOUND
STATUS_INCONSISTENT = LV_STATUS_INCONSISTENT
STATUS_NOT_ALLOWED = LV_STATUS_NOT_ALLOWED
TABLES
STATUS = LT_JSTAT
EXCEPTIONS
OBJECT_NOT_FOUND = 1
STATUS_INCONSISTENT = 2
STATUS_NOT_ALLOWED = 3
OTHERS = 4.
IF SY-SUBRC EQ 0.
GS_ITEM-ORDERID = <FS_ALV>-AUFNR.
LOOP AT GT_ALV INTO GS_ALV WHERE AUFNR = LV_AUFNR.
WRITE GS_ALV-MENGE TO LV_MENGE.
CONDENSE LV_MENGE NO-GAPS.
GS_ITEM-MOVE_TYPE = GS_ALV-ZYDLX."移动类型
GS_ITEM-MATERIAL = GS_ALV-MATNR."物料编码
GS_ITEM-PLANT = GS_ALV-WERKS."工厂
GS_ITEM-STGE_LOC = GS_ALV-LGORT."库位
GS_ITEM-ENTRY_QNT = LV_MENGE."数量
APPEND GS_ITEM TO GT_ITEM.
ENDLOOP.
"执行投料创建物料凭证操作
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
GOODSMVT_HEADER = GS_HEAD
GOODSMVT_CODE = GS_MODE
IMPORTING
MATERIALDOCUMENT = GV_MAT_DOC
MATDOCUMENTYEAR = GV_DOC_YEAR
TABLES
GOODSMVT_ITEM = GT_ITEM
RETURN = GT_RETURN.
LOOP AT GT_RETURN INTO GS_RETURN WHERE TYPE = 'A' OR TYPE = 'E'.
ENDLOOP.
IF SY-SUBRC <> 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
COMMIT WORK.
LOOP AT GT_ALV INTO GS_ALV WHERE AUFNR = LV_AUFNR.
GS_ALV-MSGTP = 'S'.
GS_ALV-MSGTX = '数据导入成功!'.
MODIFY GT_ALV FROM GS_ALV.
ENDLOOP.
CONCATENATE '物料凭证号' GV_MAT_DOC '已保存' INTO LV_MSG.
MESSAGE LV_MSG TYPE 'S'.
"生产订单技术性关闭
CALL FUNCTION 'BAPI_PRODORD_COMPLETE_TECH'
* EXPORTING
* scope_compl_tech = '1'
* WORK_PROCESS_GROUP = 'COWORK_BAPI'
* WORK_PROCESS_MAX = 99
IMPORTING
RETURN = LS_RETURN
TABLES
ORDERS = LT_AUFNR
DETAIL_RETURN = LT_DETAIL.
LOOP AT LT_DETAIL INTO LS_DETAIL WHERE TYPE = 'A' OR TYPE = 'E'.
ENDLOOP.
IF SY-SUBRC <> 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
COMMIT WORK.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ROLLBACK WORK.
LOOP AT LT_DETAIL INTO LS_DETAIL WHERE TYPE = 'A' OR TYPE = 'E'.
LOOP AT GT_ALV INTO GS_ALV WHERE AUFNR = LV_AUFNR.
GS_ALV-MSGTP = LS_DETAIL-TYPE.
GS_ALV-MSGTX = LS_DETAIL-MESSAGE.
MODIFY GT_ALV FROM GS_ALV.
ENDLOOP.
ENDLOOP.
ENDIF.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ROLLBACK WORK.
LOOP AT GT_RETURN INTO GS_RETURN WHERE TYPE = 'A' OR TYPE = 'E'.
LOOP AT GT_ALV INTO GS_ALV WHERE AUFNR = LV_AUFNR.
GS_ALV-MSGTP = GS_RETURN-TYPE.
GS_ALV-MSGTX = GS_RETURN-MESSAGE.
MODIFY GT_ALV FROM GS_ALV.
ENDLOOP.
ENDLOOP.
ENDIF.
ENDIF.
ENDIF.
ENDAT.
CLEAR: GT_HEAD[],GT_ITEM[],GT_RETURN[],LV_AUFNR,LT_AUFNR,LT_JSTAT,LT_DETAIL.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SHOW_ALV
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_SHOW_ALV .
PERFORM FRM_SET_FIELDCAT USING 'AUFNR' 'L' 'K' '生产订单号' 'X'.
PERFORM FRM_SET_FIELDCAT USING 'WERKS' 'L' 'K' '工厂' ''.
PERFORM FRM_SET_FIELDCAT USING 'NAME1' 'L' 'K' '工厂名称' ''.
PERFORM FRM_SET_FIELDCAT USING 'ZCPWL' 'L' 'K' '成品物料' 'X'.
PERFORM FRM_SET_FIELDCAT USING 'ZCPMC' 'L' 'K' '成品名称' ''.
PERFORM FRM_SET_FIELDCAT USING 'TXT04' 'L' 'K' '订单状态' ''.
PERFORM FRM_SET_FIELDCAT USING 'MATNR' 'L' 'K' '发料编码' 'X'.
PERFORM FRM_SET_FIELDCAT USING 'MAKTX' 'L' 'K' '发料名称' ''.
PERFORM FRM_SET_FIELDCAT USING 'MENGE' 'L' 'K' '发料数量' ''.
PERFORM FRM_SET_FIELDCAT USING 'MEINS' 'L' 'K' '单位' ''.
PERFORM FRM_SET_FIELDCAT USING 'ZYDLX' 'L' 'K' '移动类型' ''.
PERFORM FRM_SET_FIELDCAT USING 'LGORT' 'L' 'K' '库位' ''.
PERFORM FRM_SET_FIELDCAT USING 'LGOBE' 'L' 'K' '库位名称' ''.
PERFORM FRM_SET_FIELDCAT USING 'MSGTP' 'L' 'K' '消息类型' ''.
PERFORM FRM_SET_FIELDCAT USING 'MSGTX' 'L' 'K' '消息文本' ''.
GS_LAYOUT_ALV-COLWIDTH_OPTIMIZE = 'X'.
GS_LAYOUT_ALV-ZEBRA = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_USER_COMMAND = 'USER_COMMAND' "自定义按钮响应事件
I_CALLBACK_PF_STATUS_SET = 'SET_PF_STATUS' "设定ALV的自定义按钮'
I_CALLBACK_PROGRAM = SY-REPID "当前程序名
IT_FIELDCAT = GT_FIELDCAT_ALV "字段定义描述表
IS_LAYOUT = GS_LAYOUT_ALV "输出样式
TABLES
T_OUTTAB = GT_ALV "内表输出名称
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
ENDFORM. " FRM_SHOW_ALV
*&---------------------------------------------------------------------*
*& Form FRM_SET_FIELDCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->PV_COL_POS text
* -->PV_FIELDNAME text
* -->PV_JUST text
* -->PV_KEY text
* -->PV_SELTEXT_L text
*----------------------------------------------------------------------*
FORM FRM_SET_FIELDCAT USING PV_FIELDNAME
PV_JUST
PV_KEY
PV_SELTEXT_L
P_ZERO.
CLEAR:GS_FIELDCAT_ALV.
GS_FIELDCAT_ALV-FIELDNAME = PV_FIELDNAME. "字段名
GS_FIELDCAT_ALV-JUST = PV_JUST. "Just L/R/C
GS_FIELDCAT_ALV-KEY = PV_KEY. "主键
GS_FIELDCAT_ALV-SELTEXT_L = PV_SELTEXT_L. "Lable
GS_FIELDCAT_ALV-NO_ZERO = P_ZERO.
APPEND GS_FIELDCAT_ALV TO GT_FIELDCAT_ALV.
ENDFORM. " FRM_SET_FIELDCAT
*&---------------------------------------------------------------------*
*& Form SET_PF_STATUS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM SET_PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.
SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM. "FRM_STATUS_SET
*&---------------------------------------------------------------------*
*& Form USER_COMMAND
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD.
DATA: GV_GRID TYPE REF TO CL_GUI_ALV_GRID.
CASE R_UCOMM.
WHEN 'ZIMPORT'.
PERFORM FRM_PROCESS_DATA."导入并传输数据
ENDCASE.
RS_SELFIELD-REFRESH = 'X'.
ENDFORM.