code20071023 - ooxxvv/MySAPnotes GitHub Wiki
-
根據所指定的 Variant (ALV) ,動態產生不同結構的 Internal table ,並下載其資料。
-
目前只在 non-Unicode 的環境下測試成功。
-
選擇不同的 Download 方式,會隱藏不同的欄位。
-
F4 功能。
-
選擇 Local PC 的檔案。
-
選擇 ALV variant。
-
Initial => 取得此程式 Default 的 ALV variant。
-
可依 ALV variant 所設定的欄位,動態產生不同的 Internal Table 結構。
-
將產生的檔案以附檔的方式,用電子郵件傳給 SAP 系統及外部的使用者。
-
此範例程式碼可以產生的附檔格式:
-
Excel (純文字格式,以 TAB 分隔,副檔名為.xls)
-
Excel (XML格式,副檔名為.xml) => 但在非 unicode 系統下,不能有中文字,否則附檔會無法在 Excel 中開啟。
- DDIF_FIELDINFO_GET
- F4_FILENAME
- GUI_DOWNLOAD
- LT_DBDATA_READ_FROM_LTDX
- REUSE_ALV_FIELDCATALOG_MERGE
- REUSE_ALV_LIST_DISPLAY
- REUSE_ALV_VARIANT_DEFAULT_GET
- REUSE_ALV_VARIANT_F4
- SO_NEW_DOCUMENT_ATT_SEND_API1 => 寄 Email
- CL_ABAP_ELEMDESCR => 設定欄位屬性
- CL_ABAP_STRUCTDESCR => 動態產生 Structure 結構
- CL_ABAP_TABLEDESCR => 產生 Internal Table 結構
REPORT zfis00001 NO STANDARD PAGE HEADING
MESSAGE-ID zx01
LINE-SIZE 1023
LINE-COUNT 65.
************************************************************************
* Variable *
************************************************************************
*---For data
TABLES: mara.
DATA: it_data LIKE mara OCCURS 0 WITH HEADER LINE.
*---For download
FIELD-SYMBOLS: <it_download> TYPE table. "Download data internal table
DATA: g_subrc LIKE syst-subrc. "Set structure successful or not
************************************************************************
* Selection-Screen *
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK bk01 WITH FRAME TITLE text-s01.
SELECT-OPTIONS: s_matnr FOR mara-matnr. "Material NO.
SELECTION-SCREEN END OF BLOCK bk01.
SELECTION-SCREEN BEGIN OF BLOCK bk02 WITH FRAME TITLE text-s02.
PARAMETERS: p_var LIKE disvariant-variant. "ALV variant
SELECTION-SCREEN END OF BLOCK bk02.
SELECTION-SCREEN BEGIN OF BLOCK bk03 WITH FRAME TITLE text-s03.
PARAMETERS: p_report TYPE c AS CHECKBOX DEFAULT 'X'. "Output Report
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_nodown TYPE c RADIOBUTTON GROUP gr00 "No download
USER-COMMAND ra0.
SELECTION-SCREEN COMMENT (20) text-s04.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_server TYPE c RADIOBUTTON GROUP gr00. "Download to server
SELECTION-SCREEN COMMENT (20) text-s05.
PARAMETERS: p_file_s LIKE ibipparms-path. "Server path & file name
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_local TYPE c RADIOBUTTON GROUP gr00. "Download to local
SELECTION-SCREEN COMMENT (20) text-s06.
PARAMETERS: p_file_l LIKE rlgrap-filename. "Local path & file name
SELECTION-SCREEN END OF LINE.
PARAMETERS: p_email TYPE c AS CHECKBOX. "Email
SELECTION-SCREEN END OF BLOCK bk03.
************************************************************************
* Initialization *
************************************************************************
INITIALIZATION.
PERFORM get_default_alv_variant CHANGING p_var.
PERFORM ini_file_path.
************************************************************************
* At selection-screen *
************************************************************************
AT SELECTION-SCREEN OUTPUT.
PERFORM file_path_control.
AT SELECTION-SCREEN.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_var.
PERFORM f4_alv_variant CHANGING p_var.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file_l.
PERFORM f4_local_filename CHANGING p_file_l.
************************************************************************
* Start of selection *
************************************************************************
START-OF-SELECTION.
PERFORM file_path_control.
*---Get data
PERFORM get_data.
IF p_nodown NE 'X'.
*---Set structure & get data
PERFORM get_data_by_alv_variant USING p_var "ALV variant
'MARA' "Structure name
CHANGING g_subrc. "Return status
IF g_subrc NE 0.
STOP.
ENDIF.
*---Download data
CASE 'X'.
WHEN p_local.
PERFORM download_to_local.
WHEN p_server.
PERFORM download_to_server.
ENDCASE.
*---Email
IF p_email EQ 'X'.
PERFORM send_mail.
ENDIF.
ENDIF.
*---Output ALV report
IF p_report EQ 'X'.
PERFORM output_data_alv.
ENDIF.
************************************************************************
* End of selelction *
************************************************************************
END-OF-SELECTION.
************************************************************************
* Form *
************************************************************************
*&---------------------------------------------------------------------*
*& Form ini_file_path
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM ini_file_path .
p_file_l = 'C/\test.txt'.
p_file_s = '/tmp/test.txt'.
ENDFORM. " ini_file_path
*&---------------------------------------------------------------------*
*& Form file_path_control
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM file_path_control .
LOOP AT SCREEN.
CASE screen-name.
WHEN 'P_FILE_S'.
IF p_server EQ 'X'.
screen-required = 1.
ELSE.
screen-input = 0.
ENDIF.
MODIFY SCREEN.
WHEN 'P_FILE_L'.
IF p_local EQ 'X'.
screen-required = 1.
ELSE.
screen-input = 0.
ENDIF.
MODIFY SCREEN.
ENDCASE.
ENDLOOP.
ENDFORM. " file_path_control
*&---------------------------------------------------------------------*
*& Form output_data_alv
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM output_data_alv .
TYPE-POOLS: slis.
DATA: lt_fieldcat TYPE slis_t_fieldcat_alv, "ALV field setting
lw_variant LIKE disvariant, "ALV variant
lw_layout TYPE slis_layout_alv, "ALV layout
l_var_save(1) TYPE c, "ALV variant can be save or not
lt_event TYPE slis_t_event, "ALV events perform name
lt_sort TYPE slis_t_sortinfo_alv. "ALV fields sort
DATA: l_tabname LIKE dd02l-tabname. "Structure name for ALV fields
*---1. Input AVL setting
*------1.1 Set structure name for ALV fields
l_tabname = 'MARA'.
*------1.2 Set ALV layout
lw_layout-totals_text = text-h01. " Totals
lw_layout-subtotals_text = text-h02. " Subtotal
lw_layout-zebra = 'X'. " Striped pattern
lw_layout-colwidth_optimize = 'X'.
*------1.3 Get ALV field setting from ABAP dictionary
CLEAR: lt_fieldcat, lt_fieldcat[].
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = sy-repid
i_structure_name = l_tabname
i_client_never_display = 'X'
CHANGING
ct_fieldcat = lt_fieldcat[]
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
*------1.4 Set ALV fields sort
CLEAR: lt_sort.
*------1.5 Set ALV variant can be save or not
l_var_save = 'A'.
*------1.6 Set ALV variant
CLEAR: lw_variant.
lw_variant-report = sy-repid.
lw_variant-variant = p_var.
*------1.7 Set ALV events perform name
CLEAR: lt_event.
*---2. Call ALV output function to output data
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_structure_name = l_tabname
is_layout = lw_layout
it_fieldcat = lt_fieldcat
it_sort = lt_sort
i_save = l_var_save
is_variant = lw_variant
it_events = lt_event
TABLES
t_outtab = it_data
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM. " output_data_alv
*&---------------------------------------------------------------------*
*& Form download_to_local
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM download_to_local .
DATA: l_filename TYPE string.
CLEAR: l_filename.
l_filename = p_file_l.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filename = l_filename
write_field_separator = 'X'
TABLES
data_tab = <it_download>
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE i398(00) WITH 'Download error, sy-subrc = ' sy-subrc.
ELSE.
MESSAGE s398(00) WITH 'Download succeed'.
ENDIF.
ENDFORM. " download_to_local
*&---------------------------------------------------------------------*
*& Form download_to_server
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM download_to_server .
FIELD-SYMBOLS: <lw_line> TYPE ANY,
<l_field> TYPE ANY.
DATA: l_line TYPE string,
l_subrc LIKE sy-subrc,
l_index LIKE sy-index.
*---1. Set SEPARATED symbol
DATA: l_tab(1) TYPE c.
l_tab = cl_abap_char_utilities=>horizontal_tab.
*---2. Transfer to Dataset
OPEN DATASET p_file_s FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
IF sy-subrc NE 0.
MESSAGE i398(00) WITH 'Open file error !'.
ELSE.
LOOP AT <it_download> ASSIGNING <lw_line>.
CLEAR: l_line, l_subrc, l_index.
*------ 2.1 Concatenate all field
WHILE l_subrc = 0.
l_index = sy-index.
ASSIGN COMPONENT l_index OF STRUCTURE <lw_line> TO <l_field>.
l_subrc = sy-subrc.
IF l_subrc EQ 0.
CONCATENATE l_line <l_field> INTO l_line SEPARATED BY l_tab.
ENDIF.
ENDWHILE.
SHIFT l_line BY 1 PLACES.
TRANSFER l_line TO p_file_s.
ENDLOOP.
CLOSE DATASET p_file_s.
IF sy-subrc NE 0.
MESSAGE i398(00) WITH 'Write file error !'.
ELSE.
MESSAGE s398(00) WITH 'Write to server succeed '.
ENDIF.
ENDIF.
ENDFORM. " download_to_server
*&---------------------------------------------------------------------*
*& Form get_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM get_data .
SELECT *
INTO TABLE it_data
FROM mara
WHERE matnr IN s_matnr.
IF sy-subrc NE 0.
MESSAGE i398(00) WITH 'No Data ! '.
STOP.
ENDIF.
ENDFORM. " get_data
*&---------------------------------------------------------------------*
*& Form get_default_alv_variant
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM get_default_alv_variant CHANGING f_alv_variant.
DATA: lw_variant LIKE disvariant.
*---Get program name
CLEAR lw_variant.
lw_variant-report = sy-cprog.
*---Get default variant on ALV
CALL FUNCTION 'REUSE_ALV_VARIANT_DEFAULT_GET'
EXPORTING
i_save = 'A'
CHANGING
cs_variant = lw_variant
EXCEPTIONS
not_found = 2.
IF sy-subrc = 0.
f_alv_variant = lw_variant-variant.
ENDIF.
ENDFORM. " get_default_alv_variant
*&---------------------------------------------------------------------*
*& Form ft_alv_variant
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM f4_alv_variant CHANGING f_alv_variant.
DATA: lw_variant LIKE disvariant.
*---Get program name
CLEAR lw_variant.
lw_variant-report = sy-cprog.
*---Get ALV variant list
CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
EXPORTING
is_variant = lw_variant
IMPORTING
es_variant = lw_variant
EXCEPTIONS
not_found = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
f_alv_variant = lw_variant-variant.
ENDIF.
ENDFORM. " ft_alv_variant
*&---------------------------------------------------------------------*
*& Form f4_local_filename
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM f4_local_filename CHANGING f_filename.
CALL FUNCTION 'F4_FILENAME'
IMPORTING
file_name = f_filename.
ENDFORM. " f4_local_filename
*&---------------------------------------------------------------------*
*& Form get_data_by_alv_variant
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM get_data_by_alv_variant USING f_alv_variant f_tabname
CHANGING f_subrc.
DATA: l_fieldname TYPE dfies-fieldname.
DATA: l_line TYPE string,
l_subrc LIKE sy-subrc,
l_index LIKE sy-index,
l_tabix LIKE sy-tabix.
FIELD-SYMBOLS: <lw_line> TYPE ANY,
<l_field> TYPE ANY.
DATA: lt_defies_tab LIKE dfies OCCURS 0 WITH HEADER LINE.
DATA: l_linetype TYPE REF TO cl_abap_structdescr,
l_tabletype TYPE REF TO cl_abap_tabledescr,
l_comp_tab TYPE cl_abap_structdescr=>component_table,
l_comp LIKE LINE OF l_comp_tab,
l_dref_tab TYPE REF TO data,
l_dref_line TYPE REF TO data,
l_elemtype TYPE REF TO cl_abap_elemdescr,
l_len TYPE i VALUE 30,
l_no_out(1) TYPE c.
DATA: lw_varkey LIKE ltdxkey,
lt_defieldcat LIKE ltdxdata OCCURS 0 WITH HEADER LINE.
DATA: BEGIN OF lt_alvsetting OCCURS 0,
key1 LIKE ltdxdata-key1, "欄位名稱
col_pos TYPE i, "欄位順序
no_out TYPE c, "X = 不顯示
outputlen TYPE i, "欄位長度
scrtext_m LIKE dfies-scrtext_m, "欄位標題
END OF lt_alvsetting.
*---1. Initial return code
f_subrc = 0.
*---2. Get ALV variant fields setting
CLEAR: lw_varkey,
lt_defieldcat, lt_defieldcat[].
lw_varkey-report = sy-cprog.
lw_varkey-variant = f_alv_variant.
lw_varkey-type = 'F'.
CALL FUNCTION 'LT_DBDATA_READ_FROM_LTDX'
EXPORTING
is_varkey = lw_varkey
TABLES
t_dbfieldcat = lt_defieldcat
EXCEPTIONS
not_found = 1
wrong_relid = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
*---3. If ALV variant is error
*--- then get all field by import structure name
IF lt_defieldcat[] IS INITIAL.
CLEAR: lt_defies_tab.
*------3.1 Get all fields from Data Dictionary
CALL FUNCTION 'DDIF_FIELDINFO_GET'
EXPORTING
tabname = f_tabname
langu = sy-langu
TABLES
dfies_tab = lt_defies_tab
EXCEPTIONS
not_found = 1
internal_error = 2
OTHERS = 3.
*------3.2 Append fields setting
IF sy-subrc = 0.
LOOP AT lt_defies_tab.
CLEAR: lt_defieldcat, l_tabix.
l_tabix = sy-tabix.
lt_defieldcat-key1 = lt_defies_tab-fieldname.
lt_defieldcat-param = 'OUTPUTLEN'.
lt_defieldcat-value = lt_defies_tab-outputlen.
APPEND lt_defieldcat.
lt_defieldcat-param = 'NO_OUT'.
lt_defieldcat-value = space.
APPEND lt_defieldcat.
lt_defieldcat-param = 'COL_POS'.
lt_defieldcat-value = l_tabix.
APPEND lt_defieldcat.
ENDLOOP.
ENDIF.
*------3.3 Check defieldcat
IF lt_defieldcat[] IS INITIAL.
f_subrc = 4.
EXIT.
ENDIF.
ENDIF.
*---4. Set internal table structures
*------4.1 Fix data and insert to temp ITB
CLEAR: lt_alvsetting, lt_alvsetting[].
LOOP AT lt_defieldcat.
*------4.2 Get field name
lt_alvsetting-key1 = lt_defieldcat-key1.
*------4.3 Get field output or not
*------ Get field col_pos
CASE lt_defieldcat-param.
WHEN 'NO_OUT'.
lt_alvsetting-no_out = lt_defieldcat-value.
WHEN 'COL_POS'.
lt_alvsetting-col_pos = lt_defieldcat-value.
WHEN OTHERS.
ENDCASE.
AT END OF key1.
*------4.4 Get field text (scrtext_m) form Data Dictionary
*------ Get field output length
CLEAR: l_fieldname,
lt_defies_tab, lt_defies_tab[].
l_fieldname = lt_alvsetting-key1.
CALL FUNCTION 'DDIF_FIELDINFO_GET'
EXPORTING
tabname = f_tabname
fieldname = l_fieldname
langu = sy-langu
TABLES
dfies_tab = lt_defies_tab
EXCEPTIONS
not_found = 1
internal_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
lt_alvsetting-scrtext_m = space.
lt_alvsetting-outputlen = 1.
ELSE.
READ TABLE lt_defies_tab INDEX 1.
lt_alvsetting-scrtext_m = lt_defies_tab-scrtext_m.
lt_alvsetting-outputlen = lt_defies_tab-outputlen.
ENDIF.
*------4.5 Append to ITB
APPEND lt_alvsetting.
CLEAR: lt_alvsetting.
ENDAT.
ENDLOOP.
*---5. Set download structure
*------5.1 Delete NO OUTPUT fields
DELETE lt_alvsetting WHERE no_out EQ 'X'.
DELETE lt_alvsetting WHERE key1 EQ 'MANDT'.
*------5.2 Sort fields
SORT lt_alvsetting BY col_pos.
*------5.3 Set fields to ITB
LOOP AT lt_alvsetting.
l_comp-name = lt_alvsetting-key1.
l_elemtype = cl_abap_elemdescr=>get_c( lt_alvsetting-outputlen ).
l_comp-type = l_elemtype.
APPEND l_comp TO l_comp_tab.
CLEAR: lt_alvsetting, l_comp.
ENDLOOP.
*------5.4 Set work area by ITB (from 5.3)
l_linetype = cl_abap_structdescr=>create( l_comp_tab ).
CREATE DATA l_dref_line TYPE HANDLE l_linetype.
ASSIGN l_dref_line->* TO <lw_line>.
IF sy-subrc NE 0.
f_subrc = sy-subrc.
EXIT.
ENDIF.
*------5.5 Set internal table by WORK AREA (from 5.4)
l_tabletype = cl_abap_tabledescr=>create( p_line_type = l_linetype ).
CREATE DATA l_dref_tab TYPE HANDLE l_tabletype.
ASSIGN l_dref_tab->* TO <it_download>.
IF sy-subrc NE 0.
f_subrc = sy-subrc.
EXIT.
ENDIF.
*---6. Append data to download
*------6.1. Append title
CLEAR: l_line, l_subrc, l_index.
WHILE l_subrc = 0.
l_index = sy-index.
ASSIGN COMPONENT l_index OF STRUCTURE <lw_line> TO <l_field>.
l_subrc = sy-subrc.
IF l_subrc EQ 0.
READ TABLE lt_alvsetting INDEX l_index.
IF sy-subrc EQ 0.
<l_field> = lt_alvsetting-scrtext_m.
ELSE.
<l_field> = space.
ENDIF.
ENDIF.
ENDWHILE.
APPEND <lw_line> TO <it_download>.
*------6.2. Append data
LOOP AT it_data.
MOVE-CORRESPONDING it_data TO <lw_line>.
APPEND <lw_line> TO <it_download>.
ENDLOOP.
ENDFORM. " get_data_by_alv_variant
*&---------------------------------------------------------------------*
*& Form send_mail
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM send_mail .
DATA: docdata LIKE sodocchgi1,
objpack LIKE sopcklsti1 OCCURS 1 WITH HEADER LINE,
objhead LIKE solisti1 OCCURS 1 WITH HEADER LINE,
objtxt LIKE solisti1 OCCURS 10 WITH HEADER LINE,
objbin LIKE solisti1 OCCURS 10 WITH HEADER LINE,
objhex LIKE solix OCCURS 10 WITH HEADER LINE,
reclist LIKE somlreci1 OCCURS 1 WITH HEADER LINE.
DATA: listobject LIKE abaplist OCCURS 1 WITH HEADER LINE.
DATA: tab_lines TYPE i,
doc_size TYPE i,
att_type LIKE soodk-objtp.
DATA: l_att_type LIKE soodk-objtp.
FIELD-SYMBOLS: <lw_line> TYPE ANY.
*---1. 郵件本文
*------1.1 Title and Description
docdata-obj_name = 'TEST_Mail'. "輸入什麼皆可
docdata-obj_descr = 'Test including Attachment「中文測試-許功蓋」'. "收信的主旨
*------1.2 Main Text
*------ 信件的內容
objtxt = 'Test Document.'.
APPEND objtxt.
objtxt = 'You will find an attachment in this message.'.
APPEND objtxt.
objtxt = 'Have a nice day.'.
APPEND objtxt.
objtxt = '如果這一行完全沒有亂碼(連「許功蓋」都出得來) ,表示中文沒問題。'.
APPEND objtxt.
*------1.3 郵件本文的屬性
DESCRIBE TABLE objtxt LINES tab_lines.
READ TABLE objtxt INDEX tab_lines.
docdata-doc_size = ( tab_lines - 1 ) * 255 + STRLEN( objtxt ). "計算信件字元大小
CLEAR objpack-transf_bin.
objpack-head_start = 1.
objpack-head_num = 0.
objpack-body_start = 1.
objpack-body_num = tab_lines.
objpack-doc_type = 'RAW'.
APPEND objpack. "用來描述objtxt(信件內文)的一些屬性
*---2. 郵件附檔
*--- 將 Internal table 格式轉換成objbin,才能從sap寄出
*--- objbin 的每行長度只有 255 ,所以如果長度較長的行,需用不同的方式產生檔案
*------2.1.1 Excel (純文字格式,以 TAB 分隔,副檔名為.xls)
l_att_type = 'xls'.
LOOP AT <it_download> ASSIGNING <lw_line>.
PERFORM set_att_fiels_xls TABLES objbin
USING <lw_line>.
ENDLOOP.
**------2.1.2 Excel (XML格式,副檔名為.xml)
**------2.1.2.1 XML header
* l_att_type = 'xml'.
* PERFORM xml_header TABLES objbin.
**------2.1.2.2 XML body
* LOOP AT <it_download> ASSIGNING <lw_line>.
* PERFORM set_att_files_xml TABLES objbin
* USING <lw_line>.
* ENDLOOP.
**------2.1.2.3 XML footer
* PERFORM xml_footer TABLES objbin.
*------2.2 郵件附檔的屬性
*------除非是在系統中有設定(TSOTT),不然就會是附檔的副檔名
att_type = l_att_type.
DESCRIBE TABLE objbin LINES tab_lines.
READ TABLE objbin INDEX tab_lines.
objpack-doc_size = ( tab_lines - 1 ) * 255 + STRLEN( objbin ). "計算字串objbin的字元數
objpack-transf_bin = 'X'.
objpack-head_start = 1.
objpack-head_num = 1.
objpack-body_start = 1.
objpack-body_num = tab_lines.
objpack-doc_type = att_type.
objpack-obj_name = 'ATTACHMENT'.
objpack-obj_descr = 'Attached Document'. "附檔的檔名
APPEND objpack.
*---3. 收件者
*------3.1 外部的收件者 (一般的電子信箱)
reclist-receiver = '[email protected]'.
reclist-rec_type = 'U'.
reclist-express = 'X'.
APPEND reclist.
*------3.1 內部的收件者 (SAP 的 User)
* reclist-receiver = sy-uname.
* reclist-rec_type = 'B'.
* APPEND reclist.
*---4. 呼叫系統 Funciton ,建立郵件
CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
EXPORTING
document_data = docdata
put_in_outbox = 'X' "參數(是否在sap留備份)
commit_work = 'X' "used from rel. 6.10
TABLES
packing_list = objpack
object_header = objhead
contents_bin = objbin
contents_txt = objtxt
receivers = 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.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
*---5. 判斷回傳訊息,寄出郵件
*------5.1 判斷回傳訊息
* CASE sy-subrc.
*
* WHEN 0.
* WRITE: / 'Result of the send process/'.
* LOOP AT reclist.
* WRITE: / reclist-receiver(48), '/'.
* IF reclist-retrn_code = 0.
* WRITE 'sent successfully'.
* ELSE.
* WRITE 'not sent'.
* ENDIF.
* ENDLOOP.
* WHEN 1.
* WRITE: / 'no authorization to send to the specified number of recipients!'.
* WHEN 2.
* WRITE: / 'document could not be sent to any of the recipients!'.
* WHEN 4.
* WRITE: / 'no authorization to send !'.
* WHEN OTHERS.
* WRITE: / 'error occurred during sending !'.
*
* ENDCASE.
*------5.2 呼叫系統程式,正式寄出郵件
* SUBMIT rsconn01. "將信件匣所有郵件寄出
*------------會將之前別的程式所產生,但尚未寄出的信也一起寄出
*------------如果最後一行submit沒寫的話,信件會先送到寄件夾
*------------ 可用t_code/SCOT來看在寄件夾的郵件,再按ctrl+f7可把信件送出
ENDFORM. " send_mail
*&---------------------------------------------------------------------*
*& Form xml_header
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM xml_header TABLES ft_objbin STRUCTURE solisti1.
ft_objbin = '<?xml version = "1.0"?>'.
APPEND ft_objbin.
ft_objbin = '<?mso-application progid = "Excel.Sheet"?>'.
APPEND ft_objbin.
ft_objbin = '<Workbook xmlns = "urn/schemas-microsoft-com/office/spreadsheet"'.
APPEND ft_objbin.
ft_objbin = 'xmlns/o = "urn/schemas-microsoft-com/office/office"'.
APPEND ft_objbin.
ft_objbin = 'xmlns/x = "urn/schemas-microsoft-com/office/excel"'.
APPEND ft_objbin.
ft_objbin = 'xmlns/ss = "urn/schemas-microsoft-com/office/spreadsheet"'.
APPEND ft_objbin.
ft_objbin = 'xmlns/html = "http///www.w3.org/TR/REC-html40">'.
APPEND ft_objbin.
ft_objbin = '<DocumentProperties xmlns = "urn/schemas-microsoft-com/office/office">'.
APPEND ft_objbin.
ft_objbin = ' <Author>ABAP</Author>'.
APPEND ft_objbin.
ft_objbin = ' <LastAuthor>ABAP</LastAuthor>'.
APPEND ft_objbin.
ft_objbin = ' <Created>2007-11-01T00/00/00Z</Created>'.
APPEND ft_objbin.
ft_objbin = ' <Company>ABAP</Company>'.
APPEND ft_objbin.
ft_objbin = ' <Version>11.5606</Version>'.
APPEND ft_objbin.
ft_objbin = '</DocumentProperties>'.
APPEND ft_objbin.
ft_objbin = '<Worksheet ss/Name = "Sheet1">'.
APPEND ft_objbin.
ft_objbin = ' <Table>'.
APPEND ft_objbin.
ENDFORM. " xml_header
*&---------------------------------------------------------------------*
*& Form xml_footer
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM xml_footer TABLES ft_objbin STRUCTURE solisti1.
ft_objbin = '</Table>'.
APPEND ft_objbin.
ft_objbin = '</Worksheet>'.
APPEND ft_objbin.
ft_objbin = '</Workbook>'.
APPEND ft_objbin.
ENDFORM. " xml_footer
*&---------------------------------------------------------------------*
*& Form set_att_fiels_xls
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM set_att_fiels_xls TABLES ft_objbin STRUCTURE solisti1
USING fw_line.
DATA: l_line TYPE string,
l_line_fix(2040) TYPE c,
l_subrc LIKE syst-subrc,
l_index LIKE syst-index.
DATA: l_tab(1) TYPE c.
DATA: l_crlf(2) TYPE c.
FIELD-SYMBOLS: <l_field> TYPE ANY.
*---1. Initial special character
l_tab = cl_abap_char_utilities=>horizontal_tab.
l_crlf = cl_abap_char_utilities=>cr_lf.
*---2. Put all fields into one line
CLEAR: l_line, l_line_fix, l_subrc, l_index.
WHILE l_subrc = 0.
l_index = sy-index.
ASSIGN COMPONENT l_index OF STRUCTURE fw_line TO <l_field>.
l_subrc = sy-subrc.
IF l_subrc EQ 0.
*------2.1 插入欄位的分隔符號
CONCATENATE l_line <l_field> INTO l_line SEPARATED BY l_tab.
ENDIF.
ENDWHILE.
*------2.2 將不定長度的 Type String 放到固定長度的 Type C 中。方便未來的分割字串作業,
CONCATENATE l_line l_crlf INTO l_line_fix.
*------2.3 強迫固定長度字串的最後兩碼為換行符號
l_line_fix+2038(2) = l_crlf.
*---3. Split line for ft_objbin (255 characters in one line)
CLEAR: l_subrc, l_index.
WHILE l_subrc = 0.
l_index = l_index + 1.
*------3.1 如果已超過 (2.2) 的固定長度,則強制跳開迴圈
IF l_index GE 8.
l_subrc = 4.
CONTINUE.
ENDIF.
*------3.2 除非是第一次分割,不然就要把前一次已分割的部份清掉
IF l_index GT 1.
SHIFT l_line_fix BY 255 PLACES IN CHARACTER MODE.
ENDIF.
*------3.3 將字串的前 255 碼放入 Internal table 中
ft_objbin = l_line_fix(255).
APPEND ft_objbin.
*------3.4 如果在這次的循環中發現換行字元,表示此行已結束,則強制跳開迴圈
FIND l_crlf IN ft_objbin.
IF sy-subrc EQ 0.
l_subrc = 4.
CONTINUE.
ENDIF.
ENDWHILE.
ENDFORM. " set_att_fiels_xls
*&---------------------------------------------------------------------*
*& Form set_att_files_xml
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM set_att_files_xml TABLES ft_objbin STRUCTURE solisti1
USING fw_line.
DATA: l_line TYPE string,
l_subrc LIKE syst-subrc,
l_index LIKE syst-index.
FIELD-SYMBOLS: <l_field> TYPE ANY.
CLEAR: l_line, l_subrc, l_index.
*------------2.2.1 Row start
ft_objbin = '<Row>'. APPEND ft_objbin.
*------------2.2.2 Cells in Row
WHILE l_subrc = 0.
l_index = sy-index.
ASSIGN COMPONENT l_index OF STRUCTURE fw_line TO <l_field>.
l_subrc = sy-subrc.
IF l_subrc EQ 0.
CONCATENATE '<Cell><Data ss/Type = "String">'
<l_field>
'</Data></Cell>'
INTO ft_objbin.
APPEND ft_objbin.
ENDIF.
ENDWHILE.
*------------2.2.3 Row end
ft_objbin = '</Row>'. APPEND ft_objbin.
ENDFORM. " set_att_files_xml