Автор Тема: BC-SRV-GBT-GOS Generic Object Services  (Прочитано 23649 раз)

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

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
BC-SRV-GBT-GOS Generic Object Services
« : Июль 02, 2008, 02:26:47 pm »
BC-SRV-GBT-GOS Generic Object Services - Фактически сия возможность появилась во многих приложениях системы. Нотка описывающая где и что лежит 530792, кратенько по табличкам из ноты:
Цитировать
Technically speaking, notes, PC attachments and URLs are treated as SAPoffice documents and result in corresponding entries in the SOOD and SOFM tables. The contents of the attachments are stored in the SOC3 table.As of Release 4.6B, the contents of PC attachments are stored using the Knowledge Provider (KPro).The KPro allows you to connect an external storage system so that the contents of the PC attachments no longer place a burden on the database. If an external storage system is not connected, the contents of the PC attachments are written to the SOFFCONT1 table as of Release 4.6B.The administrative information necessary to locate the document in the Kpro is in the SOC3 table.
The content of notes and URLs continues to be stored in the SOC3 table.As these documents are usually small, the additional effort involved in storing them in the KPro is not justified.

По поводу объектов полномочий на объекты GOS тоже есть нотка и тоже есть небольшая корректировка на эту нотку, обсуждалось и решалось тут You are not allowed to view links. Register or Login

Описание класса по работе с GOS-объектами находится тут: You are not allowed to view links. Register or Login
« Последнее редактирование: Сентябрь 11, 2014, 09:39:28 pm от Uukrul »

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Для добавления собственных пунктов меню в GOS меню нужно выполнить небольшую настройку и создать собственную реализацию класса, который будет отвечать за созданный вами пункт меню.

Для начала необходимо  определить объект, который будет отвечать за ваш пункт меню. Это выполняется путем создания новой записи в ракурсе ведения SM30: SGOSATTR. Параметры создаваемого объекта рисунок SGOSATTR-1.png.

Имя сервиса, по вашему желанию начинающееся с пользовательского символа Z или Y. Описание и подсказка тоже не должны вызвать проблем. Далее необходимо указать класс реализации, который будет обрабатывать наш пункт меню. Класс создадим позже, пока просто придумаем имя. Тип сервиса выбираем 1. Иконку любую из списка. А вот в поле «Следующий сервис», нужно указать код сервиса CREATE_ATTA, так же необходимо отметить галкой пункт «Управление».

Затем с версии 7.0 необходимо еще прописать созданный нами сервис в ракурсе, где устанавливается активность компонента. Для более ранних версий, этого пункта настройки кажется не было, пример на рисунке SGOSCUST-1.png ниже. Из основных параметров задаем признак активности компонента, аналогично повторяем имя класса реализации сервиса и метку «Управление».

На этом подготовительная часть готова, нужно перейти к реализации класса, обрабатывающего сообщения созданного пункта меню.  Фактически необходимо создать реализацию наследника класса CL_GOS_SERVICE. Для этого в транзакции SE24 – Создание классов, создадим объявленный ранее класс Z_AOT_XECM_OPEN_CARD, рисунок SE24-1.png.

В данном классе необходимо по минимуму переопределить фактически 2 метода. Это EXECUTE и CHECK_STATUS. Метод EXECUTE отвечает за вывод того, что вы хотите вывести в отдельном окне GOS меню, для чего и добавили свой пункт. Метод CHECK_STATUS управляет отображением пункта меню, т.е. чтобы ваш пункт появлялся только в тех транзакция, для которых он рассчитан, а то сейчас он доступен для всех объектов, рисунок SE24-2.png.

Реализация метода CHECK_STATUS довольно простая, рисунок SE24-3.png.

Фактически мы проверяем тип бизнес объекта, в данном случае это объект инвестиционной заявки BUS2104, так как я реализую меню только для этого объекта. Соответственно если вызов выполняется для объекта инвестиционная заявка, то я запоминаю параметры структуры IS_LPORB типа SIBFLPORB. В данной структуре фактические будет находиться – ключ бизнес объекта, т.е. в нашем случае это будет номер документа заявки. Это необходимо сделать, чтобы затем обработать этот номер в методе EXECUTE.

