Изменение данных инфотипа с использованием стандартных классов и методов
Система SAP предоставляет множество стандартных классов (и методов) для обновления записей инфотипов. Из этой статьи Вы узнаете детальные шаги для создания новых записей инфотипа, удаления записи, и изменения полей уже существующей записи инфотипа.
Ключевое понятие
Кастинг (Casting, присвоение типов) позволяет Вам производить присвоение типов между двумя ссылочными переменными. Когда присвоение прошло успешно, целевая переменная указывает на тот же объект, на который ссылалась исходная переменная. Для кастинга используется специальный оператор ?=, когда статичный тип исходной переменной является более общим, чем тип целевой переменной.
В дополнение к чтению данных инфотипов сотрудников, разработчикам зачастую приходится обновлять данные стандартных и клиентских инфотипов. Для этого существует множество подходов. Подходы могут быть устаревшими, как например, использование сессий пакетного ввода (BDC — Batch Data Communication, а также использование функциональных модулей, таких как HR_INFOTYPE_OPERATION, который не утвержден для использования в разработках клиента. Наиболее «вежливым» и рекомендованным подходом является использование стандартных классов, поставляемых системой SAP для подобных нужд. Классы могут быть без труда использованы разработчиками в области SAP ERP HCM; однако нужно обладать навыками по использованию классов.
Я начну с краткого введения стандартных классов и методов, которые SAP предоставляет для изменения данных инфотипа через программу клиента, а затем подробно покажу требуемые шаги для вставки записей инфортипа. Затем, я поясню как Вы можете удалить отдельную запись с использованием стандартных методов. В конце, я покажу, как обновить существующих запись в инфотипе. На протяжении статьи, я буду использовать инфотип 0006 (Адреса) в качестве своего примера.
В моей преыдущей статье HR Expert об инфотипах «Как читать данные инфотипа с использованием стандартных классов и методов» (How to Read Infotype Data Using Standard Classes and Methods), я рассказал о том как считывать данные и тексты инфотипа из инфотипа сотрудника. В этой, второй части, я покажу Вам как обновлять данные в инфотипах. Обновление предполагает создание, удаление, и обновление существующей записи в инфотипе.
Примечание.
Целевая аудитория для данной статьи — разработчики и пользователи SAP HR. Я укажу примеры кода и сопровожу их скриншотами для пояснения своих мыслей.
Обзор классов и интерфейсов для обновления данных инфотипа
Перед детальным изучением шагов по разработке, связанной с доступом к данным инфотипа, давайте посмотрим имеющиеся классы и методы для этих целей. В этой части, я поясню основные классы и методы, необходимые для обнволения данных, находящихся в инфотипах. Эти классы позволяют Вам считывать данные как из стандартных так и клиентских (нестандартных) инфотипов. Позже, в текущей статье, я поясню код, требуемый для использования этих классов для обновления данных инфотипа. Один из наиболее важных классов, используемых для написания кода, — это класс CL_HRPA_MASTERDATA_BL. Этот класс обеспечивает важный метод factory, GET_INSTANCE, который возвращает ссылку на класс CL_HRPA_MASTERDATA_BL. Этот класс базируется на интерфейсе IF_HRPA_MASTERDATA_BL, который является наиболее важным интерфейсом для использования. Необходимые методы этого интерфейса и их назначения перечислены в табл. 1.
Табл. 1. Методы интерфейса IF_HRPA_MASTERDATA_BL
В дополнение, система SAP предоставляет два важных метода ENQUEUE_BY_PERNR и DEQUEUE_BY_PERNR, которые находятся в классе CL_HRPA_MASTERDATA_ENQ_DEQ, используемого для блокирования и разблокирования сотрудников, соответственно. Для каждой операции (например, удаление, вставка и изменение), является необходимым заключать код между вызовами методов ENQUEUE и DEQUEUE.
Примечание.
Любое динамическое действие, которое связано с обновляемым инфотипом, не выполняется автоматически программой, которая использует шаги описанные в этой статье. Вам нужно запрограммировать каждое действие, которое должно выполняться, вручную. Также, любая проверка, специфичная для клиента, написанная экзите PBAS0001 не вызывается, когда упомянутые методы вызываются.
Как вставлять новую запись в инфотипы
В этой части, я покажу как использовать стандартные классы и методы для создания новой записи инфотипа. В качестве пример, я покажу как создать запись в инфотипе 0006 (Адреса) для табельного номера 1006 для постоянного адреса (подтип 1).
Шаг 1. Определить структуры инфотипа и присвоить значения с данными
Первым шагом является определение структуры (в данном случае, WA_P0006) со ссылкой на структуры словаря P0006. На рис. 1 показано определение структуры WA_P0006.
Рис. 1. Определение структуры инфотипа
Затем, присвойте нужные значения полям структуры WA_P0006 (рис. 2). Вы должны быть уверены, что все требуемые поля для этого инфотипа заполнены в этом блоке кода (убедитесь, что поле wa_p0006-infty заполнено значением номера инфотипа, с которым Вы работаете; в нашем случае это 0006).
Рис. 2. Присвойте значения полям структуры wa_p0006
Шаг 2. Заблокируйте запись сотрудника
Следующим шагом будет вызов метода ENQUEUE_BY_PERNR для блокировки записи сотрудника, чьи данные должны быть созданы. Перед этим, Вам нужно определить объект для обработки сообщений для генерации сообщений, которые будут возникать при вызове метода.
Определите ссылку (MESSAGE_HANDLER_OBJ) для класса (CL_HRPA_MESSAGE_LIST) и создайте объект (инстанцию) с помощью метода CREATE OBJECT (рис. 3).
Рис. 3. Определите и создайте обработчик сообщений (message handler)
Теперь, Вы готовы блокировать указанную запись сотрудника. Вызовите статичный метод ENQUEUE_BY_PERNR класса CL_HRPA_MASTERDATA_ENQ_DEQ. Затем Вы должны указать номер сотрудника для блокировки через параметр PERNR и также передать объект MESSAGE_HANDLER_OBJ в качестве параметра (рис. 4).
Рис. 4. Блокировка записи сотрудника
Если запись сотрудника успешно заблокирована, переменная IS_OK содержит значение 'X' после вызова метода (в противном она содержит пустое значение). Если запись сотрудника уже заблокирована, то IS_OK содержит пустое значение.
Шаг 3. Вызов бизнес логики
Как только запись сотрудника заблокирована, Вы можете вызвать статичный метод GET_INSTANCE класса CL_HRPA_MASTERDATA_BL (рис. 5).
Рис. 5. Вызов метода бизнес логики
Этот метод вызывает ссылку класса CL_HRPA_MASTERDATA_BL.
Шаг 4. Вызов метода GET_INFTY_CONTAINER
Затем Вам нужно вызвать метод GET_INFTY_CONTAINER интерфейса IF_HRPA_MASTERDATA_BL, используя ссылку на указанный интерфейс LR_MASTERDATA_BL. Вы передаете, в качестве параметров, TCLAS (в нашем случае — 'A' — сотрудник). Очень важно: Вам нужно передать параметр PSKEY (который связан с ключом вставляемой записи).
Тот же самый объект MESSAGE_HANDLER_OBJ, который был использован ранее, теперь может использоваться для любого сообщения, создаваемого в качестве результат выполнения метода. Если есть какие-либо проблемы с этим методом, то параметр IS_OK будет содержать пустое значение; в противном случае, параметр IS_OK будет содержать значение 'X'. Код представлен на рис. 6.
Рис. 6. Вызов метода GET_INFTY_CONTAINER
LR_CONTAINER является внутренней таблицей, которая играет роль временного хранилища. Это то место, куда Вы вначале вставляете данные, которые будут вставлены в дальнейшем в таблицу инфотипа. Как только данные помещены в LR_CONTAINER, происходит вставка через метод INSERT (подробная информация об этом указана дальше).
Примечание.
Вам нужно быть уверенным, что предоставленный ключ является таким же, который был указан для создания контейнера инфотипа на шаге 3. В этом случае, я заполнил поля ключа, показанного на рис. 2. Если этого не сделать, то возникнет ошибка исполнения программы (short dump).
Шаг 5. Присвоение значений контейнеру
На данном шаге Вы указываете полный набор значений для каждого поля создаваемой записи инфотипа. В контейнере нет метода для выполнения подобной операции. Вернее, требуемый метод MODIFY_PRIMARY_RECORD принадлежит интерфейсу HRPA_INFTY_CONTAINER_DATA. Однако, мы можем использовать присвоение типов (down-cast) контейнера к типу, использующему интерфейс IF_HRPA_INFTY_CONTAINER_DATA (рис. 7).
Рис. 7. Заполните контейнер с необходимыми данными
Примечание.
Имеются две формы присвоения типов (typecasting). Когда тип исходной переменной является более общим, чем тип целевой переменной — это называется downcasting. Другой формой является upcasting, когда тип исходной переменной является более точным (специфичным), или таким же, как и тип целевой переменной. В обоих случаях может использоваться особый оператор ?=. Для более подробной информации о casting используйте ссылку на SAP Help: https://help.sap.com/abapdocu_750/en/abapmove_cast.htm.
Оформите подписку sappro и получите полный доступ к материалам SAPPRO
Оформить подпискуУ вас уже есть подписка?
Войти