ZDOC_2801

Ещё одно место для хранения файлов – SBWP

Навеяно предыдущей записью. Не все ещё места хранения файлов исследованы. Например, вполне возможно хранить 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 не очень удобно, зато общая папка – милое дело.