Link Search Menu Expand Document

Пример декомпозиции обычного метода DOWNLOAD или как думать ООП-исто за 1 день


Примеры ZCL_EUI_FILE

SE38 -> ZEUI_TEST_EXCEL

" Экземпляр класса
DATA(lo_file) = NEW zcl_eui_file( ).

" Используем xString
" для внутренней таблицы -> import_from_binary( )
lo_file->import_from_xstring( iv_xstring = lv_xstring ).

" По умолчанию выгрузка в `SAP GUI\tmp\`
lo_file->download( ).

" Экземпляр класса
NEW zcl_eui_file(

" Кодировка по умолчанию UTF-8
" Чтобы изменить -> iv_encoding = zcl_eui_conv=>mc_encoding-utf_16le
)->import_from_string( iv_string = `Text`

" Показать диалог СохранитьКак
)->download( iv_save_dialog  = 'X'
             iv_window_title = `Export text ...`
             
" Если сохранили ранее откроем файл
" в противном случае исключение
)->open( ).

" Экземпляр класса
NEW zcl_eui_file(
 " Загрузка из xString в конструкторе
 iv_xstring     = lv_xstring

  " Если не передаем
  " -> Ok + Cancel (режим редактирования)
  " -> Cancel (режим просмотра)
* iv_status_prog  = sy-cprog
* iv_status_name  = 'STATUS_MANY_BUTTONS'

" Добавим вызов если нужно показать в диалоге
" Может вызвать любой метод возвращающий ME
)->popup( iv_col_end = 200


" Показ в новом экране
)->show( ).

" Может быть существующий объект или новый
DATA lv_ole_app	TYPE ole2_object.

" Любой вызов метода может вызвать исключение
TRY .
    NEW zcl_eui_file(
    
    " загрузить данные Excel
    )->import_from_binary(
     it_table  = lt_bin_xlsx
     iv_length = lv_len

    " Полный путь в сетевой папке
    )->download(
     iv_full_path = `I:\$secret\2020-06-27.xlsx`

     " Используем OLE для открытия файла
    )->open_by_ole(
     CHANGING
       cv_ole_app = lv_ole_app ).
  CATCH zcx_eui_exception INTO DATA(lo_error).
    " Сообщение об ошибке
    MESSAGE lo_error TYPE 'S' DISPLAY LIKE 'E'.
    RETURN.
ENDTRY.

" Если все ok, вызываем свой макрос
CALL METHOD OF lv_ole_app 'Run'
  EXPORTING
    #1 = 'MACRO_NAME'
    #2 = 'MACRO_PARAM'.


Предпосылки для декомпозиции

Если у вас есть метод с десятком optional параметров стоит начать чаще курить разделить его на несколько более мелких и понятных методов

Жил-был простой метод DOWNLOAD по выгрузке файлов.
Он принимал 2 параметра IT_TABLE и его длину IV_LENGTH.
Был он совсем не сложный, пока не понадобилась выгрузка из IV_XSTRING.
А потом и из обычной строки IV_STRING + кодировка IV_ENCODING (пу UTF-8 но не всегда)

Решил что не плохо бы открывать файл после выгрузки IV_OPEN
Да и иногда надо было открыть его через OLE(+1 параметр) для вызова макроса.
Потом пошла оптимизация выгрузки файлов через FTP для файлов более 10 мегабайт
Все было хорошо, но потом иногда файлы нужно было загружать в папку указанную пользователем
или иметь постоянное имя
или генерировать случайное для выгрузки в sap_tmp


По итогу DOWNLOAD внутри стал похож на рулон дешевой туатлной бумаги из супермаркета и пользоваться им хотелось все меньше

Собрав волю в кулак и для начала протерев монитор спиртовым перегаром после недавнего корпоратива было решено разделить его наконец на более мелкие


Реализация

Для начала хранить сам файл проще всего в одном XSTRING атрибуте (и передавать его в конструкторе)

image

А вот менять MV_XSTRING можно из разных источников

image

каждый метод возвращает себя в качестве результата

image

Это дает возможность вызова следующего метода DOWNLOAD (или SHOW) в виде цепочки

image

Если после выгрузки ничего делать не надо цепочка вызовов обрывается, иначе можно вызвать 1 из следующих для открытия файла

image


По итогу если надо загрузить файл из внутренней таблицы, вызвать окно сохранения файла и потом открыть его
цепочка будет иметь вид

 new ZCL_EUI_FILE( )->
    IMPORT_FROM_BINARY( )->
    DOWNLOAD( IV_SAVE_DIALOG = 'X' )->
    OPEN( )

Если надо загрузить данные из STRING в кодировке UTF-16LE, выгрузить файл в определенную папку и открыть его через Excel

 new ZCL_EUI_FILE( )->
    IMPORT_FROM_STRING(  IV_ENCODING = utf_16be )->
    DOWNLOAD( IV_FULL_PATH = ... )->
    OPEN_BY_OLE( )

Если в конце его нужно показать внутри SAP GUI inplace меняем DOWNLOAD( ) на SHOW( )

 new ZCL_EUI_FILE( )->
    IMPORT_FROM_STRING(  IV_ENCODING = utf_16be )->
    SHOW( )

Каждый из шагов может выбросить выкинуть вызвать исключение или исключения, поэтому лучше его завернуть в TRY
То есть 1 обработчик исключений для всей цепочки вызовов

    TRY.
        new ZCL_EUI_FILE( )->IMPORT_FROM_STRING(  IV_ENCODING = utf_16be
            )->DOWNLOAD( IV_FULL_PATH = ... )->OPEN_BY_OLE( ).
    CATCH zcx_eui_exception INTO DATA(lo_error).
        MESSAGE lo_error TYPE 'S' DISPLAY LIKE 'E'.
        RETURN.
    ENDTRY.