Ну в общем у меня это сделано так:
1. Создаем проект, куда включаем расширение: MM06E005 (You are not allowed to view links.
Register or
Login), должно быть что-то типа такое как на рисунке MM06E005.png
2. Активируем подэкраны, причем если я правильно помню, то надо зайти и создать все подэкраны, даже если вы используете только 201 подэкран, в заголовке контракта ММ.
3. Экран типа нарисован с кнопкой как на рисунке 201.png, ну тут вроде как стандартно все в дизайнере экранов делается.
4. Далее в логике PBO я ничего не реализовывал, так как кнопку мне надо было нажимать не зависимо от того, режим создания,редактирования или просмотра. Поэтому в логике экрана есть только PAI-модуль.
process before output.
* module status_0201.
*
process after input.
module user_command_0201.
Код внутри следующий:
module user_command_0201 input.
case g_ucomm.
when 'ZZ_PENALTY'.
g_ucomm = 'KOPF'.
call function 'Z_IMM_PENALTY_DIALOG'
exporting
pi_ebeln = g_pen_ebeln
pi_ebelp = g_pen_ebelp
pi_dialog = g_aktyp
importing
ps_return = gs_return
changing
pt_penalty = gt_penalty[]
pt_penalty_del = gt_penalty_del[].
if gs_return-type <> space.
message id gs_return-id type gs_return-type number gs_return-number
with gs_return-message_v1 gs_return-message_v2 gs_return-message_v3 gs_return-message_v4.
else.
endif.
endcase.
Если по шагам, то переменная G_UCOMM объявлена в модуле ZXM06TOP, как
DATA: g_ucomm like sy-ucomm,
т.е. глобальная переменная для группы функций экзита. Далее вот это вот присвоение: g_ucomm = 'KOPF', нужно сделать обязательно, так как иначе при выходе из обработчика получите сообщение типа код "ZZ_PENALTY" не существует, ну это код который вызывается при нажатии нашей кнопки,рисунок 201.png справа код, команды. Так вот чтобы такого сообщения небыло, после того как зашли в обработчики, перед выходом переопределили код на стандартный. По факту вы просто останетесь в детальном просмотре заголовка контракта. Ну и дальше у меня функция, которая собственно внутри рисует и выводит диалоговое окно. Вызов там стандартно через CALL SCREEN, поэтому это не принципиально что вы там дальше в окне делаете. Теперь пойдем как g_ucomm получает значение 'ZZ_PENALTY' при нажатии на кнопку.
5. Идем в реализацию кода экзита EXIT_SAPMM06E_007. Там вставляем что-то типа:
g_ucomm = i_ucomm.
так как вызов расширения в районе общей PAI-логики экрана. Т.е. по факту запомнили что там было нажато в целом на экране заголовка контракта.
6. Теперь идем в код экзита EXIT_SAPMM06E_008. Тут вставляем код который по большому счету вернет значение 'KOPF', если была нажата наша кнопка. Чтобы небыло информационного сообщения. В общем виде к этому моменту по стеку вызова процесс идет такой. На экране заголовка пользователь нажал кнопку. В ходе работы логики основного экрана вызывается код EXIT_SAPMM06E_007, где мы запоминаем что было нажато. Далее система вызывает логику нашего подэкрана 201, где мы анализируем что же там было нажато, а это мы запомнили ранее в EXIT_SAPMM06E_007, поэтому тут если это была наша кнопка, с кодом ZZ_PENALTY, то мы вызываем наш подэкран, но перед этим или после этого переопределяем значение g_ucomm = 'KOPF', на стандартный код, чтобы в экзите EXIT_SAPMM06E_008 вернуть его назад системе, типа наша кнопка не нажималась, а была нажата стандартная кнопка просмотра заголовка контракта.
Все! Должно работать. А ну да проект не забудьте активировать.
PS: Кстати, если кнопка реализуется на подэкране позиций контракта, то тоже самое надо проделать для подэкран 211 и экзиты: EXIT_SAPMM06E_017 и EXIT_SAPMM06E_018. Единственное что код в глобальную переменную после вызова своего диалогового экрана надо вернуть такой: g_ucomm = 'DETA', т.е. остаться после возврата на просмотре детальных данных выбранной позиции.
PSS: Так Nexus, что-то поломал и атачменты картинок к сообщениям прикрепить пока не выходит. Как только он исправит, прикреплю объявленные тут картинки. - О вроде подчинил...