Если объект заявка тогда нужно в параметре ep_status нужно вернуть значение MP_STATUS_ACTIVE, иначе MP_STATUS_INVISIBLE, т.е. скрыть пункт меню. Еще возможно значение MP_STATUS_INACTIVE, т.е. пункт меню будет виден, но без возможности выбора.

Далее идет в метод EXECUTE и вот тут, фактически мы можем сделать все, что нам нужно от вывода диалогового окна, собственно окно будет подготовлено без вас, вам будет дана ссылка на контейнер, где например можно вывести ALV-таблицу или же запустить, например внешний браузер, передав ему необходимую ссылку, рисунок SE24-4.png.

Основное что нужно вернуть, это или сообщение, что выполнение прервано или же если вы выводите свое собственное диалоговое окно, то CONTAINER_IGNORED, иначе после вашего окна появится еще стандартное пустое окно. Если же, вы будете использовать стандартное окно, тогда используйте ссылку на контейнер IO_CONTAINER.

В конечном итоге вы получите свой пункт в GOS-меню системы, рисунок IMA2N-1.png.

PS: Как обычно, все одним файлом, на общих условиях: Создание и обработка собственных пунктов GOS.pdf

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: BC-SRV-GBT-GOS Создание собственных GOS-объектов
« Ответ #2 : Сентябрь 14, 2014, 05:32:07 pm »
В продолжении темы по поводу GOS объектов, что бы так сказать если не до конца, то максимально раскрыть тему сисек, осталось рассмотреть процесс создания собственных объектов для использования как в своих программах, так и в стандартных, так как SAP постарался максимально использовать данный компонент в своих транзакциях, однако местами, например позиции инвестиционной программы или контракты SD, почему-то возможности GOS, не реализованы. Поэтому для начала рассмотрим создание собственного GOS объекта, а затем принципы его использования.

Для создания собственных GOS-объектов используется транзакция SWO1 – Построитель бизнес-объектов. Запускаем транзакцию и вводим имя создаваемого бизнес-объекта. Наименование может быть любым, но чтобы не усугублять, предлагаю использовать стандартное правило, т.е. начинать пользовательские объекты на Z или Y. В качестве примера создадим объект для использования в позициях инвестиционной программы. Стандартно в системе такой возможности нет, рисунок IM23-1.png, как видим в стандартном поле описания экрана кнопка GOS-меню отсутствует.

Для начала, в транзакции SW01, создадим собственный объект, например ZI_BUS1057. В системе существует уже стандартный бизнес объект BUS1057, однако так как он системный, то менять его нам без ключа модификации не дадут, ну и даже если бы это было возможно, то объект к тому же объявлен устаревшим, что так же исключает возможность его модификации. Поэтому делаем новый собственный объект, рисунок SW01-0.png.

Появится диалоговое окно, в котором нужно задать описание создаваемого объекта и самое основное, это задать имя программы, в которой будет небольшой код реализующий обработку вашего GOS-объекта, рисунок SW01-1.png.

В поле супертип ничего не указываем, так как нам нужен объект для обработки не собственно инвестиционной программы, а позиций инвестиционной программы. Если вы выберем наследование, то система не даст нам возможности изменить параметры формирования глобального ключа объекта. В данном случае уникальный ключ объекта это год утверждения и имя инвестиционной программы, нам же нужно к этим параметрам добавить еще код позиции программы, поэтому прямое наследование при создании объекта не подходит.

После определения основных параметров создаваемого объекта  переходим на следующий экран, для определения интерфейсов, ключей и метода объекта для работы с GOS-меню.

Перед тем как что-то создавать в новом бизнес-объекте, необходимо сохранить определение объекта, затем установить курсор на строку «Интерфейсы» и нажать кнопку создания. Система запросит у вас имя нового интерфейса. Имя может следующим, рисунок SW03-3.png:
  • IFGOSASERV – Если у вас система версти SAP ECC 4.7 или меньше.
  • IFGOSXSERV – Если система версии SAP ECC 6.0, для переходной версии 5.0 она же кажется, SAP 2004, не знаю, давно не встречал

