项目中需要将PLM中文档结构导入到SAP中,需要批量导入,现记录下两个关键的函数以及调用参数设置
1.首先需要调用函数CSAP_DOC_BOM_DELETE删除文档原有的结构,否则不可创建结构。
2.注意参数fl_commit_and_wait需要被赋值为X,否则结构创建失败。
REPORT ztest01.
*---------------------------------------------
*声明程序中所使用的type pool
*---------------------------------------------
TYPE-POOLS : truxs, "
slis. "ALV
*---------------------------------------------
*声明程序中所使用的表
*---------------------------------------------
TABLES : sscrfields.
*---------------------------------------------
*声明程序中所使用的变量及自定义类型
*---------------------------------------------
TYPES : BEGIN OF type_line,
dokar TYPE stpo-dokar, "文档类型
doknr TYPE stpo-doknr, "凭证编号
dokvr TYPE stpo-dokvr, "文档版本
doktl TYPE stpo-doktl, "凭证部分
END OF type_line.
TYPES : tab_type_line TYPE STANDARD TABLE OF type_line WITH DEFAULT KEY.
DATA : gt_data TYPE tab_type_line. "全局数据内表.
*---------------------------------------------
*屏幕输入报表筛选条件
*---------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK a1 WITH FRAME TITLE TEXT-001.
PARAMETERS: p_file LIKE rlgrap-filename MODIF ID m2.
SELECTION-SCREEN END OF BLOCK a1.
*---------------------------------------------
*用于屏幕初始化,例如屏幕字段默认值的填充
*---------------------------------------------
INITIALIZATION.
*-------------------------------------------------
*PBO,可以通过修改系统默认SCREEN内表修改屏幕的某些属性
*-------------------------------------------------
AT SELECTION-SCREEN OUTPUT.
*-------------------------------------------------
* 弹出文件选择框
*-------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
PERFORM sub_get_filename USING 'O'
CHANGING p_file.
*---------------------------------------------
*输入结束后启动的模块
*---------------------------------------------
START-OF-SELECTION.
PERFORM sub_process_data USING p_file "上传数据
CHANGING gt_data.
CHECK gt_data[] IS NOT INITIAL.
PERFORM sub_modify_data USING gt_data. "更新数据
*---------------------------------------------
*选择结束事件,一般用于输出列表
*---------------------------------------------
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form SUB_GET_FILENAME
*&---------------------------------------------------------------------*
* 文件选择搜索帮助
*----------------------------------------------------------------------*
FORM sub_get_filename USING VALUE(i_mode) TYPE c
CHANGING VALUE(o_filename) TYPE c.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
mask = ',EXCEL FILE,*.XLS;*.XLSX;'
mode = i_mode
IMPORTING
filename = o_filename
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
ENDFORM. " SUB_GET_FILENAME
*&---------------------------------------------------------------------*
*& FORM SUB_PROCESS_DATA
*&---------------------------------------------------------------------*
* 上传数据
*----------------------------------------------------------------------*
FORM sub_process_data USING VALUE(i_filename) TYPE c
CHANGING VALUE(ot_data) TYPE tab_type_line.
DATA : l_exist TYPE c,
l_filename LIKE rlgrap-filename,
it_raw TYPE truxs_t_text_data.
REFRESH ot_data.
CALL FUNCTION 'TMP_GUI_GET_FILE_EXIST'
EXPORTING
fname = i_filename
IMPORTING
exist = l_exist.
IF sy-subrc NE 0.
MESSAGE '文件不存在!' TYPE 'E'.
ENDIF.
l_filename = i_filename.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
i_line_header = 'X'
i_tab_raw_data = it_raw
i_filename = l_filename
TABLES
i_tab_converted_data = ot_data[]
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
CHECK ot_data[] IS NOT INITIAL.
ENDFORM. "SUB_PROCESS_DATA
*&---------------------------------------------------------------------*
*& Form SUB_MODIFY_DATA
*&---------------------------------------------------------------------*
* 更新数据
*----------------------------------------------------------------------*
FORM sub_modify_data USING VALUE(it_data) TYPE tab_type_line.
DATA : ls_data TYPE type_line,
lt_doc TYPE STANDARD TABLE OF bapi_doc_structure,
ls_doc TYPE bapi_doc_structure,
lt_messages TYPE STANDARD TABLE OF messages.
CALL FUNCTION 'CSAP_DOC_BOM_DELETE'
EXPORTING
document = '10000000006'
doc_type = 'DRW'
doc_part = '000'
doc_vers = '00'
fl_no_change_doc = 'X'
fl_commit_and_wait = 'X'
EXCEPTIONS
error = 1.
LOOP AT it_data INTO ls_data.
ls_doc-documenttype = ls_data-dokar.
ls_doc-documentnumber = ls_data-doknr.
ls_doc-documentpart = ls_data-doktl.
ls_doc-documentversion = ls_data-dokvr.
APPEND ls_doc TO lt_doc.
ENDLOOP.
CALL FUNCTION 'API_DOCUMENT_SAVE_BOM'
EXPORTING
pf_dokar = 'DRW'
pf_doknr = '10000000006'
pf_doktl = '000'
pf_dokvr = '00'
TABLES
pt_documentstructure = lt_doc
pt_messages = lt_messages
EXCEPTIONS
error = 1
OTHERS = 2.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
MESSAGE '导入成功!' TYPE 'S'.
ENDIF.
ENDFORM. " SUB_MODIFY_DATA