Меню

Преимущества использования CL_UJO_WRITE_BACK вместо CL_UJK_WRITE

|

В NetWeaver версии SAP BusinessObjects Planning and Consolidation (BPC) можно реализовать собственную логику для управления данными с помощью точки расширения для BPC, реализованной на UJR_WRITE_BACK ABAP Business Add-In (BAdI). В этом BAdI можно вызвать CL_UJO_WRITE_BACK для записи данных в другую модель. Вы можете столкнуться с проблемами, если требуется работать с обратной записью, которая была реализована с помощью CL_UJK_WRITE. Узнайте, как можно их решить. В статье приведен анализ, обзор архитектуры и код для исправления проблем.

Ключевое понятие

Расширение UJR_WRITE_BACK (Business Add-In [BAdI]) предоставляется компанией SAP как блок кода, который выполняется перед записью стандартной программой SAP данных в модели SAP BusinessObjects Planning and Consolidation (BPC).

SAP BusinessObjects Planning and Consolidation (BPC), версия NetWeaver, содержит Business Add-In (BAdI) с поддержкой пользовательской логики перед записью данных стандартной программой в модели BPC. В этом BAdI можно определить собственный код для записи данных в другие модели. Первая проблема заключается в том, что некоторые разработчики вместо предпочтительного класса CL_UJO_WRITE_BACK используют для выполнения этой задачи CL_UJK_WRITE. С использованием CL_UJK_WRITE связан ряд проблем и ограничений. Второй проблемой является то, что если в вашем BAdI для обратной записи приходится вызывать другой код, в котором также используется CL_UJK_WRITE, это может стать причиной нежелательных результатов. Рассмотрим подробнее суть этих проблем и способы их решения для лучшего понимания архитектуры обратной записи в BPC.

Дополнительная информация о BAdI приводится в разделе «BAdI для BPC».
 

BadI для BPC

Business Add-In (BAdI) — это точка расширения, которую SAP предоставляет для встраивания пользовательской логики. SAP предоставляет несколько BAdI для SAP BusinessObjects Planning and Consolidation (BPC).

Наиболее важными являются UJ_CUSTOM_LOGIC BADI и UJR_WRITE_BACK BADI. Например, без использования UJR_WRITE_BACK BADI система не может записать бюджет в размере 1,2 миллиона долларов США на 2016 год, который является родительским элементом для 12 месяцев. Вам необходимо указать, в каком базовом элементе (в данном случае месяце) будет проводиться эта сумма. Однако ввод сумм для каждого месяца может отнимать у пользователя слишком много времени и в целом противоречить требованиям процесса бюджетирования в рамках конкретной компании. В этой ситуации может потребоваться предоставить пользователю возможность указать общую сумму за 2016 год и передать системе остальную работу по распределению по месяцам на основе заданной логики.

С помощью UJR_WRITE_BACK BADI пользователь может записать данные за 2016 год и нажать кнопку Save Data (Сохранить данные) на ленте EPM. Далее будет инициирована системная программа SAP для обратной записи. До того, как система предпримет попытку записать данные за 2016 год (которая не увенчается успехом), данные будут обработаны UJR_WRITE_BACK BADI. Вы можете написать ABAP-код для распределения суммы в 1,2 миллиона долларов США по 12 месяцам согласно определенным правилам. Правило распределения может быть простым и равномерно разделять сумму 1,2 миллиона долларов США на 12 частей или сложным и искать записи продаж за предыдущий год для всех периодов, чтобы рассчитать вес каждого месяца. Обычно для выполнения бизнес-функции пользователь запускает пакет Data Manager в интерфейсе BPC Microsoft Excel.

