Делал похожее, крепил вложения из писем к документам FI.
После изучения классов и методов OUTLOOK, было принята следующая метода и решение.
1. Пользователь открывает интересующие его письма,
2. заходит в SAP (работают в Z-транзакции) выбирает прикрепление вложений из OUTLOOK,
3. обрабатываются открытые письма со стягиванием названий файлов во вложениях,
4. файлы сохраняются на локальную машину,
5. все открытые письма закрываются, (т.е. необходимо освободить файлы и память)
6. выдается диалог выбора файлов для прикрепления,
7. выделенные файлы с локальной машины крепятся через GOS к документам FI,
8. удаляются все файлы, сохранные на локале.
Вот код в помощь.
Code:
*&---------------------------------------------------------------------*
*& Form SAVE_ATTACHMENTS_TO_LOCAL
*&---------------------------------------------------------------------*
* Сохраняем аттачи на локальный диск
*----------------------------------------------------------------------*
* <--> PT_FILE_NAMES - имена сохраненных файлов
* <--> PF_TEMP_DIR - путь временной папки
* <--> PF_ERROR - признак ошибки
*----------------------------------------------------------------------*
FORM save_attachments_to_local CHANGING pt_file_names TYPE tt_file_names
pf_temp_dir TYPE char128
pf_error TYPE c.
DATA: lo_outlook TYPE ole2_object,
lo_inspectors TYPE ole2_object,
lo_inspector TYPE ole2_object,
lo_curitem TYPE ole2_object,
lo_attachments TYPE ole2_object,
lo_item TYPE ole2_object,
lf_filename(255) TYPE c,
lf_insp_count TYPE i,
lf_attach_count TYPE i,
cl_service TYPE REF TO cl_gui_frontend_services,
lf_temp_dir_string TYPE string.
CREATE OBJECT cl_service.
pf_temp_dir = cc_temp_dir.
pf_error = cc_x.
CREATE OBJECT lo_outlook 'OUTLOOK.APPLICATION'.
CHECK sy-subrc IS INITIAL.
* Получаем список открытых писем
GET PROPERTY OF lo_outlook 'INSPECTORS' = lo_inspectors.
CHECK sy-subrc IS INITIAL.
CLEAR lf_insp_count.
GET PROPERTY OF lo_inspectors 'COUNT' = lf_insp_count.
DO lf_insp_count TIMES.
* По-очереди обрабатываем каждое письмо, номер инспектора всегда 1,
* так как мы закрываем каждое письмо после обработки
CALL METHOD OF lo_inspectors 'ITEM' = lo_inspector
EXPORTING #1 = 1.
CHECK sy-subrc IS INITIAL.
* Текущий элемент должен быть письмом
GET PROPERTY OF lo_inspector 'CURRENTITEM' = lo_curitem.
CHECK sy-subrc IS INITIAL.
* Получаем список приложенных файлов
GET PROPERTY OF lo_curitem 'ATTACHMENTS' = lo_attachments.
* Закрываем письмо
CALL METHOD OF lo_curitem 'CLOSE'
EXPORTING #1 = 1.
FREE OBJECT lo_curitem.
CALL METHOD OF lo_inspector 'CLOSE'
EXPORTING #1 = 1.
FREE OBJECT lo_inspector.
CLEAR lf_attach_count.
GET PROPERTY OF lo_attachments 'COUNT' = lf_attach_count.
* Обрабатываем список приложенных файлов
DO lf_attach_count TIMES.
CALL METHOD OF lo_attachments 'ITEM' = lo_item
EXPORTING #1 = sy-index.
CHECK sy-subrc IS INITIAL.
CLEAR lf_filename.
GET PROPERTY OF lo_item 'FILENAME' = lf_filename.
IF lf_filename IS NOT INITIAL.
* Сохраняем файл на локальный диск
CONCATENATE pf_temp_dir lf_filename INTO lf_filename.
CALL METHOD OF lo_item 'SAVEASFILE'
EXPORTING #1 = lf_filename.
IF sy-subrc IS INITIAL.
APPEND lf_filename TO pt_file_names.
ENDIF.
ENDIF.
FREE OBJECT lo_item.
ENDDO.
FREE OBJECT: lo_attachments.
ENDDO.
FREE OBJECT: lo_inspectors,
lo_outlook.
CLEAR pf_error.
ENDFORM. " SAVE_ATTACHMENTS_TO_LOCAL
Code:
*&---------------------------------------------------------------------*
*& Form LOAD_FILE_TO_ATTACH
*&---------------------------------------------------------------------*
* Прикрепление файлов к документу
*----------------------------------------------------------------------*
* --> PF_FILE_NAME - имя файла
* --> PF_OBJKEY - ключ объекта
* --> PF_OBJTYPE - тип объекта
* <--> PF_ERROR - признак ошибки
*----------------------------------------------------------------------*
FORM load_file_to_attach USING pf_file_name TYPE string
pf_temp_dir TYPE char128
pf_objkey TYPE swo_typeid
pf_objtype TYPE swo_objtyp
CHANGING pf_error TYPE c.
DATA: ls_object_a TYPE borident,
ls_object_b TYPE borident,
lf_docty LIKE borident-objtype VALUE 'MESSAGE',
lf_str1 TYPE string,
lf_str2 TYPE string,
lf_str TYPE string,
lt_str TYPE STANDARD TABLE OF string,
lf_ext TYPE string,
lf_lines TYPE i,
lo_message TYPE swc_object,
lf_message_key TYPE ts_message_key,
lf_reltyp LIKE breltyp-reltype VALUE 'ATTA',
lf_msgtyp LIKE sofm-doctp VALUE 'PDF',
lt_data_tab TYPE STANDARD TABLE OF ts_blob,
lf_file_length TYPE i,
lf_filetype(10) TYPE c VALUE 'BIN',
lf_result TYPE c,
lf_file(128) TYPE c,
lc_service TYPE REF TO cl_gui_frontend_services,
lf_filename TYPE string,
lf_rc TYPE i,
lf_offset TYPE i,
lf_size TYPE i,
lc_com1 TYPE ole2_object.
pf_error = cc_x.
CREATE OBJECT lc_service.
ls_object_a-objkey = pf_objkey.
ls_object_a-objtype = pf_objtype.
lf_file = pf_file_name.
"CONDENSE lf_file.
lf_filename = lf_file.
* Проверяем существование файла
CALL METHOD lc_service->file_exist
EXPORTING
file = lf_filename
RECEIVING
result = lf_result
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
wrong_parameter = 3
not_supported_by_gui = 4
OTHERS = 5.
lf_file = lf_filename.
CHECK lf_result IS NOT INITIAL.
* Читаем файл с диска
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = lf_filename
filetype = lf_filetype
IMPORTING
filelength = lf_file_length
TABLES
data_tab = lt_data_tab
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16.
IF sy-subrc IS NOT INITIAL.
MESSAGE s368(00) WITH 'Ошибка открытия файла' DISPLAY LIKE 'E'.
EXIT.
ENDIF.
*----------------------------------------------------------
* ( MESSAGE )тип документа.
lf_docty = 'MESSAGE'.
lf_ext = pf_file_name.
TRANSLATE lf_ext TO UPPER CASE.
"SPLIT lf_ext AT '.' INTO: lf_str1 lf_str2.
SPLIT lf_ext AT '.' INTO TABLE lt_str.
lf_lines = LINES( lt_str ).
IF lf_lines EQ 1.
* Файл без расширения
MESSAGE e002(ZMAIL).
ENDIF.
READ TABLE lt_str INTO lf_str2 INDEX lf_lines.
lf_lines = lf_lines - 1.
LOOP AT lt_str INTO lf_str TO lf_lines.
IF lf_str1 IS INITIAL.
lf_str1 = lf_str.
ELSE.
CONCATENATE lf_str1 lf_str INTO lf_str1 SEPARATED BY '.'.
ENDIF.
ENDLOOP.
lf_offset = STRLEN( pf_temp_dir ).
lf_str1 = lf_str1+lf_offset.
* Проверяем расширения, так как нам нужны "избранные"
IF lf_str2 = 'DOC' OR lf_str2 = 'XLS' OR lf_str2 = 'PDF' OR lf_str2 = 'RAR' OR
lf_str2 = 'BMP' OR lf_str2 = 'JPG' OR lf_str2 = 'TIFF' OR lf_str2 = 'TIF'.
lf_msgtyp = lf_str2.
ELSE.
lf_msgtyp = 'EXT'.
ENDIF.
* Создаем объект типа MESSAGE
swc_create_object lo_message 'MESSAGE' lf_message_key.
* Создаем контейнер для последующих вызовов
swc_container lt_message_container.
* Передаем параметры вызова
swc_set_element lt_message_container 'DOCUMENTTITLE' lf_str1.
swc_set_element lt_message_container 'DOCUMENTLANGU' 'E'.
swc_set_element lt_message_container 'NO_DIALOG' 'X'.
swc_set_element lt_message_container 'DOCUMENTNAME' lf_docty.
swc_set_element lt_message_container 'DOCUMENTTYPE' lf_msgtyp.
* Данные документа
swc_set_table lt_message_container 'DocumentContent' lt_data_tab.
* Размер документа
swc_set_element lt_message_container 'DOCUMENTSIZE' lf_file_length.
* Создаем объект для прикрепления
swc_refresh_object lo_message.
swc_call_method lo_message 'CREATE' lt_message_container.
* Получаем ключ объекта
swc_get_object_key lo_message lf_message_key.
* Теперь приложение у нас как экземпляр БО, который можем прикрепить
* Крепим (связываем) объекты
ls_object_b-objkey = lf_message_key.
ls_object_b-objtype = lf_docty.
*----------------------------------------------------------
CALL FUNCTION 'BINARY_RELATION_CREATE'
EXPORTING
obj_rolea = ls_object_a
obj_roleb = ls_object_b
relationtype = lf_reltyp
EXCEPTIONS
no_model = 1
internal_error = 2
unknown = 3.
COMMIT WORK AND WAIT.
CLEAR pf_error.
ENDFORM. " LOAD_FILE_TO_ATTACH