Таким образом, появится новый интерфейс для поддержки GOS-меню, рисунок SW01-4.png.

Так как мы создали новый объект, то необходимо определить ключевые поля, уникально идентифицирующие экземпляр объекта в системе. Объект, инвестиционная программа, в системе определяется двумя ключевыми полями, это имя программы и год. Так как мы хотим создать объект для работы с позициями, то нам нужно еще одно ключевое поле, это код ветки программы, рисунок SW01-4-1.png, т.е. данные три поля должны однозначно идентифицировать экземпляр объект в системе, фактически это набор полей формирования уникального ключа таблицы.

Примечание: Так как писателям SAP-овских баз данных, иногда глубоко наплевать на нормализацию и Дейта с его введением в базы данных, то у таблицы IMPR – «Позиции инвестиционной программы», фактически существует два уникальных ключа, это поле: POSNR – «Номер позиции» или набор полей:
  • GJAHR – Год утверждения инвестиционной программы
  • POSID – Идентификатор позиции инвестиционной программы
  • PRNAM – Имя инвестиционной программы
Поэтому можно создать ключ из одного поля POSNR или добавить ключ из трех полей GJAHR, PRNAM и POSID.

В системе существующие BAPI-функции работы с инвестиционной программой используют всегда связку из трех полей «Год» –  «Позиция» –  «Имя программы», поэтому я тоже решил использовать данную связку. Ставим курсор в районе ключевых полей и нажимаем кнопку создания новых ключевых поле,  POSITION, рисунок SW01-4-1.png.

Создаем три ключевых поля, при создании система предложит создать поля с использованием ABAP-словаря – отказываемся, так как мы будем создавать наименования полей по аналогии с BAPI-функциями системы, рисунок  SW01-4-2.png, а не ссылочной таблицы базы данных IMPR.

Далее выбираем кнопку меню, для создания программы, где будет описан метод реализации GOS-объекта, рисунок  SW01-5.png.

По умолчанию, текст созданной программы будет содержать некий код, в зависимости от того создавали вы объект с нуля или используя наследование от уже существующего объекта. Например, в данный момент, текст программы следующий:
Код: You are not allowed to view links. Register or Login
*****           Implementation of object type ZI_BUS1057           *****
INCLUDE <OBJECT>.
BEGIN_DATA OBJECT. " Do not change.. DATA is generated
* only private members may be inserted into structure private
DATA:
" begin of private,
"   to declare private attributes remove comments and
"   insert private attributes here ...
" end of private,
  BEGIN OF KEY,
      POSITION LIKE IMPR-POSID,
      APPROVALYEAR LIKE IMPR-GJAHR,
      PROGRAM LIKE IMPR-PRNAM,
  END OF KEY.
END_DATA OBJECT. " Do not change.. DATA is generated
Как видим, описание структуры ключа KEY, содержит наши описанные три ключевые поля. Добавляем в данный код определение метода GOSAddObjects.
Код: You are not allowed to view links. Register or Login
*****           Implementation of object type ZI_BUS1057           *****
INCLUDE <object>.
begin_data object. " Do not change.. DATA is generated
* only private members may be inserted into structure private
DATA:
" begin of private,
"   to declare private attributes remove comments and
"   insert private attributes here ...
" end of private,
  BEGIN OF key,
      position LIKE impr-posid,
      approvalyear LIKE impr-gjahr,
      program LIKE impr-prnam,
  END OF key.
end_data object. " Do not change.. DATA is generated

*------------------------------------------------------------------------------
*------------------------------------------------------------------------------
* Определение метода GOSAddObjects используя стандартные макросы
begin_method gosaddobjects changing container.  "Макрос определения метода

DATA: service(255),
      busidentifs LIKE borident OCCURS 0,
      ls_borident TYPE borident.

CLEAR ls_borident.
* Имя логической системы
CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
  IMPORTING
    own_logical_system             = ls_borident-logsys
  EXCEPTIONS
    own_logical_system_not_defined = 1
    OTHERS                         = 2.
IF sy-subrc <> 0. CLEAR: ls_borident-logsys. ENDIF.
* Имя объекта
ls_borident-objtype = 'ZI_BUS1057'.
* Ключ экземпляра объекта
ls_borident-objkey = object-key.
APPEND ls_borident TO busidentifs.

