В продолжении темы по поводу 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.
По умолчанию, текст созданной программы будет содержать некий код, в зависимости от того создавали вы объект с нуля или используя наследование от уже существующего объекта. Например, в данный момент, текст программы следующий:
***** 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.
***** 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'.». После этого сохраняем код и выходим.