+ Sapforum.Biz » Инструменты » ABAP - Инструментальные средства » SE24 - Построитель объектов (Модератор: Dmitriy)Тема:
|- CL_GOS_MANAGER - Класс для публикации объектов GOS




Автор Тема: CL_GOS_MANAGER - Класс для публикации объектов GOS  (Прочитано 6825 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 689
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
CL_GOS_MANAGER - Класс для публикации объектов. Под объектами понимаем данные от заметок до файлов любых форматов. С версии 4.6 практически для всех документов и объектов системы появилась возможность прикрепления атачментов, в общем виде мне кажется это очень удобная функция для сохранения таких вещей как например от сканированные копии договоров, которые можно прикрепить к договору в системе и т.д., так же можно оставлять текстовые заметки к документу. Например, на рисунке GOS-1.png показан пример вызова объекта GOS (Generic Object Services) для заказа ММ и рисунок GOS-2.png с открытым меню приложений GOS. Для работы с этой функциональностью используются специальный класс CL_GOS_MANAGER, вообще-то классов для работы создано много, но как общий группирующий объект это именно CL_GOS_MANAGER. В принципе можно воспользоваться для работы и фукциональными модулями, но через класс все выполняется просто и быстро. Я не буду рассматривать все методы и атрибуты данного класса, как говорится я дам наметки как его быстро прикрутить к своему экрану, а дальше уже все получившие удочку, рыбу думаю смогут натаскать сами.

Почитать вообще что такое GOS можно тут: You are not allowed to view links. Register or Login

Пример будет очень простой, только для показа способа работы с классом. Первое что нужно знать это тип объекта к которому будем использовать вызов GOS, рассматривать буду заказ ММ, транзакция ME23N - закупочный заказ. Как узнать тип объекта, самое просто это воспользоваться транзакцией BAPI, которая позволяет узнать тип объекта, и много еще полезно, но не в нужное в данном случае. Вызываем транзакцию и ищем заказы ММ, на рисунке BAPI-1.png собственно показаны результаты поиска, нас интересует код объекта BUS2012. Далее все очень просто например мы имеет два экрана, первый где запрашиваем номер документа заказа и второй, где этот заказ показываем и хотим чтобы пользователь смог добавить какие-то внешние файлы к документу. Объявляем следующие переменные:
Код: You are not allowed to view links. Register or Login
DATA: ref_gos_manager type ref TO cl_gos_manager.
Далее в PBO-логике второго экрана, делаем где-то вызов процедуры которая создаетнам сервис GOS на нашем экране, для этого достаточно написать следующую процедурку
Код: You are not allowed to view links. Register or Login
FORM init_controls_gos.
* Сервис приложений
  DATA: l_ip_mode TYPE sgs_rwmod,
        ls_borident TYPE borident.

* Если объект не создан, создать.
  IF ref_gos_manager IS INITIAL.
*   D - Режим просмотра
*   E - Режим изменения
    IF sy-tcode = 'Y_EDIT'. l_ip_mode = 'E'. ELSE. l_ip_mode = 'D'. ENDIF.
    ls_borident-objkey = g_ebeln.        "Номер заказа ММ
    ls_borident-objtype = 'BUS2012'.     "Тип объекта
    CREATE OBJECT ref_gos_manager
      EXPORTING
        is_object        = ls_borident
        ip_mode          = l_ip_mode
      EXCEPTIONS
        object_invalid   = 1
        callback_invalid = 2
        OTHERS           = 3.
  ENDIF.
и все, на нашем экране появится кнопка доступа к GOS-объектам заказа. При этом эти же приложения будут доступны так же и при просмотре заказа через стандартные транзакции системы работы с заказами ММ.

Теперь надо сделать еще одну вещь, убрать кнопку приложения, если например по логике работы на втором экране есть кнопка BACK по которой пользователь может вернутся на предыдущий экран и ввести для работы новый номер заказа. Если же пользователь сразу выходит из транзакции, то про освобождение объекта позаботиться автоматически сборщик "мусора". Кстати, как только при приатачили файл, он автоматически загружается на сервер и выполнять операцию COMMIT не нужно. И так как убрать кнопку GOS с экрана, ну можно при обработке выхода на предыдущий экран, а можно в так же в PBO-логике первого экрана написать следующий код:
Код: You are not allowed to view links. Register or Login
  IF ref_gos_manager IS NOT INITIAL.
    CALL METHOD ref_gos_manager->unpublish( ).   "Закрыть объект
    FREE ref_gos_manager.                        "Освободить класс
  ENDIF.
Все теперь если вы перейдете на второй экран по новой вызовется создание объекта по новой с введенным новым номером заказа. При этом если это тот же самый номер заказа, то система при создании объекта GOS корректно покажет что уже есть приатаченные файлы к заданному заказу, это будет видно по тому, что станет доступен пункт меню "Список приложений", по которому будет открыто окно списка всех прикрепленных файлов.

Примечание: К сожалению в режиме просмотра списка прикрепленных приложений, система позволяет удалять данные без всяких запросов на подтверждение, не говоря уже о проверке полномочий на просмотр данных. Однако с этим можно легко справится, есть специальная нота и мое расширение к этой ноте, которое позволяет решить данную проблему: You are not allowed to view links. Register or Login, так же как-то поднималась проблема контроля типов загружаемых файлов и их размеров, это тоже решаемое, обсуждалось тут:
You are not allowed to view links. Register or Login

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 689
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: CL_GOS_MANAGER - Класс для публикации объектов GOS
« Ответ #1 : Август 30, 2018, 06:35:58 pm »
Потребовалось сделать свой GOS-объект, как это делать написано тут: You are not allowed to view links. Register or Login , а далее в момент создания собственного объекта, для которого создавался GOS-объект, получилась одна проблема. Не знаю связано ли это с S4/HANA, но суть проблемы в том, что в момент создания, например документа, номера документа еще нет. Соответственно создать GOS-объект с правильными ключами не получится, а создать с пустым ключем и изменить его в момент сохранения, когда номер документ уже известен, оказалось не простой задачей. На разных ресурсах предлагают переопределить ключ  и вызвать метод (You are not allowed to view links. Register or Login).
Код: You are not allowed to view links. Register or Login
* After Save when Key is avaiable
  CALL METHOD lo_manager->set_id_of_published_object
    EXPORTING
      is_object = la_obj.
  COMMIT WORK AND WAIT.
По факту на выходе оно не работает, после попытке чтения такого объекта, никаких вложений там нет. Короче, путем ковыряния в стандартных программах нашел класс, который позволяет сменить ключ, точнее выполнить копирование созданного GOS-объекта с временным ключем, в новый реальный ключ. Используется класс cl_gos_service_tools и метод класса move_linked_objects, так что инстанцию создавать не нужно.
Код: You are not allowed to view links. Register or Login
    DATA:  lt_services TYPE tgos_sels,
          ls_source   TYPE sibflporb,
          ls_target   TYPE sibflporb.

*         Исходный временный ключ объекта
          ls_source-instid =  ls_temp_gos_key.
          ls_source-typeid = gcn_objtype.
          ls_source-catid  = 'BO'.
*         Новый целевой ключ объекта
          ls_target-instid = gs_real_gos_key.
          ls_target-typeid = gcn_objtype.
          ls_target-catid  = 'BO'.

          cl_gos_service_tools=>move_linked_objects( is_source             = ls_source
                                                      is_target            = ls_target
                                                      it_service_selection = lt_services ).
Собственно на этом проблема решена. Данные создаваемые с временным ключем, оказываются приатаченными к действительному новому созданному объекту.