swc_get_element container 'Service' service.       "Макрос заполення контейнера
swc_set_table container 'BusIdentifs' busidentifs.

end_method.    "Макрос завершения метода
*------------------------------------------------------------------------------
*------------------------------------------------------------------------------
Фактически для определения метода используем предопределенные макросы системы. Наш код довольно простой, фактически вы можете скопировать все что ниже строки: «" Do not change.. DATA is generated» единственное, что нужно потом заменить это имя объекта на созданное вами в строке: «ls_borident-objtype = 'ZI_BUS1057'.». После этого сохраняем код и выходим.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: BC-SRV-GBT-GOS Создание собственных GOS-объектов
« Ответ #3 : Сентябрь 14, 2014, 05:42:33 pm »
В основном обзоре объекта выполним генерацию нашего объекта. Система сообщит, что объект содержит ошибки, рисунок  SW01-6.png.

Для просмотра ошибок можно перейти по меню: «Перейти к» – «Список ошибок». рисунок SW01-6-1.png. Теоретически в тексте будет одна ошибка. Суть ошибки заключается в том, что метод вы в тексте программы определили, но вот в перечень методов его не включили.

Для этого становимся на ветку дерева «Методы» и нажимаем кнопку «Создать». Система спросит, нужно ли создать ФМ как образец, говорим – говорит что нет! Нам будет предложено диалоговое окно определения метода, рисунок  SW01-7.1.png, заполняем параметры как в примере ниже.

После чего подтверждаем создание метода. Метод создан, однако имеет признак модели, рисунок SW01-7.2.png, т.е. вызов данного метода не может быть выполнен, для этого метод должен быть внедренным.

Для переключения метода в статус «Внедрено», необходимо выполнить сохранение созданного метода, затем выполнить генерацию объекта, кнопка , на панели инструментов. Теперь ошибок быть не должно, в строке статусов будет выведено сообщение о том, что объект успешно сгенерирован, рисунок 14: SW01-9.png или же сообщение, что смоделированные типы объектов сгенерировано невозможно, так как в данном случае, у нас есть только один метод и тот создан в качестве модели.

Теперь можем переключить тип метода со статуса «смоделировано» на статус «внедрено», для этого установим курсор на созданный метод и по меню выберем изменение статуса, рисунок SW01-10.png.

Теперь нужно изменить общий статус бизнес-объекта с состояния «Смоделировано» на «Внедрено». То, что объект находится в статусе моделирования, видно по пиктограммам рядом с именами ключевых полей, или можно перейти в обзор заголовка объекта, нажав кнопку заголовок объекта , рисунок SW01-12.png.

Поэтому вернемся на предыдущий экран, и переключим статус объекта в положение «Внедрено», рисунок SW01-13.png.

Система сообщит, что статус объекта установлен в положение «Внедрено», теперь вы можете выполнить общую генерацию созданного бизнес-объекта, все должно пройти без ошибок, в строке статуса будет выведено сообщение об успешной генерации объекта.

В принципе на этом создание объекта фактически завершено, теперь нужно определить в стандартной программе место, куда можно включить вызов GOS-объекта. Так как это стандартная программа SAP, то для этих целей будем использовать технику неявных расширений системы (Enhansments). Код нужно модифицировать в PBO-логике экрана, на котором мы хотим увидеть GOS-меню. Так как пока система не допускает расширения логики экранов. В стандартной транзакции берем любое главного экран программы, например поле текста описания к коду программы и смотрим технические данные, как видим это экран 0600, рисунок SW01-14.png.

В принципе после небольших изысканий по коду PAI-логики экрана 600, быстро находится модуль LAIP2F00  и подпрограмма FORM general_read, в которой можно добавить явный энхансмент вызова GOS-меню. Так потребуется использовать неявное расширение в модуле LAIP2TOP – глобальные переменные, где потребуется вставить переменюю типа CL_GOS_MANAGER. Код будет добавлен в самый конец модуля, как неявное включение, пример:
Код: You are not allowed to view links. Register or Login
ENHANCEMENT 3  ZIM_IMPR_GOS_SERVICES.    "active version
CONSTANTS: ziim_objtype TYPE borident-objtype VALUE 'ZI_BUS1057'.

