ABAP Object Services

SAP Постоянные данные ABAP Object Services

ABAP Object Services — это платформа для различных служб, связанных с созданием и работой с устойчивыми объектами. Устойчивые объекты позволяют использовать чисто объектно-ориентированную модель данных для хранения данных, а не реляционную модель данных. SAP предоставляет Persistence Service, которая действует как программный уровень между устойчивыми объектами и базовой базой данных; Другими словами, Persistence Service позволяет вам работать с устойчивыми данными без необходимости использования операторов Open SQL в вашей программе.

В этом разделе мы обсудим, как использовать ABAP Object Services для устойчивых объектов. Мы начнем с обзора того, что такое Persistence Service, затем рассмотрим создание устойчивых классов ( Persistence classes ) и работу с устойчивыми объектами ( Рersistent objects. ).

Обзор Persistence Service


Служба Persistence основана на инструментах сопоставления объектных отношений (ORM). Используя инструменты ORM, детали персистентности инкапсулируются внутри персистентных классов путем сопоставления таблиц/структур/представлений базы данных с объектно-ориентированной моделью. Фактически это позволяет вам работать с данными в реляционной базе данных объектно-ориентированным способом. Классы с объектно-реляционным сопоставлением называются постоянными классами, а атрибуты, сопоставленные со столбцами в таблице базы данных, называются постоянными атрибутами.

В других языках программирования, таких как Java, структура ORM автоматически создает соответствующие таблицы базы данных и представляет данные в виде объектов при создании класса с атрибутами. Однако SAP пока не поддерживает такую функциональность. Persistence Service — это программный уровень, который является промежуточным звеном между устойчивыми объектами и реляционной базой данных. Сами устойчивые объекты являются временными по своей природе.


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

Создание устойчивого класса - Persistent Classes.


Действия по созданию persistent класса аналогичны созданию обычного класса, за исключением того, что вы выбираете устойчивый класс в качестве типа класса.

Когда устойчивый класс создается, он реализует интерфейс IF_OS_STATE. Этот интерфейс реализован во всех персистентных классах, чтобы гарантировать согласованный доступ ко всем персистентным классам.



Построитель классов также создает два класса агентов с соглашением об именах CA_ и CB_. Эти классы агентов используются для управления устойчивым объектами устойчивого класса. Другими словами, эти классы агентов будут иметь методы, которые реализуют фактические операторы Open SQL и заботятся об инициализации устойчивых объектов.

Например,  мы создаем постоянный класс с именем ZCL_TEST_EXAMPLE, а Class Builder создаст классы агентов ZCA_TEST_EXAMPLE и ZCB_TEST_EXAMPLE.

Класс агента ZCB_TEST_EXAMPLE является абстрактным классом, и класс ZCA_OS_SFLIGHT наследуется от него. Класс ZCB_OS_SFLIGHT добавляется в качестве друга к персистентному классу ZCL_OS_SFLIGHT, как показано ниже.
На данный момент класс ZCL_TEST_EXAMPLE имеет только методы из интерфейса IF_OS_STATE. Построитель классов добавляет дополнительные методы, как только мы выполняем сопоставление устойчивости с таблицей, структурой или представлением базы данных. Сопоставление устойчивости— это процесс сопоставления полей таблицы базы данных с атрибутами класса постоянства.

Чтобы выполнить сопоставление устойчивости, нажмите кнопку «Отображение устойчивости» Пункт меню->Перейти к. Откроется инструмент сопоставления, как показано ниже. Укажите имя таблицы/структуры, с которой вы хотите сопоставить класс сохраняемости.

Class Builder автоматически создаст атрибуты в классе для полей отображаемой таблицы/структуры. Он также создаст методы установки и получения для управления этими полями. Методы установки не создаются для ключевых полей таблицы, потому что ключ не должен быть изменен.

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


Выберите каждое поле и нажмите (Enter), чтобы добавить поле в класс. Должны быть добавлены все поля таблицы. Если вы хотите использовать только некоторые поля таблицы, создайте ракурс проекции для таблицы и используйте имя ракурса для устойчивости. Когда все поля будут добавлены, нажмите «Сохранить», а затем «Назад».

Обратите внимание, что все поля добавляются как атрибуты и создаются соответствующие методы SET и GET.
Теперь активируйте класс. Если вы ранее не активировали этот класс, система покажет вам подсказку с вопросом, следует ли также активировать активатор класса. Нажмите Да.

Работа с устойчивыми объектами


Работать с устойчивыми объектами довольно просто. Класс агента ZCA_ реализует одноэлементный шаблон проектирования, поэтому мы не можем создать экземпляр объекта напрямую с помощью инструкции CREATE OBJECT в программе. Одноэлементный шаблон проектирования гарантирует, что существует только один экземпляр объекта.

Чтобы получить ссылку на класс агента, нам нужно получить доступ к статическому атрибуту агента, определенному в классе агента. Оттуда мы можем работать с постоянными данными так же, как с объектом, вызывая методы get_persistent, create_persistent и delete_persistent для чтения, записи и удаления записи в таблице базы данных.

Ниже показан пример чтения записи путем вызова метода get_persistent класса агента.
DATA :lo_sflight_agent TYPE REF TO zca_test_example, "Агент
      lo_sflight       TYPE REF TO zcl_test_example, "Устойчивый класс
      lv_price         TYPE s_price.
TRY.
    lo_sflight_agent = zca_test_example=>agent.
    lo_sflight = lo_sflight_agent->get_persistent( i_carrid = 'AA'
                                                   i_connid = 0017
                                                   i_fldate = '20190921' ).
    lv_price = lo_sflight->get_price( ).
    WRITE lv_price.
  CATCH cx_os_object_not_found INTO DATA(lo_msg).   "ObjectnotFound
    WRITE lo_msg->get_text( ).
ENDTRY.

Комментарии