Эти бизнес-функции могут быть стандартными, например, пересчет валют или финансовая консолидация. Также эти функции могут быть пользовательскими, например, распределение в соответствии с особыми указанными пользователем факторами (прогноз по трендам). Простую пользовательскую логику можно внедрить в логике скрипта. В этом случае скрипт будет вызываться пакетом Data Manager. При сложной пользовательской логике в логику скрипта потребуется вставить несколько строк кода. Код вызывает UJ_CUSTOM_LOGIC BADI в ABAP с параметрами импорта для выполнения задачи, как показано на рис. A.

Рис. А. Инициирование UJ_CUSTOM_LOGIC BADI посредством пакета Data Manager

Примечание.

Предпосылка: предполагается, что читатели имеют опыт разработки BPC, ABAP и BAdI.

Варианты использования CL_UJK_WRITE и соответствующие ограничения

На рис. 1 представлен метод write класса CL_UJK_WRITE. В транзакции SE24 введите имя класса CL_UJK_WRITE Display. Далее выберите метод write. Для просмотра параметров нажмите кнопку Signature.

Рис. 1. Метод write класса CL_UJK_WRITE

На рис. 2 показано определение метода. В меню выберите Method > Display Method definition (Метод > Просмотреть определение метода).

Рис. 2. Определение метода: общий и статический

На рис. 3 показано, как, по моим наблюдениям, пользователи применяют метод CL_UJK_WRITE=>WRITE() в своих программах.

Рис. 3. Типичное использование метода write() класса CL_UJK_WRITE

Поскольку это статический общий метод, некоторые используют его напрямую. Это просто и удобно. Однако при таком использовании возникают следующие проблемы:

Проблема 1: Следует ли скрывать нулевые значения. При обратной записи данных в одних случаях может потребоваться сохранять нулевые значения, а в других — скрывать. В приведенном примере вызова не предусмотрена такая вариативность.

Решением является использование параметра I_SUPPRESS_ZERO. Разумеется, описание для данного параметра на рис. 4 (значение Y — «не записывать») является некорректным, так как для типа UJ_FLG разрешены только значения ABAP_TRUE («X») или ABAP_FALSE (« «). Если требуется использовать данный параметр, введите значение «X» или оставьте поле пустым.

Рис. 4. I_SUPPRESS_ZERO — дополнительный параметр, который часто игнорируется при вызове данного метода

Проблема 2: Негибкость CL_UJK_WRITE=>WRITE(). Выполнение программы CL_UJK_WRITE=>WRITE() показано на рис. 5.

Рис. 5. Выполнение программы CL_UJK_WRITE=>WRITE()

Таким образом, в основе CL_UJK_WRITE=>WRITE() по-прежнему лежит CL_UJO_WRITE_BACK(), как и рекомендует SAP. В данном примере выполнения программы видно, что CL_UJK_WRITE=>WRITE() является просто оболочкой для CL_UJO_WRITE_BACK.

Параметры обратной записи, показанные на рис. 6, жестко закодированы в WRITE_IN_SYNC_MODE2() для CL_UJK_WRITE.

Рис. 6. Жестко закодированные параметры обратной записи

В шаге 2 алгоритма программы (рис. 5) для параметров обратной записи перед вызовом CL_UJO_WRITE_BACK-> write_back() устанавливаются жестко закодированные значения. Разработчики не имеют никакой возможности изменить эти значения. Такое ограничение лишает CL_UJK_WRITE=>WRITE() гибкости.

Однако данные параметры недоступны для ввода или изменения при вызове CL_UJK_WRITE=>WRITE(). Вместо этого значения присваиваются им внутри метода write_in_sync_mode2() без возможности для разработчика внести изменения в методе write(). Список параметров обратной записи представлен на рис. 7.

Рис. 7. Параметры обратной записи

По этой причине класс CL_UJO_WRITE_BACK является более предпочтительным, поскольку перед вызовом метода обратной записи вы можете самостоятельно настроить все требуемые параметры. Пример кода представлен на рис. 8.

Оформите подписку sappro и получите полный доступ к материалам SAPPRO

У вас уже есть подписка?

Войти