DATA: ziim_manager TYPE REF TO cl_gos_manager,
      ziim_obj TYPE borident.
ENDENHANCEMENT.
Далее пример LAIP2F00, в самом начале подпрограммы FORM general_read, так же используя неявную точку расширения добавим код вывода GOS-меню. Фактически в данном месте проверяем, что вызов идет для экрана 600 и что объект инстанция GOS-меню для позиции программы ранее не создана. Кстати, данная точка вставки расширения, вызова класса GOS-меню в подпрограмме FORM general_read, не единственно возможная.
Код: You are not allowed to view links. Register or Login
FORM general_read.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(3) FORM GENERAL_READ, Начало                                                                                                                         A
*$*$-Start: (3)---------------------------------------------------------------------------------$*$*
ENHANCEMENT 2  ZIM_IMPR_GOS_SERVICES.    "active version
IF sy-dynnr = '0600' AND ziim_manager IS INITIAL.
  ziim_obj-objtype = ziim_objtype.

  ziim_obj-objkey(24) = impr-posid.
  ziim_obj-objkey+24(4) = impr-gjahr.
  ziim_obj-objkey+28(8) = impr-prnam.

  CREATE OBJECT ziim_manager
    EXPORTING
      is_object    = ziim_obj
      ip_no_commit = space
    EXCEPTIONS
      others       = 1.
ENDIF.
ENDENHANCEMENT.
*$*$-End:   (3)---------------------------------------------------------------------------------$*$*

  DATA:    l_tabix LIKE sy-tabix,
           l_subrc LIKE sy-subrc.
  STATICS: l_flg_prof_data_read LIKE sy-datar VALUE ' '.

Внимание: Особенность заполнения ключа должна повторять структуру из программы генерации бизнес-объекта, т.е. в программе система автоматически объявила структуру KEY как:
Код: You are not allowed to view links. Register or Login
  begin of key,
      position like impr-posid,
      approvalyear like impr-gjahr,
      program like impr-prnam,
  end of key.
Т.е. первой идет позиция программы, далее год и потом имя программы, длину полей можно посмотреть в словаре данных, поэтому ключ сформирован таким хитрым образом. В принципе можно было объявить аналогичную структуру у себя в глобальных параметрах модуля LAIP2TOP, чтобы не возится с расчетом порядка следования переменных в ключе. Все дело вкуса.

При вызове класса управления GOS-объектами переменная ip_no_commit, передаем как пустое значение, это значит, что фактически все прикрепленные данные в нашем GOS-меню будут фиксироваться общим COMMIT-ом, т.е. если пользователь откажется от сохранения, то никакие приложения добавлены не будут. Возможные варианты значения данной переменной можно посмотреть в домене SGS_CMODE.

Результат нашей работы теперь можно увидеть в экране создания/изменения позиции инвестиционной программы, рисунок IM22-2.png.

Собственно, что и требовалось реализовать, теперь к позиция инвестиционной программы можно добавлять любые заметки, скан копии оригиналов каких-то документов, ссылки на сайты и т.д., рисунок IM22-3.png.

PS: Как обычно внизу все одним файлом, на стандартных условиях распространения: Создание собственных GOS объектов.pdf

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
так же необходимо отметить галкой пункт «Управление».
Небольшое уточнение, при создании собственного пункта меню, если вы не отметите галку  "Управление", то контейнер  IO_CONTAINER при вызове метода не будет создан, соответственно если вы не предполагаете выдачи собственного списка приложений в стандартном окне, то данную галку можно не устанавливать.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: BC-SRV-GBT-GOS Generic Object Services
« Ответ #5 : Апрель 23, 2020, 03:04:36 pm »
Фактически кросс ссылка на описание работы с GOS-объектами из собственных программ, если необходимо получить данные которые содержатся в объекте: You are not allowed to view links. Register or Login

Sapforum.Biz

Re: BC-SRV-GBT-GOS Generic Object Services
« Ответ #5 : Апрель 23, 2020, 03:04:36 pm »