Настройка стратегии деблокирования заказов с классификацией
В статье изложены принципы настройки процедуры выдачи документов закупки. Рассмотрен пример настройки процедуры выдачи с классификацией для документа заказа на поставку.
Для обеспечения разделения и делегирования полномочий сотрудников отдела Закупки нет необходимости приобретения дорогостоящих Решений, таких как OpenText или «Док-флоу Бест Практис» (http://www.sapdocflow.ru/), которые позволяют полностью перейти на управление движением и работой с документами в электронном виде. Разделение полномочий по принятию решения о закупке может быть реализовано в SAP ERP с помощью соответствующей настройки процедуры деблокирования документов закупки, которую предоставляет функциональность системы: «Процедура выдачи (MM-PUR-GF)».
Однако этот компонент можно использовать лишь в тех случаях, когда достаточно установить простую процедуру утверждения заявок или других документов закупки. Возможностей какого-либо ветвления или маршрутизации документа данная функциональность не обеспечивает. Использование процедур деблокирования документов закупки эффективно, если маршрут движения документа по большей части является линейным, активирование стратегии утверждения происходит, только если параметры документа закупки, соответствуют определенным условиям и количество шагов утверждения не более 8. Например, общая стоимость заказа превышает $1000 или для различных групп закупки предполагаются разные маршруты или существуют отдельные процедуры выдачи для различных групп материалов, за которые отвечают разные функциональные отделы и т.д.
В системе имеются два варианта настройки процедуры деблокирования, с классификацией и без классификации. Деблокирование поддерживается для заявок на закупку, заказов на поставку, контрактов, соглашений о поставках, запроса и ведомости учета услуг/работ. Деблокирование без классификации возможно только на уровне позиций, а деблокирование с классификацией можно активировать (настроить) как на уровне позиций в заказе, так и для всего документа (заказа) в целом.
Сам процесс настройки несложный, все находится в одной ветке транзакции SAPPRO, Рис.1.
Идем в ветку «Определение процедуры деблокирования для заказов на поставку». Получаем окно с пунктами, которые обрабатываем по порядку, Рис.2.
Группы деблокирования
В нашем случае (см. Рис.3) имеют место только процедуры деблокирования, использующие систему классов. В системе могут быть или процедуры деблокирования без классификации или с классификаций, причем если имеется хотя бы одна определенная процедура деблокирования с классификаций, то она дезавуирует (отменяет) все процедуры без классификации. Скорее всего, у вас в системе тоже используются процедуры с классификацией так что, будем настраивать процесс деблокирования с классификацией (sap help тоже рекомендует использовать процедуры деблокирования с классификацией), Рис.3.
В IDES по умолчанию определён класс FRG_EKKO, в нем назначены 4 признака, Рис.4. Эти признаки:
- вид документа,
- закупочная организация,
- группа закупки,
- цена.
Такие признаки класса позволяют выполнять деблокирование, например, для документов определенного вида, созданных в определенной закупочной организации и группой закупки и только, если сумма договора больше 100 евро. Можно использовать свои классы, но для примера деблокирования можно использовать и стандартный класс. Вид класса обязательно должен быть выбран 032 – Стратегия выдачи.
Примечание: В качестве признаков класса можно использовать любые поля, которые перечислены в структуре CEKKO. Просмотреть структуру можно в транзакции SE11. Когда создаете признак, вы должны сослаться на поля структуры, пример на Рис.5, например вид документа.
Как создавать классы и признаки можно найти в sap help, ничего сложного в этом процессе нет. В общем, создаем новую группу, например ZZ со стандартным классом деблокирования.
И так теперь есть новая группа ZZ, и класс FRG_EKKO, Рис.6. Цифра 2 рядом с кодом группы указывает, что это стратегия деблокирования к заказу на поставку, для объекта заявок код объекта 1.
Далее нажимаем кнопку «Назад» и переходим ко второму шагу «Коды деблокирования».
Коды деблокирования
«Потоки операции» использовать не будем, это другая тема, в данной статье мы её не рассматриваем. Итак, создаем 2 кода, Рис.7.
Выбираем новые записи и создаем коды. Создадим два кода деблокирования. При создании
Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland
У вас уже есть учетная запись?
sidadm
Больше 5 лет назад, когда я только начинал этот блог и, у меня не было столько читателей, я написал пост про изменение статуса запроса. В посте я предложил способ, как изменить статус запроса, запущенного на деблокирование и по какой-то причине не завершившего этот процесс.
После этого, не помню уже точно когда, я обнаружил, что зависший или завершившийся с ошибкой процесс деблокирования запроса можно просто запустить на повторное деблокирование.
Для этого, как обычно, в транзакции SE01/SE10/SE09 встаете курсором на номер запроса и нажимаете кнопку «Прямое деблокирование» или выбираете пункт меню «Запрос -> Деблокировать -> Прямой (или Фоновый режим)» (рис. 1).
Рис. 1. Запуск процесса деблокирования запроса. |
В результате этого система инициирует экспорт данных вновь, а файлы запросов на уровне транспортной директории будут перезаписаны.
Это ни в коем случае не перечеркивает мой старый пост, так как ситуации, когда нужно изменить статус запроса бывают разные (например, удаление его и его следов из системы, что можно сделать только с не деблокированным запросом). К тому же в том посте была описана процедура перехода в режим отладки. 🙂
Блокировки SAP. Позитивные\Негативные. Пример блокировок
Блокировка — отметка записи в базе данных на время проведения операции(INSERT, UPDATE и т.д.). Служит для предотвращения коллизий при доступе к записи и устанавливается на время операции на уровне БД. SAP для своей системы позволяет создал свою концепцию блокировок, которая позволяет блокировать определенные данные на все время работы транзакции.
Виды блокировок:
Shared Lock (S) — Служит для того, чтобы в процессе показа никто не отредактировал данные. Можно устанавливать несколько блокировок от разных пользователей или транзакций. При этом попытки установить блокировки типов E,X будут отклонены.
Exclusive Locks (E) — Эксклюзивная блокировка устанавливается только для одного LUW. Снимается только пользователем установившим её. Самый распространённый тип блокировки, именно его мы можем увидеть в большинстве транзакций.
Exclusive but not cumulative lock (X) — практически тоже самое, что и тип Е, но может установиться только один раз в пределах транзакции.
Optimistic Lock (O) — Данная блокировка может быть установлена сразу несколькими пользователями. А после переведена в блокировку типа E. При этом остальные блокировки типа О этой записи будут сняты.
Все действия с блокировками происходят при помощи специально сгенерированных ФМ ENQUEUE_E* DENQUEUE_E*
Рассмотрим создание блокировок для таблицы на примере:
заходим в SE11 и вводим желаемое имя. Обратите внимание, что имена начинаются не на Z или Y
Указываем список полей по которым производится блокировка. По умолчанию это ключ таблицы. После того как были указаны поля, необходимо сохранить и активировать объект.
После этого можно перейти к сгенерированным модулям блокировки.
ENQUEUE_E* — установка блокировки
DENQUEUE_E* — снятие блокировки.
Если вы не хотите плодить сущности и вас вполне устраивает блокировка по ключу, можно воспользоваться универсальным модулем блокировки — ENQUEUE_E_TABLE для установки блокировки и DEQUEUE_E_TABLE для снятия
Структура вызова модуля ENQUEUE_E* :
mode_ — Тип блокировки O,X,E,S . В дополнение к этим значениям существуют еще несколько
- R — перевод ранее установленной оптимистичной блокировки в блокировку на запись E.
- С — проверка возможности преобразования оптимистичной блокировки в блокировку на запись E.
- U,V,W — проверка возможности установки блокировки в режимах X,E,S соответственно.
Список параметров — параметры для блокирования. Можно использовать маски, в виде символа @. При этом произойдет блокировка всего диапазона.
X_Параметр — Устанавливаем «Х» для параметра если требуется заблокировать начальное значение.
_SCOPE – может принимать следующие значения:
- «1» — Блокировка принадлежит диалоговому процессу. Отменяется путем вызова модуля DEQUEUE или выходом из программы.
- «2» — Блокировка снимается при вызове модуля DEQUEUE или вызовом модуля обновления. В случае если запускается COMMIT WORK и есть отложенные модули обновления (CALL FUNCTION ‘…’ IN UPDATE TASK), блокировка снимается после выполнения модулей обновления V1, на этапе вызова модулей обновления V2 блокировки уже сняты. Если до вызова COMMIT WORK не было запущено модулей обновления, блокировки не будут сняты.
- «3» — Блокировка является комбинацией «1» и «2». Блокировка снимается при когда ее отменит последний владелец.
_wait – если значение «X», функциональный модуль, в случае если уже стоит блокировка, будет ожидать определённый промежуток времени перед повторным вызовом ФМ. Количество повторений задаётся параметром в профиле (RZ11) — ENQUE/DELAY_MAX. Время, которое будет ожидать система 1 секунда (по умолчанию), параметр ENQUE/DELAY_MAX_REFINE отвечает за то, сколько раз в секунду будет происходить проверка.
_collect – позволяет накапливать блокировку в буфере, а потом установить их все разом пи помощи ФМ: FLUSH_ENQUEUE. Если хотя бы одну блокировку не удалось осуществить, все остальные тоже не установятся. Буфер можно очистить ФМ: RESET_ENQUEUE.
Замечание:
Установка блокировки сама по себе не помешает добавить запись таблицы из другой транзакции. Чтобы все работало как задумано, то и во втором месте необходимо попытаться установить блокировку. По хорошему сделать API для работы с таблицей и все операции проводить через него.
Существуют два принципиально разных типа блокировок. Первый «негативные блокировки«, такой тип, чаще всего встречается в транзакциях. Начали работать с записью и сразу блокировали всю возможную работу с ней.
Второй тип — «позитивные блокировки«. В этом случае мы даем возможность открыть запись для редактирования для многих пользователей. Но перед непосредственной записью, произойдет блокировка.
Позитивные блокировки применяются когда изменение данных происходит не очень часто, и вероятность доступа пользователей к одним и тем же данных невелика. Это решение позволяет избежать момента, когда пользователи блокируют друг-друга. Например, один из пользователей зашел в режиме редактирования и ушел пить чай. Другой стороной позитивных блокировок является полный откат действий всех действий пользователей после первого коммита. Надо понимать этот риск перед использованием.
Порядок действий при позитивной блокировке:
Фаза 1:
— Проверяем возможность установки блокировки типа O;
— Устанавливаем блокировку;
— Читаем данные;
Фаза 2(изменение данных):
— Проверяем согласованность данных;
— Проверяем возможность перевода блокировки в тип Е и переводим ее в этот тип(При помощи вызова ФМ ENQUEUE_E* c параметром mode_* = R) ;
— Изменение данных;
— Снятие блокировки;
Пример установки позитивной блокировки, с последующим установки блокировки типа ‘E’. При этом остальные пользователи не смогут перевести свою блокировку O в тип E.
При подготовке материала использовались источники:
https://sappro.sapland.ru/kb/articles/stats/nastroika-strategii-deblokirovaniya-zakazov-s-klassifikatsiei.html
https://sidadm.blogspot.com/2014/01/blog-post.html