Простая иллюстрация подхода при передаче параметра в виде ссылки:
DATA lt_messages TYPE bapiret2_tab.
DATA(lo_messages) = NEW zcl_message_collection( ir_messages = REF #( lt_messages ) ).
if ...
MESSAGE e011(zca_test)
INTO lo_messages->new_message
WITH '#1V1'
'#1V2'.
lo_messages->add( ).
RETURN.
endif.
if ...
MESSAGE w012(zca_test) INTO lo_messages->new_message.
lo_messages->add( ).
endif.
if ...
MESSAGE i013(zca_test) INTO lo_messages->new_message.
lo_messages->add( ).
endif.
Чего можно таким добиться?
Например: это маленькое ухищрение позволяет однократно указывать обрабатываемую таблицу. Это делает код чуть менее многословным. Альтернатива:
APPEND lo_messages->convert_sy2bapi( ) INTO lt_messages. ...или... lo_messages->add( CHANGING messages = lt_messages).
Насколько это красиво? Чисто и просто… Впрочем, есть тут некоторая неочевидность. Мы запускаем метод в классе без указния локальной переменной в качестве параметра, а эта локальная переменная меняется.
Если собирать ошибки внутри вспомогательного класса, а потом их получать вместе, то становится сложнее прекратить обработку немедленно. Выглядит как-то корявенько:
DATA(lo_messages) = NEW zcl_message_collection( ). IF ... MESSAGE e011(zca_test) INTO lo_messages->new_message. lo_messages->add( ). lt_messages = lo_messages->get( ). RETURN. ENDIF. IF ... MESSAGE w012(zca_test) INTO lo_messages->new_message. lo_messages->add( ). ENDIF. "finally lt_messages = lo_messages->get( ).
Пример реализации:
