在工作中,我们常常会遇到以邮件附件的方式发送SAP的订单,出库单或者发票等信息给客户。我这里将实现摘抄下来,供大家参考:
1、设计订单打印smarfform(这就不累述了)
2、设计订单打印程序:几个关键代码照抄如下:
2.1 调用打印程序生成PDF
*---------------------------------------------------------------------*
* FORM PROCESSING *
*---------------------------------------------------------------------*
FORM processing.
DATA: it_otf TYPE STANDARD TABLE OF itcoo,
lt_docs TYPE STANDARD TABLE OF docs,
lt_lines TYPE STANDARD TABLE OF tline.
........
*获取smartform的函数
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = lf_formname
IMPORTING
fm_name = lf_fm_name
EXCEPTIONS
no_form = 1
no_function_module = 2
OTHERS = 3.
IF sy-subrc <> 0.
* error handling
retcode = sy-subrc.
IF sy-subrc = 1.
MESSAGE e006(/kyk/ops_sd) INTO g_dummy.
ENDIF.
IF sy-subrc = 2.
MESSAGE e007(/kyk/ops_sd) WITH lf_formname INTO g_dummy.
ENDIF.
PERFORM protocol_update.
RETURN.
ENDIF.
*准备打印的数据
tvbdpa1[] = tvbdpa[].
REFRESH tvbdpa.
LOOP AT gt_items INTO gs_items.
READ TABLE tvbdpa1 INTO ls_tvbdpa WITH KEY posnr = gs_items-posnr.
IF sy-subrc = 0.
APPEND ls_tvbdpa TO tvbdpa.
ENDIF.
ENDLOOP.
*调用smartform的函数,输出
CALL FUNCTION lf_fm_name
EXPORTING
archive_index = toa_dara
archive_parameters = arc_params
control_parameters = ls_control_param
mail_recipient = ls_recipient
mail_sender = ls_sender
output_options = ls_composer_param
user_settings = ' '
is_nast = nast
is_vbdka = vbdka
is_addres = addr_key
is_items = gt_items
IMPORTING
document_output_info = document_output_info
job_output_info = job_output_info
job_output_options = job_output_options
TABLES
it_vbdpa = tvbdpa "Item information
it_vbdpau = tvbdpau "Subitem numbers
it_vedpa = tkomservp "Contract Item Validity
it_vedka = tkomservh "Contract Header Validity
it_vedpn = tkomservpn "Contract Item Cancellation Data
it_vedkn = tkomservhn "Contract Header Cancellation DA
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
*将答应输出转成PDF文件并存储到内标 lt_lines用于发送
CLEAR : lt_lines.
CALL FUNCTION 'CONVERT_OTF_2_PDF'
IMPORTING
bin_filesize = v_bin_filesize
TABLES
otf = job_output_info-otfdata
doctab_archive = lt_docs
lines = lt_lines
EXCEPTIONS
err_conv_not_possible = 1
err_otf_mc_noendmarker = 2
OTHERS = 3.
*将lt_lines 转换到
PERFORM zqce1_convert
TABLES
lt_lines
objbin.
.........
ENDFORM.
FORM zqce1_convert TABLES t_source_tab STRUCTURE g_pdf_tab
t_target_tab STRUCTURE objbin.
DATA: l_hfeld(1600) TYPE c,
l_offset TYPE p,
l_tabix LIKE sy-tabix,
l_max TYPE i,
l_linecount_source TYPE i,
l_length_source TYPE i,
l_length_target TYPE i.
* line length source pdf files
DESCRIBE FIELD t_source_tab LENGTH l_length_source IN CHARACTER MODE.
* line length of the goal MIME table
DESCRIBE FIELD t_target_tab LENGTH l_length_target IN CHARACTER MODE.
* number of lines source pdf files
DESCRIBE TABLE t_source_tab LINES l_linecount_source.
* the maximum goal size is limited by the field l_hfeld.
l_max = l_length_target + l_length_source.
IF l_max > 1600.
RAISE convert_not_possible.
ENDIF.
REFRESH t_target_tab.
LOOP AT t_source_tab.
l_tabix = sy-tabix.
MOVE t_source_tab TO l_hfeld+l_offset.
* falls letzte zeile der quelltabelle erreicht
IF l_tabix = l_linecount_source.
l_length_source = strlen( t_source_tab ).
ENDIF.
l_offset = l_offset + l_length_source.
WHILE l_offset GE l_length_target.
CLEAR t_target_tab.
t_target_tab = l_hfeld(l_length_target).
APPEND t_target_tab.
SHIFT l_hfeld BY l_length_target PLACES.
l_offset = l_offset - l_length_target.
ENDWHILE. " l_offset ge p_length_targ
* falls letzte zeile der quelltabelle erreicht
IF l_tabix = l_linecount_source.
IF l_offset GT 0.
CLEAR t_target_tab.
t_target_tab = l_hfeld(l_offset).
APPEND t_target_tab.
ENDIF. " l_offset gt 0
ENDIF. " l_tabix = l_linecount_lin
ENDLOOP. " p_source_tab
ENDFORM.
2.2 调用程序发送邮件
*填写邮件内容内表
MOVE '<body bgcolor = "#E6E6FA">' TO ls_body_msg-line.
APPEND ls_body_msg TO lt_body_msg.
........
MOVE '</body>' TO ls_body_msg-line.
APPEND ls_body_msg TO lt_body_msg.
*准备邮件发送内表
"Write Packing List for Body
CLEAR: lt_packing_list, ls_packing_list.
DESCRIBE TABLE lt_body_msg LINES g_tab_lines.
ls_packing_list-head_start = 1.
ls_packing_list-head_num = 0.
ls_packing_list-body_start = 1.
ls_packing_list-body_num = g_tab_lines.
* ls_packing_list-doc_type = 'RAW'. "V005
ls_packing_list-doc_type = 'HTM'. "V005
APPEND ls_packing_list TO lt_packing_list .
*准备Packing List for Attachment
ls_packing_list-transf_bin = 'X'.
ls_packing_list-head_start = 1.
ls_packing_list-head_num = 1.
ls_packing_list-body_start = 1.
DESCRIBE TABLE objbin LINES ls_packing_list-body_num.
ls_packing_list-doc_type = 'PDF'.
ls_packing_list-obj_descr = 'PDF Attachment'.
ls_packing_list-obj_name = 'PDF_ATTACHMENT'.
ls_packing_list-doc_size = ls_packing_list-body_num * 255.
APPEND ls_packing_list TO lt_packing_list.
*Fill the document data and get size of attachment
ls_document_data-obj_langu = nast-spras.
READ TABLE lt_packing_list INTO ls_packing_list INDEX g_tab_lines.
ls_document_data-doc_size = ( g_tab_lines - 1 ) * 255 + strlen( ls_packing_list ).
*填写邮件地址
"Receivers List.
ls_receivers-rec_type = 'U'. "Internet address
ls_receivers-receiver = p_mail.
ls_receivers-com_type = 'INT'.
ls_receivers-notif_del = 'X'.
ls_receivers-notif_ndel = 'X'.
APPEND ls_receivers TO lt_receivers .
CLEAR:ls_receivers.
*发送邮件
CLEAR g_sent_to_all.
"Function module to send mail to Recipients
CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
EXPORTING
document_data = ls_document_data
put_in_outbox = 'X'
commit_work = 'X'
IMPORTING
sent_to_all = g_sent_to_all
TABLES
packing_list = lt_packing_list
contents_bin = objbin
contents_txt = lt_body_msg
receivers = lt_receivers
EXCEPTIONS
too_many_receivers = 1
document_not_sent = 2
document_type_not_exist = 3
operation_no_authorization = 4
parameter_error = 5
x_error = 6
enqueue_error = 7
OTHERS = 8.
IF sy-subrc = 0 .
MESSAGE i303(me) WITH 'Mail has been Successfully Sent.'.
REFRESH : lt_packing_list,
objbin,
lt_body_msg,
lt_receivers.
CLEAR :
ls_document_data.
ELSE.
WAIT UP TO 2 SECONDS.
"This program starts the SAPconnect send process.
SUBMIT rsconn01 WITH mode = 'INT'
WITH output = 'X'
AND RETURN.
ENDIF.
3、定义订单输出
4、创建后台任务定期发送打印
使用sm36创建后台任务,任务调用SD70AV1A,SD70AV2A,SD70AV3A程序即可。
完成以上步骤,系统就能够自动通过邮件的方式发送订单的PDF文件了。
供大家参考!