ABAP发邮件函数
步骤:
- 一、检查输入参数,
(1)未指定文件類別代碼,
(2)未指定郵件主題,
(3)未指定郵件內容,
(4)未指定發送人郵件地址,
(5)未指定接收人郵件地址,
- 二、调用发送功能,
(1)创建发送请求
(2)创建整理发送内容,
增加附件內容
(3)添加邮件内容到发送请求
(4)設置發送人出件地址
(5)接收者邮件地址转换
(6)第六步,設置狀態屬性
(7)第七步: 正式发送并提交作业
?如何确认是否发送成功,
1.是否可以请求发送接收回执?
2.是否可以返回成功代码?
ABAP发邮件函数:
表:
T_RECIPIENT LIKE UPS_YS_HR_CPERSON 核心人物的明细
RETURN LIKE BAPIRET2 返回参数
FUNCTION ZINT_SEND_EMAIL.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" REFERENCE(KTYPE) TYPE SO_OBJ_TP DEFAULT 'RAW'
*" REFERENCE(SUBJECT) TYPE SO_OBJ_DES
*" REFERENCE(TEXT) TYPE SOLI_TAB
*" REFERENCE(SENDER_ADDRESS) TYPE AD_SMTPADR
*" VALUE(SENDER_NAME) TYPE AD_SMTPADR OPTIONAL
*" VALUE(ATTACHMENTS) TYPE RMPS_T_POST_CONTENT OPTIONAL
*" VALUE(IMMEDIATELY) TYPE BOOLEAN OPTIONAL
*" EXPORTING
*" REFERENCE(E_RESULT) TYPE BOOLEAN
*" TABLES
*" T_RECIPIENT STRUCTURE UPS_YS_HR_CPERSON
*" RETURN STRUCTURE BAPIRET2
*"---------------------------------------------------------------------- DATA:SEND_REQUEST TYPE REF TO CL_BCS,
DOCUMENT TYPE REF TO CL_DOCUMENT_BCS,
SENDER_ID TYPE REF TO IF_SENDER_BCS,
FAIL TYPE REF TO CX_BCS,
RECIPIENT TYPE REF TO IF_RECIPIENT_BCS. DATA:W_RETURN LIKE BAPIRET2,
W_RENAME TYPE AD_SMTPADR,
W_ATTACHMENT LIKE LINE OF ATTACHMENTS,
W_ATTACHMENT_SUBJECT TYPE SOOD-OBJDES. *BREAK CP900.
REFRESH RETURN.
CLEAR E_RESULT.
E_RESULT = 'X'.
IF KTYPE IS INITIAL.
W_RETURN-TYPE = 'E'.
W_RETURN-MESSAGE = '未指定文件類別代碼'.
W_RETURN-PARAMETER = 'KTYPE'.
APPEND W_RETURN TO RETURN.
CLEAR E_RESULT.
ENDIF. IF SUBJECT IS INITIAL.
W_RETURN-TYPE = 'E'.
W_RETURN-MESSAGE = '未指定郵件主題'.
W_RETURN-PARAMETER = 'SUBJECT'.
APPEND W_RETURN TO RETURN.
CLEAR E_RESULT.
ENDIF. IF TEXT[] IS INITIAL.
W_RETURN-TYPE = 'E'.
W_RETURN-MESSAGE = '未指定郵件內容'.
W_RETURN-PARAMETER = 'TEXT'.
APPEND W_RETURN TO RETURN.
CLEAR E_RESULT.
ENDIF. IF SENDER_ADDRESS IS INITIAL.
W_RETURN-TYPE = 'E'.
W_RETURN-MESSAGE = '未指定發送人郵件地址'.
W_RETURN-PARAMETER = 'SENDER_ADDRESS'.
APPEND W_RETURN TO RETURN.
CLEAR E_RESULT.
ENDIF.
IF T_RECIPIENT[] IS INITIAL.
W_RETURN-TYPE = 'E'.
W_RETURN-MESSAGE = '未指定接收人郵件地址'.
W_RETURN-PARAMETER = 'RECIPIENT'.
APPEND W_RETURN TO RETURN.
CLEAR E_RESULT.
ENDIF. CLEAR W_RETURN. CHECK E_RESULT IS NOT INITIAL. TRY.
*&调用
*try.
* 第一步: 创建发送请求
SEND_REQUEST = CL_BCS=>CREATE_PERSISTENT( ). * 第二步: 创建整理发送内容
DOCUMENT = CL_DOCUMENT_BCS=>CREATE_DOCUMENT(
I_TYPE = KTYPE
I_TEXT = TEXT
I_SUBJECT = SUBJECT ).
* 增加附件內容
LOOP AT ATTACHMENTS INTO W_ATTACHMENT.
W_ATTACHMENT_SUBJECT = W_ATTACHMENT-SUBJECT.
DOCUMENT->ADD_ATTACHMENT(
EXPORTING
I_ATTACHMENT_TYPE = W_ATTACHMENT-OBJTP
I_ATTACHMENT_SUBJECT = W_ATTACHMENT_SUBJECT
I_ATT_CONTENT_HEX = W_ATTACHMENT-CONT_HEX ).
ENDLOOP.
* 第三步: 添加邮件内容到发送请求
SEND_REQUEST->SET_DOCUMENT( DOCUMENT ). * 第四步:設置發送人出件地址
SENDER_ID = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS(
I_ADDRESS_STRING = SENDER_ADDRESS
I_ADDRESS_NAME = SENDER_NAME ).
SEND_REQUEST->SET_SENDER( SENDER_ID ). * 第五步: 接收者邮件地址转换
LOOP AT T_RECIPIENT WHERE CPERSON NE '99999999'.
W_RENAME = T_RECIPIENT-EMNAM.
RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS(
I_ADDRESS_STRING = T_RECIPIENT-E_MAIL
I_ADDRESS_NAME = W_RENAME ).
SEND_REQUEST->ADD_RECIPIENT( RECIPIENT ).
ENDLOOP. LOOP AT T_RECIPIENT WHERE CPERSON EQ '99999999'.
W_RENAME = T_RECIPIENT-EMNAM.
RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS(
I_ADDRESS_STRING = T_RECIPIENT-E_MAIL
I_ADDRESS_NAME = W_RENAME ).
* SEND_REQUEST->ADD_RECIPIENT( RECIPIENT ).
CALL METHOD SEND_REQUEST->ADD_RECIPIENT
EXPORTING
I_RECIPIENT = RECIPIENT
I_COPY = 'X'.
ENDLOOP. * 第六步,設置狀態屬性
SEND_REQUEST->SET_STATUS_ATTRIBUTES(
I_REQUESTED_STATUS = 'E'
I_STATUS_MAIL = 'E' ).
SEND_REQUEST->SET_SEND_IMMEDIATELY( IMMEDIATELY ). * 第七步: 正式发送并提交作业
SEND_REQUEST->SEND( I_WITH_ERROR_SCREEN = 'X' ).
COMMIT WORK AND WAIT.
CATCH CX_BCS INTO FAIL.
E_RESULT = ''.
W_RETURN-TYPE = 'E'.
W_RETURN-MESSAGE = FAIL->GET_TEXT( ).
APPEND W_RETURN TO RETURN.
CLEAR W_RETURN.
ENDTRY. ENDFUNCTION.
ABAP发邮件+Excel 附件
*&---------------------------------------------------------------------*
*& Report ZNMMAVW_STOCK_REPORT_CFG *
*& Author: Accenture Developer *
*& Date: 20/10/2016 *
*& Change log: *
*&---------------------------------------------------------------------* REPORT znmmratj_stock_report . *&------------------------------------------------------------------*
*& SELF TABLES/STRUCTURES Declaration *
*&------------------------------------------------------------------*
TYPE-POOLS: slis.
TABLES: bkpf,bseg,mara,mard,ztatj_stk_loc,ztatj_stk_email.
*&------------------------------------------------------------------*
*& Internal Table Definition *
*&------------------------------------------------------------------*
TYPES: BEGIN OF ty_out,
werks LIKE mard-werks, "Plant
bismt LIKE mara-bismt, "Old material number
matnr LIKE mara-matnr, "Material Number
lgort LIKE mard-lgort, "Storage Location
lgobe LIKE t001l-lgobe, "Description of Storage Location
zscsl LIKE mard-labst, "生产报工数量
zjssl LIKE mard-labst, "仓库接收数量
zkcsl LIKE mard-labst, "总库存
meins LIKE mara-meins, "Base Unit of Measure
sel(1),
END OF ty_out. TYPES: BEGIN OF ty_attac,
bismt TYPE char18, "Old material number
matnr TYPE char18, "Material Number
werks TYPE char4, "Plant
lgort TYPE char8, "Storage Location
lgobe TYPE char16, "Description of Storage Location
zscsl TYPE char20, "生产报工数量
zjssl TYPE char20, "仓库接收数量
zkcsl TYPE char20, "总库存
meins TYPE char4, "Base Unit of Measure
END OF ty_attac. TYPES: BEGIN OF ty_mseg,
mblnr LIKE mseg-mblnr, "Number of Material Document
matnr LIKE mseg-matnr, "Material Number
werks LIKE mseg-werks, "Plant
bwart LIKE mseg-bwart, "Movement Type
shkzg LIKE mseg-shkzg, "Debit/Credit Indicator
erfmg LIKE mseg-erfmg, "Quantity in Unit of Entry
lgort LIKE mseg-lgort, "Storage Location
END OF ty_mseg. TYPES: BEGIN OF ty_mara,
matnr LIKE mara-matnr, "Material Number
bismt LIKE mara-bismt, "Old material number
meins LIKE mara-meins, "Base Unit of Measure
END OF ty_mara. TYPES: BEGIN OF ty_mard,
matnr LIKE mard-matnr, "Material Number
werks LIKE mard-werks, "Plant
lgort LIKE mard-lgort, "Storage Location
labst LIKE mard-labst, "Valuated Unrestricted-Use Stock
END OF ty_mard.
*&------------------------------------------------------------------*
*& Global Variants Definition *
*&------------------------------------------------------------------*
DATA: gt_out TYPE TABLE OF ty_out,
gt_mara TYPE TABLE OF ty_mara,
gt_mseg TYPE TABLE OF ty_mseg,
gt_mard TYPE TABLE OF ty_mard,
gt_stkl TYPE TABLE OF ztatj_stk_loc,
gt_email TYPE TABLE OF ztatj_stk_email,
gt_t001l TYPE TABLE OF t001l,
gt_attac TYPE TABLE OF ty_attac WITH HEADER LINE,
gw_out TYPE ty_out,
gw_mara TYPE ty_mara,
gw_mseg TYPE ty_mseg,
gw_mard TYPE ty_mard,
gw_stkl TYPE ztatj_stk_loc,
gw_email TYPE ztatj_stk_email,
gw_t001l TYPE t001l. RANGES: r_bsl FOR mard-lgort, "Backflush Storage location
r_wsl FOR mard-lgort, "Warehouse Storage location
r_sl FOR mard-lgort. "Storage location DATA: gv_err TYPE c. "错误标识
DATA: gv_message_text_output(255) TYPE c,
gt_ztmmatj_prmillog TYPE TABLE OF ztmmatj_prmillog
WITH HEADER LINE,
gv_new_object_id TYPE sofolenti1-object_id .
"alv相关定义
DATA: gt_fieldcat TYPE TABLE OF slis_fieldcat_alv,
gw_layout TYPE slis_layout_alv,
gt_event TYPE slis_t_event,
gw_fieldcat LIKE LINE OF gt_fieldcat.
*&------------------------------------------------------------------*
*& Select Screen *
*&------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-t01.
SELECT-OPTIONS: s_matnr FOR mara-matnr,
s_werks FOR mard-werks.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 1.
PARAMETERS: p_rb_01 as CHECKBOX DEFAULT '' USER-COMMAND
rb01.
SELECTION-SCREEN COMMENT 5(15) text-t03. *SELECTION-SCREEN POSITION 25.
*PARAMETERS: p_rb_02 RADIOBUTTON GROUP gr1.
*SELECTION-SCREEN COMMENT 30(15) text-t03.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK b1. *&------------------------------------------------------------------*
*& START-OF-SELECTION *
*&------------------------------------------------------------------*
START-OF-SELECTION. *****&step1.获取数据到内表
PERFORM frm_get_data. *****&step2.数据处理
CHECK gv_err NE 'X'.
PERFORM frm_edit_data. *****&step3.显示
PERFORM frm_alv_diaplay. *****&step4.发邮件
IF p_rb_01 = 'X'.
PERFORM frm_sent_emial.
ENDIF.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
* 获取数据到内表
*----------------------------------------------------------------------*
FORM frm_get_data .
"数据定义
DATA: lv_date TYPE sy-datum,
lt_mseg TYPE TABLE OF ty_mseg.
"数据初始化
REFRESH:gt_stkl,r_bsl,r_sl,gt_out,gt_mara,
gt_mseg,gt_mard,gt_email,gt_t001l. *****&step1.从自建表获得库存地点信息并放到对应的range table
SELECT * FROM ztatj_stk_loc INTO TABLE gt_stkl
WHERE werks IN s_werks.
*
LOOP AT gt_stkl INTO gw_stkl.
"Backflush Storage location
r_bsl-sign = 'I'.
r_bsl-option = 'EQ'.
r_bsl-low = gw_stkl-zbsl.
APPEND r_bsl. "Backflush Storage location
r_wsl-sign = 'I'.
r_wsl-option = 'EQ'.
r_wsl-low = gw_stkl-zwsl.
APPEND r_wsl. "Storage location
r_sl-sign = 'I'.
r_sl-option = 'EQ'.
r_sl-low = gw_stkl-zbsl.
APPEND r_sl.
r_sl-low = gw_stkl-zwsl.
APPEND r_sl.
CLEAR:gw_stkl,r_bsl,r_sl,r_wsl.
ENDLOOP. *****&step2.从mseg和mkpf获取数据
lv_date = sy-datum - 1. SELECT a~mblnr b~matnr b~werks b~bwart b~shkzg b~erfmg b~lgort
INTO CORRESPONDING FIELDS OF TABLE gt_mseg
FROM mkpf AS a INNER JOIN mseg AS b
ON a~mblnr = b~mblnr
AND a~mjahr = b~mjahr
WHERE ( ( a~cpudt = lv_date "取昨天6点到今天6点的数据
AND a~cputm GE '060000' "昨天6点-24点的数据
AND a~cputm LE '240000' )"加今天0点到6点的数据
OR ( a~cpudt = sy-datum
AND a~cputm LE '060000' ) )
AND b~bwart IN ('131','311')
AND b~matnr IN s_matnr
AND b~lgort IN r_sl
AND b~werks IN s_werks. IF sy-subrc <> 0.
MESSAGE s208(00) WITH 'No data find!' DISPLAY LIKE 'E'.
gv_err = 'X'.
EXIT.
ENDIF. *****&step3.从mara获取物料主数据
"for all entries in
* REFRESH lt_mseg.
* lt_mseg = gt_mseg.
* SORT lt_mseg BY matnr.
* DELETE ADJACENT DUPLICATES FROM lt_mseg COMPARING matnr. SELECT matnr bismt meins INTO TABLE gt_mara FROM mara.
* FOR ALL ENTRIES IN lt_mseg
* WHERE matnr = lt_mseg-matnr. *****&step4.从mard获取库存数据
SELECT matnr werks lgort labst INTO TABLE gt_mard FROM mard
WHERE werks IN s_werks
AND lgort IN r_sl. *****&step5.从自己表中获取ztatj_stk_email获取邮件收件人信息
SELECT * INTO TABLE gt_email FROM ztatj_stk_email. *****&step6.获取库存地点描述
SELECT * INTO TABLE gt_t001l FROM t001l
WHERE werks IN s_werks
AND lgort IN r_sl. ENDFORM. " FRM_GET_DATA
*&---------------------------------------------------------------------*
*& Form FRM_EDIT_DATA
*&---------------------------------------------------------------------*
* 数据处理
*----------------------------------------------------------------------*
FORM frm_edit_data .
DATA:lt_mseg TYPE TABLE OF ty_mseg,
lw_mseg TYPE ty_mseg.
CLEAR:gw_out,gw_mara,gw_mseg,gw_mard,
gw_stkl,gw_email,gw_t001l,lw_mseg.
FREE:lt_mseg.
lt_mseg = gt_mseg. *****&step1.获取料号、计算报工数量、仓库接收数量
LOOP AT gt_mseg INTO gw_mseg.
gw_out-matnr = gw_mseg-matnr.
gw_out-werks = gw_mseg-werks. "计算报工数量
IF gw_mseg-bwart = '131'
AND gw_mseg-lgort IN r_bsl.
gw_out-lgort = gw_mseg-lgort.
gw_out-zscsl = gw_mseg-erfmg.
COLLECT gw_out INTO gt_out.
ENDIF. "仓库接收数量
IF gw_mseg-bwart = '311'.
"同一凭证贷方H 从线边库Backflush;同时借方S到Warehouse
IF gw_mseg-shkzg = 'H'.
READ TABLE lt_mseg INTO lw_mseg
WITH KEY mblnr = gw_mseg-mblnr
shkzg = 'S'.
IF sy-subrc = 0. READ TABLE gt_stkl INTO gw_stkl
WITH KEY werks = gw_mseg-werks
zbsl = gw_mseg-lgort
zwsl = lw_mseg-lgort.
IF sy-subrc = 0.
gw_out-lgort = lw_mseg-lgort.
gw_out-zjssl = gw_mseg-erfmg.
COLLECT gw_out INTO gt_out.
CLEAR:gw_stkl.
ENDIF. ENDIF.
ENDIF. "同一凭证贷方H 从线边库Warehouse;同时借方S到Backflush
IF gw_mseg-shkzg = 'S'.
READ TABLE lt_mseg INTO lw_mseg
WITH KEY mblnr = gw_mseg-mblnr
shkzg = 'H'.
IF sy-subrc = 0.
READ TABLE gt_stkl INTO gw_stkl
WITH KEY werks = gw_mseg-werks
zbsl = gw_mseg-lgort
zwsl = lw_mseg-lgort.
IF sy-subrc = 0.
gw_out-lgort = lw_mseg-lgort.
gw_out-zjssl = 0 - gw_mseg-erfmg.
COLLECT gw_out INTO gt_out.
CLEAR:gw_stkl.
ENDIF.
ENDIF.
ENDIF.
ENDIF. CLEAR:gw_out,gw_mseg,lw_mseg.
ENDLOOP.
*****&step2.获取在warehouse中的且没有做过131、311物料移动的数据
LOOP AT gt_mard INTO gw_mard WHERE lgort IN r_wsl.
READ TABLE gt_out INTO gw_out
WITH KEY matnr = gw_mard-matnr
werks = gw_mard-werks
lgort = gw_mard-lgort.
IF sy-subrc <> 0.
IF gw_mard-labst NE 0.
gw_out-matnr = gw_mard-matnr.
gw_out-werks = gw_mard-werks.
gw_out-lgort = gw_mard-lgort.
APPEND gw_out TO gt_out.
ENDIF.
ENDIF.
CLEAR:gw_out,gw_mard.
ENDLOOP. *****&step3.获取其它输出数据
SORT gt_mara BY matnr.
SORT gt_t001l BY werks lgort.
SORT gt_mard BY matnr werks lgort. LOOP AT gt_out INTO gw_out.
"获取物料类型和物料单位
READ TABLE gt_mara INTO gw_mara
WITH KEY matnr = gw_out-matnr BINARY SEARCH.
IF sy-subrc = 0.
gw_out-bismt = gw_mara-bismt.
gw_out-meins = gw_mara-meins.
ENDIF. "获取库存地点描述
READ TABLE gt_t001l INTO gw_t001l
WITH KEY werks = gw_out-werks
lgort = gw_out-lgort BINARY SEARCH.
IF sy-subrc = 0.
gw_out-lgobe = gw_t001l-lgobe.
ENDIF. "获取总库存
READ TABLE gt_mard INTO gw_mard
WITH KEY matnr = gw_out-matnr
werks = gw_out-werks
lgort = gw_out-lgort BINARY SEARCH.
IF sy-subrc = 0.
gw_out-zkcsl = gw_mard-labst.
ENDIF. MODIFY gt_out FROM gw_out.
CLEAR:gw_out,gw_mara,gw_t001l,gw_mard.
ENDLOOP. SORT gt_out BY werks.
ENDFORM. " FRM_EDIT_DATA
*&---------------------------------------------------------------------*
*& Form FRM_ALV_DIAPLAY
*&---------------------------------------------------------------------*
* 显示
*----------------------------------------------------------------------*
FORM frm_alv_diaplay .
******设置字段输出属性
PERFORM frm_set_fieldcat.
******设置事件
PERFORM frm_set_events.
******设置输出LAYOUT
PERFORM frm_set_layout. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
* i_callback_pf_status_set = e_status
* i_callback_user_command = e_user_command
i_save = 'A'
is_layout = gw_layout
it_fieldcat = gt_fieldcat
it_events = gt_event
TABLES
t_outtab = gt_out
EXCEPTIONS
program_error = 1
OTHERS = 2. ENDFORM. " FRM_ALV_DIAPLAY
*&---------------------------------------------------------------------*
*& Form FRM_SET_FIELDCAT
*&---------------------------------------------------------------------*
* 设置字段输出属性
*----------------------------------------------------------------------*
FORM frm_set_fieldcat .
DATA:l_nn TYPE i.
DEFINE add_fieldcat.
l_nn = l_nn + 1.
clear gw_fieldcat.
gw_fieldcat-fieldname = &1.
gw_fieldcat-seltext_l = &2.
gw_fieldcat-tabname = 'GT_OUT'.
gw_fieldcat-col_pos = l_nn.
gw_fieldcat-key = &3.
gw_fieldcat-no_zero = &4.
append gw_fieldcat to gt_fieldcat.
END-OF-DEFINITION.
CLEAR: gt_fieldcat[],gt_fieldcat.
add_fieldcat 'BISMT' 'Type'(001) 'X' ''.
add_fieldcat 'MATNR' 'Material'(002) 'X' ''.
add_fieldcat 'WERKS' 'Plant'(003) 'X' ''.
add_fieldcat 'LGORT' 'Stor'(004) 'X' ''.
add_fieldcat 'LGOBE' 'Stor Des.'(005) '' ''.
add_fieldcat 'ZSCSL' 'TP Produced Qty Daily'(006) '' 'X' .
add_fieldcat 'ZJSSL' 'WH Received Qty Daily'(007) '' 'X'.
add_fieldcat 'ZKCSL' 'Total Stock'(008) '' 'X'.
add_fieldcat 'MEINS' 'Unit'(009) '' ''. ENDFORM. " FRM_SET_FIELDCAT
*&---------------------------------------------------------------------*
*& Form FRM_SET_EVENTS
*&---------------------------------------------------------------------*
* 设置事件
*----------------------------------------------------------------------*
FORM frm_set_events .
DATA: ls_event TYPE slis_alv_event. CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = gt_event.
ENDFORM. " FRM_SET_EVENTS
*&---------------------------------------------------------------------*
*& Form FRM_SET_LAYOUT
*&---------------------------------------------------------------------*
* 设置输出LAYOUT
*----------------------------------------------------------------------*
FORM frm_set_layout .
CLEAR gw_layout.
MOVE: 'X' TO gw_layout-zebra,
'X' TO gw_layout-colwidth_optimize,
'SEL' TO gw_layout-box_fieldname.
* 'X' TO gw_layout-detail_popup.
ENDFORM. " FRM_SET_LAYOUT
*&---------------------------------------------------------------------*
*& Form FRM_SENT_EMIAL
*&---------------------------------------------------------------------*
* 发邮件
*----------------------------------------------------------------------*
FORM frm_sent_emial .
DATA: i_objpack LIKE sopcklsti1 OCCURS 0 WITH HEADER LINE,
i_objtxt LIKE solisti1 OCCURS 0 WITH HEADER LINE,
i_objbin LIKE solisti1 OCCURS 0 WITH HEADER LINE,
i_reclist LIKE somlreci1 OCCURS 0 WITH HEADER LINE,
i_record LIKE solisti1 OCCURS 0 WITH HEADER LINE,
v_objhead TYPE soli_tab,
v_lines_txt TYPE i,
v_lines_bin TYPE i,
lv_title TYPE so_obj_des,
v_docchgi TYPE sodocchgi1,
v_lines_bin_all TYPE i,
v_filelen TYPE i.
DATA: lv_date TYPE string,
lv_data TYPE string,
lv_time TYPE string,
lv_mess TYPE string. *****&step1.邮件收件人邮箱
LOOP AT gt_email INTO gw_email.
i_reclist-receiver = gw_email-smtp_addr.
i_reclist-express = 'X'. "收件人
i_reclist-rec_type = 'U'.
APPEND i_reclist.
CLEAR: i_reclist,gw_email.
ENDLOOP. *****&step2.邮件主题
lv_title = 'VWATJ Transmission stock daily report 变速器每日库存报告'.
v_docchgi-obj_name = 'Text'.
v_docchgi-expiry_dat = sy-datum + 10 . "过期日期
v_docchgi-sensitivty = 'F'. "Functional object
v_docchgi-doc_size = v_lines_txt * 255.
v_docchgi-obj_descr = lv_title. *****&step3.邮件正文
CLEAR:i_objtxt.
i_objtxt-line = 'Dear All,'.
INSERT i_objtxt INDEX 1.
INSERT INITIAL LINE INTO i_objtxt INDEX 2 . CONCATENATE sy-datum(4) '/' sy-datum+4(2) '/' sy-datum+6(2)
INTO lv_date.
CONCATENATE ' VWATJ Transmission stock daily report on' lv_date
'in the attachment.' INTO lv_mess SEPARATED BY space.
CLEAR:i_objtxt.
i_objtxt-line = lv_mess.
INSERT i_objtxt INDEX 3.
CLEAR:lv_mess.
INSERT INITIAL LINE INTO i_objtxt INDEX 4 . *****&step4.邮件签名 APPEND INITIAL LINE TO i_objtxt. "Initial line
APPEND INITIAL LINE TO i_objtxt. lv_mess = 'Ext.# VWATD:19222, VWATJ:9222'.
MOVE lv_mess TO i_objtxt-line.
APPEND i_objtxt.
CLEAR:lv_mess,i_objtxt. lv_mess = '+86 22 5880 9222'.
MOVE lv_mess TO i_objtxt-line.
APPEND i_objtxt.
CLEAR:lv_mess,i_objtxt. "Initial line
APPEND INITIAL LINE TO i_objtxt. lv_mess = 'http://list.vwatdportal.ap.vwg'.
MOVE lv_mess TO i_objtxt-line.
APPEND i_objtxt.
CLEAR:lv_mess,i_objtxt. lv_mess = 'http://list.vwatjportal.ap.vwg'.
MOVE lv_mess TO i_objtxt-line.
APPEND i_objtxt.
CLEAR:lv_mess,i_objtxt. "Initial line
APPEND INITIAL LINE TO i_objtxt. lv_mess = 'itservice@atd.volkswagen.com.cn'.
MOVE lv_mess TO i_objtxt-line.
APPEND i_objtxt.
CLEAR:lv_mess,i_objtxt. lv_mess = 'itservice@atj.volkswagen.com.cn'.
MOVE lv_mess TO i_objtxt-line.
APPEND i_objtxt.
CLEAR:lv_mess,i_objtxt. "Initial line
APPEND INITIAL LINE TO i_objtxt. lv_mess = 'IT Service, Your reliable IT assistant'.
MOVE lv_mess TO i_objtxt-line.
APPEND i_objtxt.
CLEAR:lv_mess,i_objtxt. "Initial line
APPEND INITIAL LINE TO i_objtxt. CONCATENATE sy-datum(4) '.' sy-datum+4(2) '.' sy-datum+6(2)
INTO lv_data .
CONCATENATE sy-uzeit(2) ':' sy-uzeit+2(2) INTO lv_time.
CONCATENATE lv_data lv_time INTO lv_mess SEPARATED BY space.
MOVE lv_mess TO i_objtxt-line.
APPEND i_objtxt.
CLEAR:lv_mess,i_objtxt. DESCRIBE TABLE i_objtxt LINES v_lines_txt. i_objpack-transf_bin = ''.
i_objpack-head_start = 1.
i_objpack-head_num = 0.
i_objpack-body_start = 1.
i_objpack-body_num = v_lines_txt.
i_objpack-doc_type = 'RAW'.
APPEND i_objpack.
*****&step5.邮件附件
"把输出表数据转化为附件格式数据
PERFORM frm_attac_get.
"输出内表转化为字符串
PERFORM frm_table_change TABLES gt_attac USING lv_mess.
"将字符串转为记录
PERFORM frm_str_record TABLES i_record USING lv_mess v_filelen. APPEND LINES OF i_record TO i_objbin.
DESCRIBE TABLE i_record LINES v_lines_bin.
DESCRIBE TABLE i_objbin LINES v_lines_bin_all.
i_objpack-transf_bin = 'X'.
i_objpack-body_start = v_lines_bin_all - v_lines_bin + 1 .
i_objpack-body_num = v_lines_bin.
i_objpack-doc_type = 'XLS'.
i_objpack-obj_name = 'text'.
i_objpack-doc_size = v_lines_bin * 255.
CONCATENATE 'VWATJ Transmission stock daily report .xls' ''
INTO i_objpack-obj_descr."附件名
APPEND i_objpack. *****&step6.发送邮件
CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
EXPORTING
document_data = v_docchgi
put_in_outbox = 'X'
commit_work = 'X'
* IMPORTING
* new_object_id = gv_new_object_id
TABLES
packing_list = i_objpack
object_header = v_objhead
contents_bin = i_objbin
contents_txt = i_objtxt
receivers = i_reclist
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.
WAIT UP TO 2 SECONDS.
SUBMIT rsconn01 WITH mode = 'INT' AND RETURN.
CLEAR :gv_message_text_output.
gv_message_text_output = text-s03.
MESSAGE s208(00) WITH gv_message_text_output.
* PERFORM frm_modify_gt_ztmmatj_prmillog USING 0 . ELSE.
CLEAR :gv_message_text_output.
PERFORM frm_message_text_build .
MESSAGE s208(00) WITH gv_message_text_output DISPLAY LIKE 'E'.
* PERFORM frm_modify_gt_ztmmatj_prmillog USING 1 . ENDIF. ENDFORM. " FRM_SENT_EMIAL
*&---------------------------------------------------------------------*
*& Form FRM_TABLE_CHANGE
*&---------------------------------------------------------------------*
* "输出内表转化为字符串
*----------------------------------------------------------------------*
FORM frm_table_change TABLES intab
USING outstr TYPE string.
DATA: tab TYPE c VALUE cl_abap_char_utilities=>horizontal_tab,
enter(2) TYPE c VALUE cl_abap_char_utilities=>cr_lf,
n TYPE i.
DATA: BEGIN OF headtab OCCURS 0 ,
length TYPE i ,
decimals TYPE i,
type_kind TYPE c,
name(30) TYPE c,
END OF headtab.
DATA descr_ref TYPE REF TO cl_abap_structdescr.
FIELD-SYMBOLS: <comp_wa> TYPE abap_compdescr ,
<f_field> ,
<f_intab> TYPE ANY .
DATA:str TYPE string,
str2 TYPE string ,
text1 TYPE c.
descr_ref ?= cl_abap_typedescr=>describe_by_data( intab ).
LOOP AT descr_ref->components ASSIGNING <comp_wa>.
MOVE-CORRESPONDING <comp_wa> TO headtab.
APPEND headtab.
ENDLOOP.
DESCRIBE TABLE headtab LINES n.
LOOP AT intab ASSIGNING <f_intab>.
DO n TIMES.
ASSIGN COMPONENT sy-index OF STRUCTURE <f_intab> TO <f_field>.
str = <f_field>.
READ TABLE headtab INDEX sy-index.
IF headtab-type_kind = 'I' OR headtab-type_kind = 'P'
OR headtab-type_kind = 'F'.
SEARCH str FOR '-'.
IF sy-subrc = 0 AND sy-fdpos <> 0.
SPLIT str AT '-' INTO str text1.
CONDENSE str.
CONCATENATE '-' str INTO str.
ELSE.
CONDENSE str.
ENDIF.
ELSE.
* SHIFT str LEFT DELETING LEADING '0' .
ENDIF.
CONCATENATE str2 tab str INTO str2.
ENDDO.
SHIFT str2.
CONCATENATE outstr str2 enter INTO outstr.
CLEAR str2.
ENDLOOP. ENDFORM. " FRM_TABLE_CHANGE
*&---------------------------------------------------------------------*
*& Form FRM_STR_RECORD
*&---------------------------------------------------------------------*
* 将字符串转为记录
*----------------------------------------------------------------------*
FORM frm_str_record TABLES record USING str len.
DATA:tmpbuffer TYPE xstring.
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = str
* mimetype = '"text/html; charset=gb2312"'
mimetype = '"APPLICATION/MSEXCEL;charset=utf-16le"'
* encoding = '8400'
IMPORTING
buffer = tmpbuffer
EXCEPTIONS
failed = 1
OTHERS = 2. IF sy-subrc = 0.
CONCATENATE cl_abap_char_utilities=>byte_order_mark_little
tmpbuffer INTO tmpbuffer IN BYTE MODE.
ENDIF. CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = tmpbuffer
append_to_table = ''
IMPORTING
output_length = len
TABLES
binary_tab = record.
ENDFORM. " FRM_STR_RECORD
*&---------------------------------------------------------------------*
*& Form frm_modify_gt_ZTMMATJ_PRMILLOG
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_SUBRC text
*----------------------------------------------------------------------*
FORM frm_modify_gt_ztmmatj_prmillog USING p_subrc TYPE sysubrc. gt_ztmmatj_prmillog-state = p_subrc.
gt_ztmmatj_prmillog-descp = gv_message_text_output.
IF gt_ztmmatj_prmillog-object_id IS INITIAL.
gt_ztmmatj_prmillog-object_id = gv_new_object_id.
ENDIF.
gt_ztmmatj_prmillog-uname = sy-uname.
gt_ztmmatj_prmillog-datum = sy-datum.
gt_ztmmatj_prmillog-uzeit = sy-uzeit. APPEND gt_ztmmatj_prmillog.
CLEAR:gt_ztmmatj_prmillog. ENDFORM. "frm_modify_gt_ZTMMATJ_PRMILLOG
*&---------------------------------------------------------------------*
*& Form frm_MESSAGE_TEXT_BUILD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM frm_message_text_build.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = sy-msgid
msgnr = sy-msgno
msgv1 = sy-msgv1
msgv2 = sy-msgv2
msgv3 = sy-msgv3
msgv4 = sy-msgv4
IMPORTING
message_text_output = gv_message_text_output.
ENDFORM. "frm_MESSAGE_TEXT_BUILD
*&---------------------------------------------------------------------*
*& Form FRM_ATTAC_GET
*&---------------------------------------------------------------------*
* 把输出表数据转化为附件格式数据
*----------------------------------------------------------------------*
FORM frm_attac_get .
DATA:lw_out TYPE ty_out,
lv_sum LIKE mard-labst.
REFRESH: gt_attac.
CLEAR: gt_attac,lw_out,lv_sum. SORT gt_out BY werks.
LOOP AT gt_out INTO gw_out.
*******& AT END OF 和 ENDAT之间的loop工作区是*号,故要先赋给另一个工作区
MOVE gw_out TO lw_out.
"表头数据
AT NEW werks.
gt_attac-bismt = 'Type'.
gt_attac-matnr = 'Material'.
gt_attac-werks = 'Plnt'.
gt_attac-lgort = 'Sloc'.
gt_attac-lgobe = 'Sloc Des.'.
gt_attac-zscsl = 'TP Produced Qty Daily'.
gt_attac-zjssl = 'WH Recieved Qty Daily'.
gt_attac-zkcsl = 'Total Stock'.
gt_attac-meins = 'Unit'.
APPEND gt_attac.
CLEAR:gt_attac.
gt_attac-bismt = '类型'.
gt_attac-matnr = '物料'.
gt_attac-werks = '工厂'.
gt_attac-lgort = '库存地点'.
gt_attac-lgobe = '库存地点描述'.
gt_attac-zscsl = '生产报工数量 '.
gt_attac-zjssl = '仓库接收数量'.
gt_attac-zkcsl = '总库存'.
gt_attac-meins = '单位'.
APPEND gt_attac.
CLEAR:gt_attac.
ENDAT.
"行项目数据
MOVE-CORRESPONDING lw_out TO gt_attac.
APPEND gt_attac.
CLEAR:gt_attac.
lv_sum = lv_sum + lw_out-zkcsl.
"表尾数据
AT END OF werks.
gt_attac-bismt = 'Total'.
gt_attac-zkcsl = lv_sum.
gt_attac-meins = lw_out-meins.
APPEND gt_attac.
CLEAR:gt_attac,lv_sum.
APPEND INITIAL LINE TO gt_attac.
ENDAT.
ENDLOOP. ENDFORM. " FRM_ATTAC_GET
ABAP发邮件函数的更多相关文章
- ABAP 发邮件(三)
[转自http://blog.sina.com.cn/s/blog_7c7b16000101bnxk.html]SAP ABAP 发邮件方法三(OO) *&------------------ ...
- # PHP - 使用PHPMailer发邮件
PHPMailer支持多种邮件发送方式,使用起来非常简单 1.下载PHPMailer https://github.com/PHPMailer/PHPMailer,下载完成加压后, 把下边的两个文件复 ...
- 在Windows下利用php自带的mail函数发邮件
这几天看<Head First PHP & MySQL>,里面有发邮件的例子是用系统自带的mail函数发送的,自己照书上写的试了一直不成功,后来终于在网上找到解决方案,现在总结下. ...
- Django之使用内置函数和celery发邮件
邮箱配置 开启stmp服务 以163邮箱为例,点击设置里面的stmp 开启客户端授权密码 如上所示,因为我已经开启了,所以出现的是以上页面. 这样,邮箱的准备就已经完成了. 使用Django内置函数发 ...
- PHP自动发邮件
自动发邮件 使用了这个类http://bbs.php100.com/read-htm-tid-121431.html 因他用的php版本较老,用到了函数ereg_replace() 和 ereg() ...
- PHP实例开发(2)PHP通过mail()或Socket发邮件
PHP通过mail()或Socket发邮件 1.PHP中发送邮件的方法 PHP发送邮件是“非常的简单” 因为他提供了mail()函数直接发送,但这也继 register globals 成为了对初学者 ...
- EDM营销算法:python自动批量发邮件
EDM营销:全称Email Direct Marketing,即电子邮件营销.企业可以通过使用EDM软件向目标客户发送EDM邮件,建立同目标顾客的沟通渠道,向其直接传达相关信息,用来促进销售.EDM软 ...
- IOS,发短信,发邮件,打电话
今天把APP里常用小功能 例如发短信.发邮件.打电话.全部拿出来简单说说它们的实现思路. 1.发短信实现打电话的功能,主要二种方法,下面我就分别说说它们的优缺点.1.1.发短信(1)——URL // ...
- 用VBS脚本发邮件
需求是这样的:针对账号的管理,如果发现该账号的管理员给账号加了批注,(比如要过期,修改密码,完善资料等),就需要找到这样的账号及其管理的邮件,然后发邮件给他们的管理员同时抄送给账号以达到提醒的目的.那 ...
随机推荐
- JQuery最佳实践及常见错误(转自 简书)
1 使用JQuery的ready处理器 如果你的代码操作DOM,则需要DOM加载完成后再运行代码.推荐使用如下的第一种写法,第二种写法在JQuery3.x中已经不推荐使用了. $(function ( ...
- Spring 读取配置文件(二)
Spring 读取配置文件并调用 bean package cn.com.test.receive; import org.springframework.beans.factory.annotati ...
- 141. Linked List Cycle【easy】
141. Linked List Cycle[easy] Given a linked list, determine if it has a cycle in it. Follow up:Can y ...
- PIL之基础应用
>>> from PIL import Image >>> #读取图像文件 ... >>> gal=Image.open('/Users/simi ...
- iPhone6 Plus、iPhone6、iPhone5S和之前版本真实分辨率
以前总是嘲笑Android手机屏幕分辨率大小不一,碎片化严重,如今iPhone6发布,让iPhone的分辨率一下子增加到了四种.我们先来制作一张表格来对比说明一下: 以前总是嘲笑Android手机屏幕 ...
- UVa 12563 劲歌金曲 刘汝佳第二版例题9-5;
Problem J Jin Ge Jin Qu [h]ao (If you smiled when you see the title, this problem is for you ^_^) Fo ...
- PHP安装加载yaf扩展
Yaf,全称 Yet Another Framework,是一个C语言编写的PHP框架,是一个用PHP扩展形式提供的PHP开发框架, 相比于一般的PHP框架, 它更快. 它提供了Bootstrap, ...
- 第一百九十一节,jQuery EasyUI 入门
jQuery EasyUI 入门 学习要点: 1.什么是 jQuery EasyUI 2.学习 jQuery EasyUI 的条件 3.jQuery EasyUI 的功能和优势 4.其他的 UI 插件 ...
- web开发之web 验证码--- webqq 机器人
一步一步来做WebQQ机器人-(一)(验证码) http://www.cnblogs.com/lianmin/p/4231340.html http://www.cnblogs.com/liulun/ ...
- 多媒体开发之音频编码---ffmpeg 编码aac
http://blog.csdn.net/ctroll/article/details/8169396