未做测试, 仅记备查.
原文地址: http://blog.sina.com.cn/s/blog_3eefd36c01008cmz.html
原理:
通过
CALL METHOD DOCUMENT->GET_MAIL_MERGE_INTERFACE 方法获取邮件合并的一个实例并对该实例进行操作。
优点:
一般的ODI方法为word填充数据需要通过方法
CALL METHOD DOCUMENT->EXECUTE_MACRO 调用宏,此时用户需要将宏的优先级设为低,存在安全风险。该方法避免了宏安全性的设置。
核心代码:
CALL FUNCTION 'SAP_OI_LOAD_MIME_DATA'
EXPORTING
object_id = object_id
IMPORTING
data_size = doc_size
document_format = doc_format
document_type = doc_type
TABLES
data_table = doc_table
EXCEPTIONS
object_not_found = 1
internal_error = 2
OTHERS = 3.
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
IF doc_size NE 0.
doc_type = 'Word.Document.8'.
call method document->open_document_from_table
exporting
document_size = doc_size
document_table = doc_table[]
* open_inplace = 'X'
* startup_macro = macro.
.
CALL METHOD document->play_document_from_table
EXPORTING
document_table = doc_table[]
document_size = doc_size
no_flush = 'X'
* STARTUP_MACRO = macro
IMPORTING
retcode = retcode.
CALL METHOD DOCUMENT->GET_MAIL_MERGE_INTERFACE
* EXPORTING
* NO_FLUSH = ' '
IMPORTING
* ERROR =
MM_INTERFACE = mail_object
* RETCODE =
.
CALL METHOD MAIL_OBJECT->SET_DATA_SOURCE
* EXPORTING
* DATE =
* DDIC_NAME =
* DESCRIPTION = ''
* NO_FLUSH = ' '
* TIME =
* IMPORTING
* ERROR =
* RETCODE =
CHANGING
DATA_TABLE = tab_data
FIELDS_TABLE = tab_field
* PROPERTIES =
.
DATA: l_lines TYPE i.
DESCRIBE TABLE tab_data LINES l_lines.
CALL METHOD MAIL_OBJECT->MERGE_RANGE
EXPORTING
FIRST = 1
LAST = l_lines
* NO_FLUSH = ' '
* IMPORTING
* ERROR =
* RETCODE =
.
CALL METHOD MAIL_OBJECT->VIEW
* EXPORTING
* NO_FLUSH = ' '
* IMPORTING
* ERROR =
* RETCODE =
.
CALL METHOD document->save_copy_as
EXPORTING
file_name = 'c:/sss.doc'
no_flush = 'X'
prompt_user = ' '
IMPORTING
retcode = retcode.
CALL METHOD c_oi_errors=>show_message
EXPORTING
type = 'E'.
PERFORM close_doc.
PERFORM close_factory.
ELSE.
MESSAGE 'No document selected' TYPE 'E'.
ENDIF.
EXPORTING
object_id = object_id
IMPORTING
data_size = doc_size
document_format = doc_format
document_type = doc_type
TABLES
data_table = doc_table
EXCEPTIONS
object_not_found = 1
internal_error = 2
OTHERS = 3.
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
IF doc_size NE 0.
doc_type = 'Word.Document.8'.
call method document->open_document_from_table
exporting
document_size = doc_size
document_table = doc_table[]
* open_inplace = 'X'
* startup_macro = macro.
.
CALL METHOD document->play_document_from_table
EXPORTING
document_table = doc_table[]
document_size = doc_size
no_flush = 'X'
* STARTUP_MACRO = macro
IMPORTING
retcode = retcode.
CALL METHOD DOCUMENT->GET_MAIL_MERGE_INTERFACE
* EXPORTING
* NO_FLUSH = ' '
IMPORTING
* ERROR =
MM_INTERFACE = mail_object
* RETCODE =
.
CALL METHOD MAIL_OBJECT->SET_DATA_SOURCE
* EXPORTING
* DATE =
* DDIC_NAME =
* DESCRIPTION = ''
* NO_FLUSH = ' '
* TIME =
* IMPORTING
* ERROR =
* RETCODE =
CHANGING
DATA_TABLE = tab_data
FIELDS_TABLE = tab_field
* PROPERTIES =
.
DATA: l_lines TYPE i.
DESCRIBE TABLE tab_data LINES l_lines.
CALL METHOD MAIL_OBJECT->MERGE_RANGE
EXPORTING
FIRST = 1
LAST = l_lines
* NO_FLUSH = ' '
* IMPORTING
* ERROR =
* RETCODE =
.
CALL METHOD MAIL_OBJECT->VIEW
* EXPORTING
* NO_FLUSH = ' '
* IMPORTING
* ERROR =
* RETCODE =
.
CALL METHOD document->save_copy_as
EXPORTING
file_name = 'c:/sss.doc'
no_flush = 'X'
prompt_user = ' '
IMPORTING
retcode = retcode.
CALL METHOD c_oi_errors=>show_message
EXPORTING
type = 'E'.
PERFORM close_doc.
PERFORM close_factory.
ELSE.
MESSAGE 'No document selected' TYPE 'E'.
ENDIF.