ABAP上传文件的TCODE:SMW0, OAOR
现在遇到的业务需求是在VA03的订单通过SAP标准的OUTPUT配置打印出order confirmation以后,再打印公司的文字条款内容,WORD格式的两页纸。
最开始想到的实现方式是在NACE->V1 里面的配置中,是否可以配置两个SMARTFORM连续打印。我推测是可以的,因此把同一个SMARTFORM配两次测试了一下,确实可以打印两份。ZSDFM005 我单独COPY一份出来命名为ZSDFM005A以后修改了第二个FORM当中的内容,但是打印出来的是同样的两份。
第二种解决的思路是:ORDER CONFIRMATION采用SMARTFORM格式打印,后面的条款内容采用PDF格式打印,需要自己写PDF的打印逻辑。由于SMW0 OAOR都是上传DOC、EXCEL等OFFICE相关的文件类型,PDF采用什么方式上传服务器,还不知道。当然,我也可以费点周折,将DOC的文档上传后,用程序将DOC文件转换为临时的PDF再去打印。问题在于,不知道怎么写PDF的打印,自己独立的写ABAP打印程序,还是参考RVADOR01来写打印,或者系统本身就支持标准的ROUTINE来打印PDF(OUTPUT TYPE:EMAIL配置中其实是将SMARTFORM以PDF输出后发送给用户进行确认)。
后来问了一个同事,她的建议是调用WORD文件的宏进行打印,我感觉这个方法太妙了,而且实现起来简单。所以,就找了一下DOI的方式。也确实能够实现预期的需求了。不过利用WORD或EXCEL的宏,前提都是要求用户的EXCEL安全级别设置为中或低。FUNCTION认为这个对用户的要求太高,不推荐这种方式去解决问题。
以前就写过一个报表,我测试OK,用户始终说格式有问题,检查宏的代码也没找到原因。后来才发现是她的EXCEL安全级别限制了宏根本无法运行,所以导出的格式比较丑。
DOI的方式虽然简洁,不过宏的运行对用户本地的EXCEL文件安全性设置有要求。
-----NACE配置-------------------------
Output Type ZBA1
Application V1 Sales
Transm. Medium
Layout module
Program ZSD_RVADOR01
Form Routine ENTRY
Form
PDF/Smartform Form ZSDFM005 Form Type smartforms
Program ZSD_RVADOR01
Form Routine ENTRY
Form ZSDFM005
-----------------------------------
"PRINT DOC USE MACRO
data mycontrol type ref to i_oi_container_control.
data mydocument type ref to i_oi_document_proxy.
data mycontainer type ref to cl_gui_custom_container.
call method c_oi_container_control_creator=>get_container_control
importing
control = mycontrol.
create object mycontainer
exporting
container_name = 'MYCONTAINER'.
call method mycontrol->init_control
exporting
r3_application_name = 'SAP ECC'
parent = mycontainer
inplace_enabled = ' '
no_flush = 'X'.
data: bds_instance type ref to cl_bds_document_set.
data: doc_components type sbdst_components,
doc_signature type sbdst_signature,
wa_doc_signature like line of doc_signature,
doc_uris type sbdst_uri,
wa_doc_uris like line of doc_uris.
data: item_url(256).
* if doc_description is not initial.
wa_doc_signature-prop_name = 'DESCRIPTION'.
wa_doc_signature-prop_value = 'ORDER CONFIRMATION N/A TERMS'."doc_description.
append wa_doc_signature to doc_signature.
* endif.
create object bds_instance.
call method bds_instance->get_info
exporting
classname = 'HRFPM_EXCEL_STANDARD'"doc_classname
classtype = 'OT'"doc_classtype
object_key = 'ZSD_ORDER_CONFIRMATION'"doc_object_key
changing
components = doc_components
signature = doc_signature.
call method bds_instance->get_with_url
exporting
classname = 'HRFPM_EXCEL_STANDARD'"doc_classname
classtype = 'OT'"doc_classtype
object_key = 'ZSD_ORDER_CONFIRMATION'"doc_object_key
changing
signature = doc_signature
uris = doc_uris.
free bds_instance.
read table doc_uris into wa_doc_uris index 1.
item_url = wa_doc_uris-uri.
call method mycontrol->get_document_proxy
exporting
document_type = SOI_DOCTYPE_WORD_DOCUMENT"soi_doctype_excel_sheet
importing
document_proxy = mydocument.
call method mydocument->open_document
exporting
open_inplace = 'X'
document_url = item_url.
CALL METHOD mydocument->execute_macro
EXPORTING
macro_string = '模块.macro1'
.
-----------------------------------
以下为转载:
http://sapjava.javaeye.com/blog/419835
Desktop Office Integration
用来集成支持OLE2的应用程序到SAP系统中.它提供了OO的操作方法对应用程序如EXCEL,WORLD等进行打开,修改等操作.目前在一个报表中使用EXCEL作为模板,然后将数据填充到EXCEL中的指定位置中.
首先使用Tcode: OAOR Business Document Navigator将EXCEL模板上传到系统中. 然后使用cl_bds_document_set类获取文档, 再用DOI的相关来操作EXCEL.
DOI参考:http://help.sap.com/saphelp_46c/helpdata/en/21/b53138e1ba11d2bdbe080009b4534c/frameset.htm
系统示例:SAPRDEMOEXCELINTEGRATION2