Может кому пригодится, как создать кнопку с Z-командой в ОЗМ mm41/42/43.
1. Создается новый z-экран 9001, как описал Uukrul в начале темы. Затем добавляется кнопка с кодом Z_UKTVED например. Рис zbuttonInMm42.bmp.
2. Создается обработчик команды.
В нашем случае при нажатии на батон нужно вызывать SM30-Ракурс Z-таблицы.
Вариантов 2.
вариант 1 - написать код обработки в дополнительном z-модуле нашего экрана 9001. в конце блока PAI.
скрин 9001
PROCESS BEFORE OUTPUT.
.................................
PROCESS AFTER INPUT.
MODULE GET_DATEN_SUB.
chain.
field mara-ZZMM_USLHR.
field mara-ZZMM_RGFQD.
field mara-ZZMM_PALGRPCODE.
field mara-ZZMM_CUSTDUTY.
field mara-ZZMM_PPNCMPNTS.
endchain.
MODULE SET_DATEN_SUB.
*
MODULE ProcessZUserActions. // вот наш модуль
и сам модуль ProcessZUserActions
module PROCESSZUSERACTIONS input.
if sy-ucomm = 'Z_UKTVED'. " кнопка "Коды УКТВЭД"
DATA lt_dbasellist TYPE VIMSELLIST OCCURS 0.
DATA ls_dbasellist TYPE VIMSELLIST.
CLEAR ls_dbasellist.
REFRESH lt_dbasellist.
ls_dbasellist-VIEWFIELD = 'MATNR'.
ls_dbasellist-OPERATOR = 'EQ'.
ls_dbasellist-VALUE = mara-matnr+9(9).
APPEND ls_dbasellist to lt_dbasellist.
CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
EXPORTING
action = 'S'
view_name = 'ZMM_TBL_UKTVED'
TABLES
DBA_SELLIST = lt_dbasellist // отфильтровали SM30 по определенному товару
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
CLEAR sy-ucomm.
endif.
endmodule. " PROCESSZUSERACTIONS INPUT
Далее тестируем;увидим что Сап скажет что не найдена запись 'Z_UKTVED' в таблице T133D. Добавляем (можно прямо в SE11, можно через соответс. ракурс). Рис. zucommInT133d.bmp
MANDT = ... //Мандант
BILDS = 'Z3' //Номер послідовності екранів
AUSWG = '' //Логічний екран (усередині послідовності екранів)
FCODE = 'Z_UKTVED' //Код функции
NAUSW = '04' Наступний екран (у рамках послідовності екранів).
Если поле NAUSW оставить пустым, то в последующем после выполнения z-комманды Сап будет выводить сообщение "что даные не изменены. Покинуть материал?". Нас такое не устраивает. Поэтому ставим значение 04, т.к. 9001 расположен на табе "Основных данных" - после Z_UKTVED озм будет спокойно возвращать нас на "основные данные".
Опять выполняем mm42. "Не найдена запись 'Z_UKTVED' в таблице T133E". Добавляем:
MANDT = ... Мандант
BILDS = 'Z3' //Номер послідовності екранів
FCODE = 'Z_UKTVED' //Код функции
Опять выполням озм. Видим, что все работает. При нажатии на кнопку вызывается ракурс. Что-то в нем делаем и возвращаемся назад на основной скрин озм. То что нам и надо.
А теперь насчет варианта 2 (поверхностно, сильно не копался). Вместо того, чтоб писать обработку команды в модуле Pai блока скрина9001 можем делать это с помощью функционального модуля (например ZMM_FM_UKTVED). Для этого нужно во первых его создать в Se37, а затем прописать в поля ROUTN (Підпрограма обробки) и ROUTT (Тип підпрограми обробки) при добавлении записи в T133D:
ROUTN = 'ZMM_FM_UKTVED'
ROUTT = 'F'.
Единственное, в этот модуль нельзя прописывать входные/выходные параметры - выпадает в дамп. Придется если что изворачиваться фиелд-символами (по крайней мере для input parameters).