Простая иллюстрация подхода при передаче параметра в виде ссылки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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. |
Чего можно таким добиться?
Например: это маленькое ухищрение позволяет однократно указывать обрабатываемую таблицу. Это делает код чуть менее многословным. Альтернатива:
1 2 3 |
APPEND lo_messages->convert_sy2bapi( ) INTO lt_messages. ...или... lo_messages->add( CHANGING messages = lt_messages). |
Насколько это красиво? Чисто и просто… Впрочем, есть тут некоторая неочевидность. Мы запускаем метод в классе без указния локальной переменной в качестве параметра, а эта локальная переменная меняется.
Если собирать ошибки внутри вспомогательного класса, а потом их получать вместе, то становится сложнее прекратить обработку немедленно. Выглядит как-то корявенько:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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( ). |
Пример реализации: