程序实现功能:根据上传模板批量生成工单和组件(不在上传文件里的组件全部删除)
工单我就不多说了,直接上图
模板(原工单号是我司的特定要求,参考时摘取有用的信息即可):
程序选择界面:
源代码:
REPORT ZPP011.
TYPE-POOLS:SLIS.
TABLES:SSCRFIELDS.
"内表定义
TYPES:BEGIN OF TY_LIST, "
ZYGDH(20) TYPE C, "原工单号'.
MATNR TYPE MARA-MATNR, "物料号'.
MAKTX TYPE MAKT-MAKTX, "物料描述'.
WERKS TYPE WERKS_D, "生产工厂'.
DAUAT TYPE AFPO-DAUAT, "订单类型'.
GAMNG TYPE AFKO-GAMNG, "总数量'.
TERKZ TYPE AFKO-TERKZ, "计划类型'.
GSTRP TYPE AFKO-GSTRP, "开始时间'.
GLTRP TYPE AFKO-GLTRP, "结束时间'.
POSNR TYPE RESBD-POSNR, "项目号'.
MATNR1 TYPE MARA-MATNR, "组件料号'.
MAKTX1 TYPE MAKT-MAKTX, "组件描述'.
MENGE TYPE MENGE_D, "需求数量'.
MEINS TYPE MARA-MEINS, "单位'.
POSTP TYPE POSTP, "项目类别'.
VORNR TYPE VORNR, "工序'.
LGORT TYPE LGORT_D, "库存地点'.
GMEIN TYPE CO_GMEIN,
SEL TYPE C,
ICON TYPE ICON_D,
AUFNR TYPE AUFNR,
MSG(200) TYPE C,
END OF TY_LIST.
TYPES:BEGIN OF TY_ALV, "
ZYGDH(20) TYPE C, "原工单号'.
MATNR TYPE MARA-MATNR, "物料号'.
WERKS TYPE WERKS_D, "生产工厂'.
DAUAT TYPE AFPO-DAUAT, "订单类型'.
GAMNG TYPE AFKO-GAMNG, "总数量'.
TERKZ TYPE AFKO-TERKZ, "计划类型'.
GSTRP TYPE AFKO-GSTRP, "开始时间'.
GLTRP TYPE AFKO-GLTRP, "结束时间'.
POSNR TYPE RESBD-POSNR, "项目号'.
MATNR1 TYPE MARA-MATNR, "组件料号'.
MAKTX1 TYPE MAKT-MAKTX, "组件描述'.
MENGE TYPE MENGE_D, "需求数量'.
MEINS TYPE MARA-MEINS, "单位'.
POSTP TYPE POSTP, "项目类别'.
VORNR TYPE VORNR, "工序'.
LGORT TYPE LGORT_D, "库存地点'.
MAKTX TYPE MAKT-MAKTX, "物料描述'.
GMEIN TYPE CO_GMEIN,
SEL TYPE C,
ICON TYPE ICON_D,
AUFNR TYPE AUFNR,
MSG(200) TYPE C,
END OF TY_ALV.
DATA:GT_ALV TYPE TABLE OF TY_ALV,
GS_ALV TYPE TY_ALV.
*-----定义上载的EXCEL表
DATA:GS_UPLOAD TYPE ZALSMEX_TABLINE,
GT_UPLOAD TYPE TABLE OF ZALSMEX_TABLINE.
DATA:GS_LIST TYPE TY_LIST,
GT_LIST TYPE TABLE OF TY_LIST.
DATA:GV_FLAG TYPE C.
*&---------------------------------------------------------------------*
*& ALV相关定义
*&---------------------------------------------------------------------*
DATA: GS_LAYOUT TYPE LVC_S_LAYO.
DATA: GT_FIELDCAT TYPE LVC_T_FCAT WITH HEADER LINE.
*----------------------------------------------------------------------*
* 选择屏幕参数
*----------------------------------------------------------------------*
SELECTION-SCREEN FUNCTION KEY 1. "按钮“默认模板下载"
SELECTION-SCREEN: BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
PARAMETERS:P_DRRJ TYPE STRING MODIF ID I1. "上传文件
SELECTION-SCREEN: END OF BLOCK B1.
*----------------------------------------------------------------------*
*INITIALIZATION.
*----------------------------------------------------------------------*
INITIALIZATION.
SSCRFIELDS-FUNCTXT_01 = '@48@模板下载'(t01).
*----------------------------------------------------------*
*AT SELECTION-SCREEN ON VALUE-REQUEST.
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_DRRJ.
*------------获取文件
PERFORM FRM_DRRJ."路径搜索帮助打开
*----------------------------------------------------------------------*
*AT SELECTION-SCREEN.
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.
PERFORM FRM_FILE_SMW0.
*----------------------------------------------------------------------*
*AT SELECTION-SCREEN OUTPUT.
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
*----------------------------------------------------------------------*
*START-OF-SELECTION.
*----------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM FRM_UPLOAD_DATA. "将上传数据转换到内表
"------------数据转换到内表
PERFORM FRM_PROCESS_DATA.
END-OF-SELECTION.
PERFORM FRM_DISPALY_DATA.
*&---------------------------------------------------------------------*
*& Form FRM_DRRJ
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_DRRJ .
CALL FUNCTION 'WS_FILENAME_GET' "Get file name
EXPORTING
MASK = ',*.* ,*.*.'
MODE = '0'
TITLE = TEXT-H10
IMPORTING
FILENAME = P_DRRJ
EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 2
SELECTION_CANCEL = 3
SELECTION_ERROR = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
* MESSAGE E016 WITH I_PATH.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FILE_SMW0
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_FILE_SMW0 .
*!!! 默认文件名必须带扩展名,IM_OBJNAME 对象带扩展名,
* 之后更新为系统判定扩展名
DATA: LV_FULLPATH TYPE STRING,
LD_FILENAME_DEFAULT TYPE STRING. "默认文件名
DATA: LS_OBJDATA TYPE WWWDATATAB.
DATA:IM_OBJNAME TYPE WWWDATA-OBJID VALUE 'ZPP011',
IM_FILENAME_DEF TYPE STRING VALUE '未清生产订单导入模板.xlsx'.
DATA: LV_RC LIKE SY-SUBRC,
LV_DES TYPE RLGRAP-FILENAME.
DATA:EX_FULLNAME TYPE STRING.
IF SY-UCOMM = 'FC01'.
*------------从SAP服务器中下载Excel模板
SELECT SINGLE RELID
OBJID
FROM WWWDATA "存对象模板的表
INTO CORRESPONDING FIELDS OF LS_OBJDATA
WHERE SRTF2 = 0
AND RELID = 'MI' "有三种类型 HT MI IT
AND OBJID = IM_OBJNAME.
IF SY-SUBRC <> 0 OR LS_OBJDATA-OBJID = SPACE.
MESSAGE 'Excel 模板不存在,请用TCODE:SMW0进行加载' TYPE 'E'.
RETURN. "--->>> RETURN
ENDIF.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>DIRECTORY_BROWSE
EXPORTING
WINDOW_TITLE = '请选择目录'
INITIAL_FOLDER = 'C:\'
CHANGING
SELECTED_FOLDER = LV_FULLPATH
EXCEPTIONS
CNTL_ERROR = 1
ERROR_NO_GUI = 2
NOT_SUPPORTED_BY_GUI = 3.
IF LV_FULLPATH IS INITIAL.
MESSAGE '请选择保存目录' TYPE 'S'.
RETURN. "--->>> RETURN
ENDIF.
*------------默认文件名
IF IM_FILENAME_DEF IS INITIAL.
LD_FILENAME_DEFAULT = IM_OBJNAME.
ELSE.
LD_FILENAME_DEFAULT = IM_FILENAME_DEF.
ENDIF.
CONCATENATE LV_FULLPATH '\' LD_FILENAME_DEFAULT INTO LV_FULLPATH.
LV_DES = LV_FULLPATH.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
KEY = LS_OBJDATA
DESTINATION = LV_DES
IMPORTING
RC = LV_RC
EXCEPTIONS
OTHERS = 1.
IF LV_RC <> 0.
MESSAGE '下载Excel模板出错' TYPE 'E'.
RETURN. "--->>> RETURN
ENDIF.
EX_FULLNAME = LV_FULLPATH. "返回值
IF EX_FULLNAME IS NOT INITIAL.
CONCATENATE '已经下载到' EX_FULLNAME INTO EX_FULLNAME SEPARATED BY SPACE.
MESSAGE EX_FULLNAME TYPE 'I'.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_UPLOAD_DATA .
DATA:LV_XLS LIKE RLGRAP-FILENAME.
IF P_DRRJ IS INITIAL .
MESSAGE '导入文件地址不能为空!' TYPE 'S' DISPLAY LIKE 'E'..
LEAVE LIST-PROCESSING.
ENDIF.
CLEAR LV_XLS.
LV_XLS = P_DRRJ .
"从第2行第1列开始读取数据
CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
FILENAME = LV_XLS
I_BEGIN_COL = 1
I_BEGIN_ROW = 2
I_END_COL = 17 "读取多少列
I_END_ROW = 9999 "读取多少行
TABLES
INTERN = GT_UPLOAD
EXCEPTIONS
INCONSISTENT_PARAMETERS = 1
UPLOAD_OLE = 2
OTHERS = 3.
IF SY-SUBRC NE 0 .
MESSAGE '从本地文件导入到SAP失败' TYPE 'E'.
ENDIF.
SORT GT_UPLOAD BY ROW COL.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_PROCESS_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_PROCESS_DATA .
DATA:LV_INDEX TYPE I.
FIELD-SYMBOLS : <FS>.
LOOP AT GT_UPLOAD INTO GS_UPLOAD WHERE VALUE <> ''.
MOVE GS_UPLOAD-COL TO LV_INDEX.
ASSIGN COMPONENT LV_INDEX OF STRUCTURE GS_LIST TO <FS>.
<FS> = GS_UPLOAD-VALUE.
AT END OF ROW.
*---物料补前导零
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
INPUT = GS_LIST-MATNR
IMPORTING
OUTPUT = GS_LIST-MATNR
EXCEPTIONS
LENGTH_ERROR = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* implement suitable error handling here
ENDIF.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
INPUT = GS_LIST-MATNR1
IMPORTING
OUTPUT = GS_LIST-MATNR1
EXCEPTIONS
LENGTH_ERROR = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* implement suitable error handling here
ENDIF.
GS_LIST-MEINS = |{ GS_LIST-MEINS ALPHA = IN }|.
APPEND GS_LIST TO GT_LIST.
MOVE-CORRESPONDING GS_LIST TO GS_ALV.
* GS_ALV = GS_LIST.
APPEND GS_ALV TO GT_ALV.
CLEAR: GS_LIST,GS_ALV.
ENDAT.
ENDLOOP.
SELECT MATNR,MEINS AS GMEIN
FROM MARA
INTO TABLE @DATA(LT_MARA)
FOR ALL ENTRIES IN @GT_ALV
WHERE MATNR = @GT_ALV-MATNR.
SORT LT_MARA BY MATNR.
LOOP AT GT_ALV INTO GS_ALV.
READ TABLE LT_MARA INTO DATA(LS_MARA) WITH KEY MATNR = GS_ALV-MATNR.
IF SY-SUBRC = 0.
GS_ALV-GMEIN = LS_MARA-GMEIN.
ENDIF.
GS_ALV-ICON = ICON_LIGHT_OUT.
MODIFY GT_ALV FROM GS_ALV.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPALY_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_DISPALY_DATA .
DEFINE FILL_FIELD.
CLEAR gt_fieldcat.
gt_fieldcat-fieldname = &1.
gt_fieldcat-colddictxt = &2.
gt_fieldcat-no_zero = &3.
gt_fieldcat-ref_table = &4.
gt_fieldcat-ref_field = &5.
gt_fieldcat-scrtext_l = &6.
APPEND gt_fieldcat.
END-OF-DEFINITION.
REFRESH GT_FIELDCAT.
PERFORM FRM_FILL_FIELD.
CLEAR: GS_LAYOUT.
GS_LAYOUT-CWIDTH_OPT = 'X'. "优化列宽选项是否设置
GS_LAYOUT-ZEBRA = 'X'.. "
GS_LAYOUT-BOX_FNAME = 'SEL'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
I_CALLBACK_PF_STATUS_SET = 'SET_ALV_STATUS'
IS_LAYOUT_LVC = GS_LAYOUT
IT_FIELDCAT_LVC = GT_FIELDCAT[]
* i_default = 'X'
I_SAVE = 'A'
TABLES
T_OUTTAB = GT_ALV
EXCEPTIONS
OTHERS = 2.
IF SY-SUBRC <> 0.
ENDIF.
ENDFORM.
FORM SET_ALV_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB .
SET PF-STATUS 'STATUS' EXCLUDING RT_EXTAB.
ENDFORM.
FORM USER_COMMAND USING P_UCOMM TYPE SY-UCOMM
I_SELFIELD TYPE SLIS_SELFIELD.
DATA: LR_GRID TYPE REF TO CL_GUI_ALV_GRID.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = LR_GRID.
CALL METHOD LR_GRID->CHECK_CHANGED_DATA.
"对于输出字段优化列宽
CALL METHOD LR_GRID->GET_FRONTEND_LAYOUT
IMPORTING
ES_LAYOUT = GS_LAYOUT.
GS_LAYOUT-CWIDTH_OPT = 'X'.
CALL METHOD LR_GRID->SET_FRONTEND_LAYOUT
EXPORTING
IS_LAYOUT = GS_LAYOUT.
CASE P_UCOMM."判断按钮代码
WHEN 'ZIN'. "工单创建
PERFORM FRM_CREATE_PO.
WHEN OTHERS.
ENDCASE.
I_SELFIELD-REFRESH = 'X'. "自动刷新
I_SELFIELD-COL_STABLE = 'X'.
I_SELFIELD-ROW_STABLE = 'X'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FILL_FIELD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_FILL_FIELD .
FILL_FIELD:'ICON' 'L' '' '' '' '指示灯'.
FILL_FIELD:'MSG' 'L' '' '' '' '消息'.
FILL_FIELD:'ZYGDH' 'L' 'X' '' '' '原工单号'.
FILL_FIELD:'MATNR' 'L' 'X' 'MARA' 'MATNR' '物料号'.
FILL_FIELD:'MAKTX' 'L' '' '' '' '物料描述'.
FILL_FIELD:'WERKS' 'L' '' '' '' '生产工厂'.
FILL_FIELD:'DAUAT' 'L' '' '' '' '订单类型'.
FILL_FIELD:'GAMNG' 'L' '' '' '' '总数量'.
FILL_FIELD:'TERKZ' 'L' '' '' '' '计划类型'.
FILL_FIELD:'GSTRP' 'L' '' '' '' '开始时间'.
FILL_FIELD:'GLTRP' 'L' '' '' '' '结束时间'.
FILL_FIELD:'POSNR' 'L' '' '' '' '项目号'.
FILL_FIELD:'MATNR1' 'L' '' 'MARA' 'MATNR' '组件料号'.
FILL_FIELD:'MAKTX1' 'L' '' '' '' '组件描述'.
FILL_FIELD:'MENGE' 'L' '' '' '' '需求数量'.
FILL_FIELD:'MEINS' 'L' '' '' '' '单位'.
FILL_FIELD:'POSTP' 'L' '' '' '' '项目类别'.
FILL_FIELD:'VORNR' 'L' '' '' '' '工序'.
FILL_FIELD:'LGORT' 'L' '' '' '' '库存地点'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_PO
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_CREATE_PO .
"创建生产订单
DATA:LS_ORDERDATA TYPE BAPI_PP_ORDER_CREATE,
LS_RETURN TYPE BAPIRET2,
LV_PO TYPE BAPI_ORDER_KEY-ORDER_NUMBER.
"获取组件
DATA:LT_COMPONENTS_DETAIL TYPE TABLE OF BAPI_NETWORK_COMP_DETAIL WITH HEADER LINE.
"移除组件
DATA:LS_REMOVE TYPE BAPI_NETWORK_COMP_ID,
LT_REMOVE TYPE TABLE OF BAPI_NETWORK_COMP_ID,
LS_MSG_TAB TYPE BAPI_METH_MESSAGE,
LT_MSG_TAB TYPE TABLE OF BAPI_METH_MESSAGE.
* "创建组件
DATA:LS_RET TYPE BAPIRET2,
LS_ADD TYPE BAPI_NETWORK_COMP_ADD,
LT_ADD TYPE TABLE OF BAPI_NETWORK_COMP_ADD,
LS_MSG TYPE BAPI_METH_MESSAGE,
LT_MSG TYPE TABLE OF BAPI_METH_MESSAGE.
DATA:IS_ORDER_KEY TYPE COXT_ORD_KEY,
I_MATERIAL TYPE COXT_MATERIAL,
IS_STORAGE_LOCATION TYPE COXT_S_STORAGE_LOCATION,
IS_STORAGE_LOCATIONX TYPE COXT_S_STORAGE_LOCATIONX,
IS_REQU_QUAN TYPE COXT_S_QUANTITY,
I_OPERATION TYPE AFVC-APLZL,
I_POSNO TYPE CIF_R3RES-POSITIONNO,
LS_RETURN2 TYPE COXT_BAPIRETURN,
LV_ERROR TYPE C.
DATA:
LV_MATNR1 TYPE MARA-MATNR,
LV_AUFNR TYPE AFPO-AUFNR,
LV_SORTF TYPE RESB-SORTF,
LV_SORTFX TYPE C,
LV_POSNR TYPE CHAR4.
TYPES: BEGIN OF TY_RESB_BT.
INCLUDE TYPE RESBB.
TYPES: INDOLD TYPE SYST_TABIX.
TYPES: NO_REQ_UPD TYPE SYST_DATAR.
TYPES: END OF TY_RESB_BT.
TYPES TT_RESB_BT TYPE TABLE OF TY_RESB_BT.
FIELD-SYMBOLS: <FT_RESB_BT> TYPE TT_RESB_BT,
<FS_RESB_BT> TYPE TY_RESB_BT.
DATA:BEGIN OF LT_AUFNR OCCURS 0,
AUFNR TYPE AFPO-AUFNR,
END OF LT_AUFNR.
REFRESH LT_AUFNR.
DATA:LV_NUMBER TYPE BAPI_NETWORK_LIST-NETWORK.
SORT GT_ALV BY ZYGDH MATNR WERKS DAUAT .
LOOP AT GT_ALV ASSIGNING FIELD-SYMBOL(<FS_ALV>) .
AT NEW DAUAT.
LS_ORDERDATA-MATERIAL = <FS_ALV>-MATNR. "物料
LS_ORDERDATA-PLANT = <FS_ALV>-WERKS. "工厂
LS_ORDERDATA-ORDER_TYPE = <FS_ALV>-DAUAT. "订单类型
LS_ORDERDATA-BASIC_START_DATE = <FS_ALV>-GSTRP. "开始时间
LS_ORDERDATA-BASIC_END_DATE = <FS_ALV>-GLTRP. "结束时间
LS_ORDERDATA-QUANTITY = <FS_ALV>-GAMNG. "总数量
LS_ORDERDATA-QUANTITY_UOM = <FS_ALV>-GMEIN. "单位
"创建生产订单
CALL FUNCTION 'BAPI_PRODORD_CREATE'
EXPORTING
ORDERDATA = LS_ORDERDATA
* FSH_PRODORD_SEASON =
IMPORTING
RETURN = LS_RETURN
ORDER_NUMBER = LV_PO.
* ORDER_TYPE =
IF LV_PO IS NOT INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
"WAIT UP TO 1 SECONDS.
WAIT UP TO '0.01' SECONDS.
<FS_ALV>-MSG = '创建成功:' && LV_PO.
<FS_ALV>-ICON = ICON_GREEN_LIGHT.
<FS_ALV>-AUFNR = LV_PO.
<FS_ALV>-AUFNR = |{ <FS_ALV>-AUFNR ALPHA = IN }|.
"将原工单号写入抬头文本
UPDATE AUFK SET LTEXT = '1' WHERE AUFNR = LV_PO.
COMMIT WORK AND WAIT.
PERFORM FRM_CREATE_TEXT USING LV_PO.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
<FS_ALV>-MSG = '失败:' && LS_RETURN-MESSAGE.
<FS_ALV>-ICON = ICON_RED_LIGHT.
ENDIF.
ENDAT.
MODIFY GT_ALV FROM <FS_ALV> TRANSPORTING AUFNR MSG ICON WHERE ZYGDH = <FS_ALV>-ZYGDH.
CLEAR:LS_ORDERDATA,
LS_RETURN,
LV_PO.
ENDLOOP.
"创建组件:首先删除之前存在的组件,再用导入的组件创建新组件
LOOP AT GT_ALV ASSIGNING <FS_ALV> WHERE AUFNR <> ''.
* LS_ADD-ACTIVITY = <FS_ALV>-VORNR. "工序
* LS_ADD-ITEM_NUMBER = <FS_ALV>-POSNR. "组件行项目
* LS_ADD-MATERIAL = <FS_ALV>-MATNR1. "组件物料
* LS_ADD-ITEM_TEXT = <FS_ALV>-MAKTX1. "组件描述
* LS_ADD-PLANT = <FS_ALV>-WERKS. "工厂
* LS_ADD-ENTRY_QUANTITY = <FS_ALV>-MENGE. "需求数量
* LS_ADD-BASE_UOM = <FS_ALV>-MEINS. "单位
* LS_ADD-ITEM_CAT = 'L'. "项目类别
* LS_ADD-STGE_LOC = <FS_ALV>-LGORT. "库存地点
* APPEND LS_ADD TO LT_ADD.
* CLEAR:LS_ADD.
* AT END OF AUFNR .
* -----下面删除组件有点问题,每一行组件导入的时候都删除一次所有组件,导致最后只有一条组件信息,应该同一笔工单只有第一次才要删除之前的组件,请注意!
"获取工单的组件信息
LV_NUMBER = <FS_ALV>-AUFNR.
CALL FUNCTION 'BAPI_NETWORK_COMP_GETDETAIL'
EXPORTING
NUMBER = LV_NUMBER
TABLES
E_COMPONENTS_DETAIL = LT_COMPONENTS_DETAIL[].
COMMIT WORK AND WAIT.
IF LT_COMPONENTS_DETAIL[] IS NOT INITIAL.
LOOP AT LT_COMPONENTS_DETAIL INTO DATA(LS_COMPONENTS_DETAIL).
READ TABLE GT_ALV INTO GS_ALV WITH KEY MATNR1 = LS_COMPONENTS_DETAIL-MATERIAL POSNR = LS_COMPONENTS_DETAIL-ITEM_NUMBER .
IF SY-SUBRC <> 0.
LS_REMOVE-COMPONENT = LS_COMPONENTS_DETAIL-COMPONENT.
APPEND LS_REMOVE TO LT_REMOVE.
CLEAR:LS_REMOVE.
ENDIF.
ENDLOOP.
"移除组件
LV_NUMBER = <FS_ALV>-AUFNR.
CALL FUNCTION 'BAPI_NETWORK_COMP_REMOVE'
EXPORTING
NUMBER = LV_NUMBER
TABLES
I_COMPONENTS_REMOVE = LT_REMOVE
E_MESSAGE_TABLE = LT_MSG_TAB.
ENDIF.
"对于组件移除成功的工单,用导入的组件重新创建;若没有组件则直接创建
LOOP AT LT_MSG_TAB INTO LS_MSG_TAB WHERE MESSAGE_TYPE CA 'E'.
ENDLOOP.
IF SY-SUBRC <> 0.
CLEAR:LV_MATNR1,
LV_AUFNR,LV_POSNR,IS_REQU_QUAN,IS_STORAGE_LOCATION,IS_STORAGE_LOCATIONX,
LS_RETURN,LV_ERROR,LV_SORTF,LV_SORTFX.
UNASSIGN:<FT_RESB_BT>,<FS_RESB_BT>.
LV_AUFNR = <FS_ALV>-AUFNR.
LV_MATNR1 = <FS_ALV>-MATNR1.
IS_ORDER_KEY = LV_AUFNR.
I_MATERIAL = LV_MATNR1.
IS_REQU_QUAN-QUANTITY = <FS_ALV>-MENGE.
IS_REQU_QUAN-UOM = <FS_ALV>-MEINS.
IS_STORAGE_LOCATION-WERKS = <FS_ALV>-WERKS.
IS_STORAGE_LOCATIONX-WERKS = 'X'.
IF <FS_ALV>-LGORT IS NOT INITIAL.
IS_STORAGE_LOCATION-LGORT = <FS_ALV>-LGORT.
IS_STORAGE_LOCATIONX-LGORT = 'X'.
ENDIF.
CLEAR:LS_RETURN,
LV_ERROR.
CALL FUNCTION 'CO_XT_COMPONENT_ADD'
EXPORTING
IS_ORDER_KEY = IS_ORDER_KEY
I_MATERIAL = I_MATERIAL
IS_REQU_QUAN = IS_REQU_QUAN
I_OPERATION = I_OPERATION
IS_STORAGE_LOCATION = IS_STORAGE_LOCATION
IS_STORAGE_LOCATIONX = IS_STORAGE_LOCATIONX
I_POSTP = 'L'
I_POSNO = I_POSNO
IMPORTING
ES_BAPIRETURN = LS_RETURN
E_ERROR_OCCURRED = LV_ERROR.
IF LV_ERROR IS INITIAL.
ASSIGN ('(SAPLCOBC)RESB_BT[]') TO <FT_RESB_BT>.
DATA(LV_LINE) = LINES( <FT_RESB_BT> ).
LOOP AT <FT_RESB_BT> ASSIGNING <FS_RESB_BT>.
"新增行数据处理
IF SY-TABIX = LV_LINE.
IF <FS_ALV>-POSNR IS NOT INITIAL.
<FS_RESB_BT>-POSNR = <FS_ALV>-POSNR.
ELSE.
SELECT SINGLE MAX( POSNR )
INTO <FS_RESB_BT>-POSNR
FROM RESB
WHERE AUFNR EQ LV_AUFNR.
<FS_RESB_BT>-POSNR = <FS_RESB_BT>-POSNR + 1.
LV_POSNR = <FS_RESB_BT>-POSNR.
ENDIF.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = <FS_RESB_BT>-POSNR
IMPORTING
OUTPUT = <FS_RESB_BT>-POSNR.
IF <FS_ALV>-VORNR IS NOT INITIAL.
<FS_RESB_BT>-VORNR = <FS_ALV>-VORNR.
ENDIF.
IF <FS_ALV>-MEINS IS NOT INITIAL.
<FS_RESB_BT>-MEINS = <FS_ALV>-MEINS.
ENDIF.
IF <FS_RESB_BT>-XWAOK IS INITIAL.
<FS_RESB_BT>-XWAOK = 'X'.
ENDIF.
ENDIF.
ENDLOOP.
CALL FUNCTION 'CO_XT_ORDER_PREPARE_COMMIT'
IMPORTING
ES_BAPIRETURN = LS_RETURN
E_ERROR_OCCURRED = LV_ERROR.
IF ( LS_RETURN-TYPE = 'S' OR LS_RETURN-TYPE = 'W' OR LS_RETURN-TYPE = 'I' )
OR LS_RETURN IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
CALL FUNCTION 'CO_XT_ORDER_INITIALIZE'.
<FS_ALV>-MSG = '订单' && <FS_ALV>-aufnr && '组件新增成功'.
<FS_ALV>-ICON = ICON_LED_GREEN.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
CLEAR:<FS_ALV>-MSG.
<FS_ALV>-MSG = LS_RETURN-MESSAGE.
<FS_ALV>-ICON = ICON_LED_RED.
ENDIF.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
CLEAR:<FS_ALV>-MSG.
<FS_ALV>-MSG = LS_RETURN-MESSAGE.
<FS_ALV>-ICON = ICON_LED_RED.
ENDIF.
"WAIT UP TO 1 SECONDS.
* CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
* EXPORTING
* WAIT = 'X'.
*
* "创建组件
* CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
* LV_NUMBER = <FS_ALV>-AUFNR.
* CALL FUNCTION 'BAPI_NETWORK_COMP_ADD'
* EXPORTING
* NUMBER = LV_NUMBER
* TABLES
* I_COMPONENTS_ADD = LT_ADD
* E_MESSAGE_TABLE = LT_MSG.
*
* LOOP AT LT_MSG INTO LS_MSG WHERE MESSAGE_TYPE CA 'E'.
* ENDLOOP.
* IF SY-SUBRC <> 0.
*
* COMMIT WORK AND WAIT.
*
* <FS_ALV>-MSG = '创建成功:' && <FS_ALV>-AUFNR.
* <FS_ALV>-ICON = ICON_GREEN_LIGHT.
* ELSE.
* CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
* <FS_ALV>-MSG = '工单' && <FS_ALV>-AUFNR && '组件创建失败:' && LS_MSG-MESSAGE_TEXT .
* <FS_ALV>-ICON = ICON_RED_LIGHT.
* ENDIF.
ENDIF.
CLEAR:LT_REMOVE,
LT_REMOVE[],
LT_MSG_TAB,
LT_MSG_TAB[],
LT_ADD,
LT_ADD[],
LT_MSG,
LT_MSG[],
LV_NUMBER.
* ENDAT.
* MODIFY GT_ALV FROM <FS_ALV> TRANSPORTING AUFNR MSG ICON WHERE ZYGDH = <FS_ALV>-ZYGDH.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_TEXT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LV_PO
*&---------------------------------------------------------------------*
FORM FRM_CREATE_TEXT USING CV_PO.
DATA:LV_FID LIKE THEAD-TDID,
LV_FNAME LIKE THEAD-TDNAME,
LV_FOBJECT LIKE THEAD-TDOBJECT,
LV_TEXT TYPE STRING.
DATA : LT_FLINES LIKE TABLE OF TLINE WITH HEADER LINE .
"将原工单号写入抬头文本
LV_FID = 'KOPF'.
CONCATENATE SY-MANDT CV_PO INTO LV_FNAME.
LV_FOBJECT = 'AUFK'.
LV_TEXT = GS_ALV-ZYGDH.
LT_FLINES-TDLINE = LV_TEXT.
APPEND LT_FLINES .
CLEAR:LT_FLINES .
CALL FUNCTION 'CREATE_TEXT'
EXPORTING
FID = LV_FID
FLANGUAGE = SY-LANGU
FNAME = LV_FNAME
FOBJECT = LV_FOBJECT
TABLES
FLINES = LT_FLINES
EXCEPTIONS
NO_INIT = 1
NO_SAVE = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
CLEAR:LV_FID,
LV_FNAME,
LV_FOBJECT,
LT_FLINES,
LT_FLINES[].
ENDFORM.