Cтолкнулся с новым фреймворком Test Double. В чём же основной смысл и назначение этого фреймворка, с чем его едят?

Дано: Основной класс ZCL_ACTION

CLASS zcl_action DEFINITION.
  PUBLIC SECTION.
    METHODS constructor IMPORTING actor TYPE REF TO zcl_actor.
    METHODS who_am_i RETURNING VALUE(rv_name) TYPE string.

  PRIVATE SECTION.
    DATA: mo_actor TYPE REF TO zcl_actor.
ENDCLASS.

CLASS zcl_action IMPLEMENTATION.
  METHOD constructor.
    mo_actor = actor.
  ENDMETHOD.

  METHOD who_am_i.
    rv_name = mo_actor->get_name( ).
  ENDMETHOD.
ENDCLASS.

И реализация класса ZCL_ACTOR при этом следующая:

CLASS zcl_actor DEFINITION .
  PUBLIC SECTION.
    METHODS: get_name RETURNING VALUE(rv_name) TYPE string.

ENDCLASS.

CLASS zcl_actor IMPLEMENTATION.
  METHOD get_name.
    rv_name = 'Real value'.
  ENDMETHOD.
ENDCLASS.

Требуется: написать юнит-тест для класса ZCL_ACTION.

(more…)

Без предисловий, сразу код в начальной итерации:

DATA: lv_template TYPE string VALUE 'ZR_CA001.DOCX'.
DATA: lv_file TYPE xstring.
DATA: lt_data TYPE STANDARD TABLE OF tbl1024.
DATA: lv_len TYPE i.

zcl_text_tools=>read_mimeobject( EXPORTING iv_mimeobject = conv #( lv_template )
                                 IMPORTING ev_bin = lv_file ).
* ... some magic happens here ...

lv_len = xstrlen( lv_file ).

CALL METHOD cl_bcs_convert=>xstring_to_xtab
  EXPORTING
    iv_xstring = lv_file
  IMPORTING
    et_xtab    = lt_data[].

cl_gui_frontend_services=>show_document( EXPORTING document_name = lv_template
                                                   mime_type     = ''
                                                   data_length   = lv_len
                                          CHANGING document_data = lt_data[]
                                        EXCEPTIONS OTHERS = 1 ).

А теперь можно его покритиковать. (more…)

Иногда так получается, что в одном глобальном расширении внутри одного большого куска ABAP-кода скапливается много маленьких кусочков, делающие совершенно разные вещи для совершенно разных людей/модулей/пакетов.

Вот для примера типичный код из события OpenFI BTE 1120 (замещения перед сохранением бухгалтерской проводки):
User-exit source sample
Вот такой компот, бывает что и на тысячи строк тянется эта простыня.

Почему так получается? Это скорее следствие скупости, лени, спешки плюс недостаток фантазии.

Работать – работает, больших проблем не доставляет. Открыл – всё видно. Можно даже копипастить подходы, использовать общие переменные.

Особая проблема с таким подходом возникает только в ситуации конкурентных правок. Но если такие ситуации всплывают раз в год, то проще перебороть и запинать, чем вылечить проблему в корне.

Хорошая идея – категорический запрет на решение разных задач в рамках  одного ABAP фрагмента (инклюда, функции, метода). Совсем уж общего решения предложить нельзя, так как есть нюансы, да и многое дело вкуса.

Приступим к первой итерации.

(more…)

Вполне бытовая задача при разработке ERP-системы – настройка оповещений посредством электронной почты.

Соответственно сразу возникает несколько идей, куда ложить текст шаблона:

  • непосредственно в тексте программы, хардкод никто не отменял
  • в хранилищах  OAOR/SMW0 – по обстоятельстам
  • в текстах SO10, если они довольно простые и/или ведутся прямо в продуктивной системе

… хотя можно встретить и более экзотические варианты.

Задача может стать чуть более изощренной, если потребуется в письмо добавить красоты в виде HTML. В первом приближении HTML – это простой текст со специальной разметкой в виде тегов. Поэтому можно не отказываться от старых вариантов и мириться с неудобствами в виде редактирования plain-text и отсутствия проверок.

<html>
  <body>
    <H3>Тревога, тревога:</H3>
    <p>Волк унёс зайчат!</p>
    <p>Последнее местоположение зайчат: [LGORT]</p>
  </body>
<html>

Однако задача может стать еще сложнее, если появляется динамичный контент в виде таблиц. И тут появляется развилка:

  • дополнительно нагружать текстовый шаблон особой разметкой и реализовать её обработку на ABAP, что не технологично
  • искать альтернативные технологии

И как вы уже поняли из заголовка статьи – далее речь пойдёт о втором варианте в подробностях. (more…)

Есть у меня один повод для переживаний – это запросы, которые не доехали до продакшена.

Они всё время норовят где-то затеряться и забыться.

Я-то сделал, отдал в тест. А дальше дело ответственного консультанта, мяч уже на его стороне. 

Дано:

  • Проект поддержки системы ERP
  • Обычный ландшафт DEV-QAS-PRD
  • Сторонняя система управления задачами
  • Куча мелких задач на доработку

При этом стоит в обязательном порядке связывать создаваемый запрос с задачей/инцидентом.

Раз-два и вот прототип маленькой помогалки готов:

Обзор транспортных запросов

Номер запроса, дата, владелец, описание, привязка к задаче и куча зеленых галочек.

Всё понятно – один сложный запрос ещё варится, два запроса уехали в прод, четвёртый на тесте.

Как же я люблю когда много зеленых галочек. Успокаивает. Что ещё нужно?

А некоторые солидные господа используют для этого Solution Manager ChaRM. Но, мне почему-то кажется, что там не будет такой кучи зеленых галочек. Это фатальный недостаток.

ZDOC_2659

Переезд

…равен двум пожарам!

Развлечения ради переехал на другой сервер, а заодно и дизайн обновил.