В SAP очень часто используют возможность прикрепленя файлов к различным объектам, таким как ОЗМ или контракт.
Также иногда возникает необходимость ограничения доступ пользователей на те или иные действия с прикрепленными файлами. Например, пользователь должен иметь возможность прикреплять новые документы, но надо не давать ему возможности удалить их.
Есть известное решение, которое заключается в запрете кнопки «Удалить» на панели инструментов путём расширения метода SET_TOOLBAR в классе CL_GOS_ATTACHMENTS, однако оно имеет существенный недостаток — остается возможность удалить прикрепленный объект из контекстного меню:
Правильный способ ограничения удаления заключается в обработке действия пользователя в методах IF_CMD_HANDLER~EXECUTE_ITEMS_CMD и IF_CMD_HANDLER~EXECUTE_LINKS_CMD(при необходимости).
Для этого создаем PreExit данных методов где проверяем команду пользователя в переменной ip_cmd. Если пользователь пытается удалить, то значение этой переменной равно %ATTA_DELETE (константа cl_gos_attachments=>gc_cmd_delete). В этом случае мы можем проверить полномочия пользователя, выдать сообщение пользователю и выйти.
Заодно опишу работу с GOS-объектами:
1 2 3 4 5 6 7 8 9 |
DATA(lo_service) = NEW cl_msg_al_linksrv( ). lo_service->gp_attachments = abap_true. lo_service->gp_notes = abap_true. lo_service->gp_urls = abap_true. lo_service->if_link_service~get_item_links( EXPORTING io_bitem = NEW cl_sobl_bor_item( VALUE #( objkey = conv #( p_belnr && p_gjahr ) objtype = gc_objtyp ) ) ip_load_restriction = 0 IMPORTING et_links = DATA(lt_linkbuff) ep_num_of_links = DATA(l_num_of_links) ). |
В таблице lt_linkbuff содержится список объектов и можно получить свойства каждого объекта
1 2 3 4 5 6 |
LOOP AT lt_linkbuff ASSIGNING FIELD-SYMBOL(<lo_link>). WRITE: / 'descr:', <lo_link>->go_item_b->gp_descr, / 'icon:', <lo_link>->go_item_b->gp_icon, / 'type:', <lo_link>->go_item_b->gp_type, / <lo_link>->go_item_b->gp_filename. ENDLOOP. |
Или можно выполнить некоторые действия, например открыть прикрепленный файл
1 |
CAST cl_msg_al_item( <lo_link>->go_item_b )->execute( CL_GOS_ATTACHMENTS=>GC_CMD_DISPLAY) |