SAP DOI EXCEL应用
【应用场景】采用DOI方式打开填充EXCEL数据
*&---------------------------------------------------------------------*
*& 包含 ZFI1009R_TOP
*&---------------------------------------------------------------------*
TABLES:bkpf,bseg.
DATA: gt_list TYPE TABLE OF zsfi1009_02,
gs_list TYPE zsfi1009_02.
"===>DOI 相关变量
DATA gi_spreadsheet TYPE REF TO i_oi_spreadsheet.
DATA gi_document TYPE REF TO i_oi_document_proxy.
DATA gs_sheet TYPE ole2_object.
DATA gs_handle TYPE cntl_handle.
DATA gt_ranges TYPE soi_range_list.
DATA gt_excel_input TYPE soi_generic_table.
DATA gc_container TYPE REF TO cl_gui_custom_container.
DATA gi_control TYPE REF TO i_oi_container_control.
DATA gt_header TYPE soi_generic_table.
DATA gv_menu TYPE c VALUE 'X'.
DATA gv_sapye TYPE p LENGTH 16 DECIMALS 2.
DATA gv_percentage TYPE i.
DATA gt_edit_area TYPE TABLE OF string.
DATA gi_error TYPE REF TO i_oi_error." occurs 0 with header line.
"<===DOI 相关变量
*==============EXCEL 模板变量========================*
DATA gs_temp_name TYPE bds_propva VALUE 'ZFI1009R'. "excel 模板名称
CONSTANTS:
gs_sheet1 TYPE scrfname VALUE '凭证'.
*==================================================*
DATA: lt_ztfi0222 TYPE SORTED TABLE OF ztfi0222
WITH NON-UNIQUE KEY fzhlx priority
WITH HEADER LINE,
lt_ztfi0222_1 TYPE SORTED TABLE OF ztfi0222
WITH NON-UNIQUE KEY sapfzhzd priority
WITH HEADER LINE,
"lt_prhi TYPE TABLE OF prhi WITH HEADER LINE,
lt_ztfi0120 TYPE SORTED TABLE OF ztfi0120
WITH NON-UNIQUE KEY hslx zzxiangmu
WITH HEADER LINE, " 项目分期对应关系[EAS<->SAP]
lt_ztfi0121 TYPE SORTED TABLE OF ztfi0121
WITH NON-UNIQUE KEY hslx zzyeta1 zzxiangmu
WITH HEADER LINE, " 产品类型对应关系[EAS<->SAP]
lt_ztfi0122 TYPE SORTED TABLE OF ztfi0122
WITH NON-UNIQUE KEY hslx zzroom
WITH HEADER LINE, " 房源类型对应关系[EAS<->SAP]
lt_ztfi0123 TYPE SORTED TABLE OF ztfi0123
WITH NON-UNIQUE KEY zzbeiyong1_1 zzbeiyong1 zzbeiyong2
WITH HEADER LINE, " 辅助核算内容对应关系[EAS<->SAP]
lt_ztfi0124 TYPE SORTED TABLE OF ztfi0124
WITH NON-UNIQUE KEY hslx zzhbkid zzhktid
WITH HEADER LINE, " 银行帐户对应关系[EAS<->SAP]
lt_ztfi0161 TYPE SORTED TABLE OF ztfi0161
WITH NON-UNIQUE KEY hslx bukrs zzhetong2
WITH HEADER LINE, " 合同号新旧代码对应关系[EAS期初凭证]
lt_ztfi0170 TYPE SORTED TABLE OF ztfi0170
WITH NON-UNIQUE KEY hslx lifnr
WITH HEADER LINE, " 供应商对应关系[EAS<->SAP]
lt_ztfi0171 TYPE SORTED TABLE OF ztfi0171
WITH NON-UNIQUE KEY hslx kunnr
WITH HEADER LINE, " 客户对应关系[EAS<->SAP]
lt_ztfi0172 TYPE SORTED TABLE OF ztfi0172
WITH NON-UNIQUE KEY hslx kostl
WITH HEADER LINE, " 成本中心对应关系[EAS<->SAP]
lt_ztfi0268 TYPE SORTED TABLE OF ztfi0268
WITH NON-UNIQUE KEY hslx rassc
WITH HEADER LINE, " 贸易伙伴对照表[EAS<->SAP]
lt_ztfi0360 TYPE SORTED TABLE OF ztfi0360
WITH NON-UNIQUE KEY hslx zzmenge
WITH HEADER LINE, " 往来类型对照关系表
lt_ztfi0020 TYPE SORTED TABLE OF ztfi0020
WITH NON-UNIQUE KEY jkxzn
WITH HEADER LINE,
lt_t007s TYPE SORTED TABLE OF t007s
WITH NON-UNIQUE KEY mwskz
WITH HEADER LINE,
BEGIN OF lt_t012k OCCURS 0,
bukrs TYPE t012k-bukrs,
hbkid TYPE t012k-hbkid,
hktid TYPE t012k-hktid,
bankn TYPE t012k-bankn,
bnkn2 TYPE t012k-bnkn2,
zzhktid TYPE zzhktid,
text1 TYPE fibl_txt50,
END OF lt_t012k.
DATA: BEGIN OF gt_fields OCCURS 0,
fields TYPE char20,
desc TYPE char30,
field2 TYPE char20,
field3 TYPE char20,
table TYPE char30,
END OF gt_fields.
SELECT-OPTIONS: s_bukrs FOR bkpf-bukrs,
s_budat FOR bkpf-budat,
s_belnr FOR bkpf-belnr,
s_hd2 FOR bkpf-xref2_hd.
START-OF-SELECTION.
PERFORM frm_check_auth.
PERFORM frm_get_data.
PERFORM frm_process_data.
PERFORM frm_doi_display.*&---------------------------------------------------------------------*
*& Form FRM_DOI_DISPLAY
*&---------------------------------------------------------------------*
FORM frm_doi_display .
CALL SCREEN 100.
ENDFORM.
SCREEN PBO/PAI
*----------------------------------------------------------------------*
***INCLUDE ZFI1009R_M01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS 'ST01'.
* SET TITLEBAR 'xxx'.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module MOD_SET_DOI OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE mod_set_doi OUTPUT.
PERFORM FRM_SET_DOI.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
CASE SY-UCOMM.
WHEN 'SAVE'.
PERFORM FRM_DOI_SAVE.
WHEN 'EXIT' OR 'STOP' OR 'CANCEL'.
PERFORM FRM_DOI_RELEASE.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE.
DOI处理相关方法
*&---------------------------------------------------------------------*
*& 包含 ZFI1009R_DOI
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_DOI_SAVE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_doi_save .
DATA: lr_error TYPE REF TO i_oi_error,
lv_retcode TYPE soi_ret_string,
lv_file_name TYPE c VALUE 'C:\SSS.XLS'.
IF gi_document IS NOT INITIAL.
CALL METHOD gi_document->save_as
EXPORTING
file_name = 'X'
prompt_user = 'X'
IMPORTING
error = lr_error
retcode = lv_retcode.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DOI_RELEASE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_doi_release .
IF gi_spreadsheet IS NOT INITIAL.
FREE gi_spreadsheet.
ENDIF.
IF gi_document IS NOT INITIAL.
CALL METHOD gi_document->close_document.
ENDIF.
IF gc_container IS NOT INITIAL.
CALL METHOD gc_container->free.
ENDIF.
IF gi_control IS NOT INITIAL.
CALL METHOD gi_control->destroy_control.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_DOI
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_set_doi .
IF gs_handle IS INITIAL.
PERFORM frm_doi_create USING gs_temp_name. "创建DOI对象
PERFORM frm_fill_sheets_data. "填写SHEET数据
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DOI_CREATE
*&---------------------------------------------------------------------*
FORM frm_doi_create USING i_temp_name.
DATA item_url TYPE c LENGTH 256.
DATA lv_filename TYPE string.
DATA lv_rc TYPE i.
DATA has TYPE i.
DATA: cl_splitter TYPE REF TO cl_gui_splitter_container,
cl_container TYPE REF TO cl_gui_container.
DATA: iv_percentage TYPE i VALUE '100',
iv_msg(100) VALUE '即将显示数据,请等待......'.
PERFORM frm_display_percent USING 100 '正在打开Excel,请等待......' .
IF NOT gi_document IS INITIAL.
CALL METHOD gi_document->close_document.
FREE gi_document.
ENDIF.
IF NOT gi_control IS INITIAL.
CALL METHOD gi_control->destroy_control.
FREE gi_control.
ENDIF.
"创建DOI Control
CALL METHOD c_oi_container_control_creator=>get_container_control
IMPORTING
control = gi_control.
* 创建CONTIANER
CREATE OBJECT cl_splitter
EXPORTING
parent = cl_gui_container=>screen0
rows = 1
columns = 1.
* 全屏显示
CALL METHOD cl_splitter->set_border
EXPORTING
border = cl_gui_cfw=>false.
cl_container = cl_splitter->get_container( row = 1 column = 1 ).
CALL METHOD gi_control->init_control
EXPORTING
r3_application_name = 'RBasis'
inplace_enabled = 'X'
inplace_scroll_documents = 'X'
parent = cl_container "gc_container
register_on_close_event = 'X'
register_on_custom_event = 'X'
no_flush = 'X'.
* 读取服务器上模板文件
PERFORM frm_doi_oaor_url USING item_url i_temp_name. "OAOR里的EXCEL模版url 注:大模版打开可能很慢
"PERFORM download_template CHANGING item_url.
"PERFORM frm_doi_get_template USING item_url.
CALL METHOD gi_control->get_document_proxy
EXPORTING
document_type = 'Excel.Sheet'
no_flush = 'X'
IMPORTING
document_proxy = gi_document
error = gi_error.
"打开excel
CALL METHOD gi_document->open_document
EXPORTING
open_inplace = 'X'
no_flush = 'X'
document_url = item_url
IMPORTING
error = gi_error.
CALL METHOD gi_document->has_spreadsheet_interface
EXPORTING
no_flush = ''
IMPORTING
is_available = has.
CALL METHOD gi_document->get_spreadsheet_interface
EXPORTING
no_flush = ''
IMPORTING
sheet_interface = gi_spreadsheet.
CALL METHOD gi_document->get_document_handle
EXPORTING
no_flush = ''
IMPORTING
handle = gs_handle.
CALL METHOD gi_error->raise_message
EXPORTING
type = 'E'.
IF gs_handle IS INITIAL.
MESSAGE '打开EXCEL失败,请删除任务管理器中的Excel进程再执行' TYPE 'S' DISPLAY LIKE 'E'.
REJECT.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FILL_SHEETS_DATA
*&---------------------------------------------------------------------*
FORM frm_fill_sheets_data .
DATA: lt_sheets TYPE soi_sheets_table,
wa_sheet TYPE soi_sheets.
CALL METHOD gi_spreadsheet->get_sheets
IMPORTING
sheets = lt_sheets.
"BREAK tuqd.
LOOP AT lt_sheets INTO wa_sheet.
CASE wa_sheet-sheet_name.
WHEN gs_sheet1.
PERFORM frm_open_sheet USING wa_sheet-sheet_name.
PERFORM frm_fill_header_err_message USING wa_sheet-sheet_name 15 35 .
ENDCASE.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_PERCENT
*&---------------------------------------------------------------------*
FORM frm_display_percent USING iv_percentage iv_msg.
DATA lv_text TYPE string.
WHILE gv_percentage < iv_percentage.
gv_percentage = gv_percentage + 1.
MESSAGE s001(00) WITH gv_percentage '%:' iv_msg INTO lv_text.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
text = lv_text
EXCEPTIONS
OTHERS = 1.
PERFORM frm_wait_seconds USING '0.01'.
ENDWHILE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_WAIT_SECONDS
*&---------------------------------------------------------------------*
FORM frm_wait_seconds USING iv_seconds TYPE p.
DATA lv_runtime1 TYPE i.
DATA lv_runtime2 TYPE i.
DATA lv_seconds TYPE i.
lv_seconds = iv_seconds * 1000000.
GET RUN TIME FIELD lv_runtime1.
WHILE lv_runtime2 - lv_runtime1 < lv_seconds.
GET RUN TIME FIELD lv_runtime2.
ENDWHILE.
ENDFORM.
FORM frm_fill_header_err_message USING sheet_name left top .
DATA: lt_list TYPE TABLE OF zsfi1009_01 WITH HEADER LINE.
LOOP AT gt_list INTO gs_list.
MOVE-CORRESPONDING gs_list TO lt_list.
APPEND lt_list.
ENDLOOP.
PERFORM frm_fill_sheet_data TABLES lt_list USING gs_temp_name sheet_name 1 2.
ENDFORM.
FORM frm_fill_sheet_data TABLES pt_excel TYPE STANDARD TABLE
USING pv_template TYPE bds_propva
pv_sheet_name TYPE soi_sheets-sheet_name
pv_left TYPE i
pv_top TYPE i.
DATA l_iref_error TYPE REF TO i_oi_error.
DATA: lt_fields TYPE STANDARD TABLE OF rfc_fields,
lv_last_row TYPE i,
lv_last_col TYPE i,
lv_retcode TYPE soi_ret_string.
DATA lv_info(80).
* CALL METHOD gi_spreadsheet->select_sheet
* EXPORTING
* name = pv_sheet_name
* IMPORTING
* error = l_iref_error.
*
* CHECK l_iref_error->error_code = c_oi_errors=>ret_ok.
CLEAR lt_fields.
CLEAR lt_fields[].
CHECK pt_excel[] IS NOT INITIAL.
CALL FUNCTION 'DP_GET_FIELDS_FROM_TABLE'
TABLES
data = pt_excel
fields = lt_fields.
lv_last_row = lines( pt_excel ).
lv_last_col = lines( lt_fields ).
CALL METHOD gi_spreadsheet->set_selection
EXPORTING
left = pv_left
top = pv_top
rows = lv_last_row
columns = lv_last_col.
CALL METHOD gi_spreadsheet->insert_range
EXPORTING
columns = lv_last_col
rows = lv_last_row
name = pv_template.
CALL METHOD gi_spreadsheet->insert_one_table
EXPORTING
data_table = pt_excel[]
fields_table = lt_fields
rangename = pv_template
"no_flush = 'X'
wholetable = 'X'
IMPORTING
error = l_iref_error
retcode = lv_retcode.
*==========================================================
lv_info = '正在填充数据:' && pv_sheet_name.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
text = lv_info.
ENDFORM.
FORM frm_open_sheet USING pv_sheet_name TYPE soi_sheets-sheet_name.
DATA l_iref_error TYPE REF TO i_oi_error.
DATA: lt_fields TYPE STANDARD TABLE OF rfc_fields,
lv_last_row TYPE i,
lv_last_col TYPE i.
DATA lv_info(80).
CALL METHOD gi_spreadsheet->select_sheet
EXPORTING
name = pv_sheet_name
IMPORTING
error = l_iref_error.
IF l_iref_error->error_code <> c_oi_errors=>ret_ok.
CALL METHOD l_iref_error->raise_message
EXPORTING
type = 'E'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DOI_OAOR_URL
*&---------------------------------------------------------------------*
FORM frm_doi_oaor_url USING ev_url i_temp_name.
DATA lv_classname TYPE sbdst_classname VALUE 'SOFFICEINTEGRATION'.
DATA lv_classtype TYPE sbdst_classtype VALUE 'OT'.
DATA lv_object_key TYPE sbdst_object_key VALUE 'ZFI'.
DATA lcl_instance TYPE REF TO cl_bds_document_set.
DATA lt_signature TYPE sbdst_signature.
DATA ls_signature LIKE LINE OF lt_signature.
DATA lt_components TYPE sbdst_components.
DATA lt_uris TYPE sbdst_uri.
DATA ls_uris LIKE LINE OF lt_uris.
"1.DESCRIPTION 根据描述定位模板 2.BDS_KEYWORD 根据关键字定位模板
ls_signature-prop_name = 'BDS_KEYWORD'.
ls_signature-prop_value = i_temp_name. "'ZFIR004'. "EXCEL
APPEND ls_signature TO lt_signature.
CREATE OBJECT lcl_instance.
CALL METHOD lcl_instance->get_info
EXPORTING
classname = lv_classname
classtype = lv_classtype
object_key = lv_object_key
CHANGING
components = lt_components
signature = lt_signature
EXCEPTIONS
nothing_found = 1
error_kpro = 2
internal_error = 3
parameter_error = 4
not_authorized = 5
not_allowed = 6.
CALL METHOD lcl_instance->get_with_url
EXPORTING
classname = lv_classname
classtype = lv_classtype
object_key = lv_object_key
CHANGING
uris = lt_uris
signature = lt_signature.
DATA lt_table TYPE sbdst_content.
CALL METHOD lcl_instance->get_with_table
EXPORTING
classname = lv_classname
classtype = lv_classtype
object_key = lv_object_key
CHANGING
content = lt_table
signature = lt_signature.
FREE lcl_instance.
SORT lt_uris BY doc_count DESCENDING.
READ TABLE lt_uris INTO ls_uris INDEX 1.
ev_url = ls_uris-uri.
ENDFORM.