Навеяно предыдущей записью. Не все ещё места хранения файлов исследованы. Например, вполне возможно хранить Excel-файлы в так называемом Business Workplace (транзакция SBWP, доступная всем с главного экрана).
Сохранённый файл можно прочитать из программы примерно таким кодом:
class-methods LOAD_FROM_WP_SHARED_FOLDER
importing
!IV_FOLDER type STRING
!IV_FILENAME type STRING
returning
value(RX_FILE) type XSTRING .
METHOD load_from_wp_shared_folder.
DATA lx_file TYPE xstring.
DATA: lt_bin TYPE solix_tab,
lv_len TYPE i.
DATA: ls_user_data TYPE soudatai1.
CALL FUNCTION 'SO_USER_READ_API1'
EXPORTING
prepare_for_folder_access = 'X'
IMPORTING
user_data = ls_user_data
EXCEPTIONS
user_not_exist = 1
parameter_error = 2
x_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
DATA(lv_sharefol) = ls_user_data-sharedfol.
DATA: lt_folders TYPE STANDARD TABLE OF sofolenti1.
CALL FUNCTION 'SO_FOLDER_READ_API1'
EXPORTING
folder_id = lv_sharefol
TABLES
folder_content = lt_folders
EXCEPTIONS
folder_not_exist = 1
operation_no_authorization = 2
x_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
DATA(lv_folder) = lt_folders[ obj_name = iv_folder ]-object_id.
DATA: lt_files TYPE STANDARD TABLE OF sofolenti1.
CALL FUNCTION 'SO_FOLDER_READ_API1'
EXPORTING
folder_id = lv_folder
TABLES
folder_content = lt_files
EXCEPTIONS
folder_not_exist = 1
operation_no_authorization = 2
x_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
DATA(lv_file) = lt_files[ obj_descr = iv_filename ]-doc_id.
DATA(lv_size) = CONV int4( lt_files[ obj_descr = iv_filename ]-doc_size ).
DATA: lt_content TYPE STANDARD TABLE OF solix.
CALL FUNCTION 'SO_DOCUMENT_READ_API1'
EXPORTING
document_id = lv_file
TABLES
contents_hex = lt_content
EXCEPTIONS
document_id_not_exist = 1
operation_no_authorization = 2
x_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
EXPORTING
input_length = lv_size
IMPORTING
buffer = lx_file
TABLES
binary_tab = lt_content
EXCEPTIONS
failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
* MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
* WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
rx_file = lx_file.
ENDMETHOD.
А вот и пример использования:
DATA(lx_file) = zcl_file=>load_from_wp_shared_folder(
iv_folder = 'Z_TEST_XLSX'
iv_filename = 'ZCL_EXCEL_READER'
).
DATA(lo_excel) = NEW zcl_excel_reader( lx_file ).
В каких случаях имеет смысл использовать такой сценарий? Есть предложения?
Например, можно такой подход использовать для регулярной фоновой загрузки больших объёмов данных. Один или несколько пользователей формируют файлы и складывают в общую папку. В планировшике можно оформить задачу, которая будет разбирать файлы и проводить необходимые действия в системе. В таком сценарии испольование SMW0 или OAOR не очень удобно, зато общая папка – милое дело.
