Автор Тема: Изменение блока контировок в зависимости от изменения полей заказа на закупку  (Прочитано 6329 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 808
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Недавняя тема изменения блока контировок в заявке You are not allowed to view links. Register or Login плавно перешла в тему такого же изменения, но для заказа на поставку. Так как на текущий момент не то что правая и левая руки в компании делают разное, но и каждый палец пишет сам по себе как получится, то аналогичная задача для заказа на поставку оказалась реализована совсем другим образом, поэтому пришлось поковыряться во внутренностях, чтобы понять как это можно прикрутить.

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

1. Для запуска пересчета позиций заказа при изменений какого-либо поля в заголовке заказа есть BADI: ME_CHECK_ALL_ITEMS - Снова прогнать позиции при изменении в EKKO. В данном бади только один метод ME_CHECK_ALL_ITEMS с параметрами:
Код: You are not allowed to view links. Register or Login
IM_X_OEKKO Importing Type EKKO                                                                                                                                     Old Status EKKO
IM_X_EKKO Importing Type EKKO                                                                                                                                     Status EKKO
CH_X_RECALCULATE Changing Type C                                                                                                                                     Flag for Recalculation
В общем на вход вам дают предыдущий заголовок и новый и вы уже можете проверить какое значение на какое изменилось и если необходимо, то устанавливаете флаг CH_X_RECALCULATE = abap_true, после чего система заходит в блок обработки позиций заказа на закупку. Однако контировки, как было сказано обработаны не будут, так как в модуле обработки на входе стоит следующий код:
Код: You are not allowed to view links. Register or Login
  CHECK aktyp EQ hin OR ok-code EQ fmit OR
     ( aktyp EQ ver AND
     ( ( ekpo-knttp EQ space AND *ekpo-knttp NE space ) OR
       ( ekpo-werks NE *ekpo-werks ) OR
       ( ekpo-matnr NE *ekpo-matnr ) OR
       ( ekpo-bwtar NE *ekpo-bwtar ) OR
       ( ekpo-pstyp NE *ekpo-pstyp ) OR
       ( ekpo-bukrs NE *ekpo-bukrs ) OR
       ( ekpo-repos NE *ekpo-repos ) OR                     "625119
       ( ekpo-fistl NE *ekpo-fistl ) OR
       ( ekpo-fipos NE *ekpo-fipos ) OR
       ( ekpo-geber NE *ekpo-geber ) OR
       ( ekpo-budget_pd NE *ekpo-budget_pd AND cl_ops_switch_check=>ops_sfws_bud_per( ) IS NOT INITIAL ) OR
       ( ekpo-fmfgus_key NE *ekpo-fmfgus_key ) OR
       ( ekpo-fkber NE *ekpo-fkber ) OR
       ( ekpo-kblnr NE *ekpo-kblnr ) OR
       ( ekpo-kblpos NE *ekpo-kblpos ) OR
       ( ekpo-grant_nbr NE *ekpo-grant_nbr ) ) ).
Соответственно пересчет контировок будет выполнен только если произошло изменений одного из полей перечисленных в условии. Код находится в модуле: MM06EF0F_FINANZMITTEL, подпрограмма FORM finanzmittel. В начале данной подпрограммы я активировал неявное расширение, где проверил так же изменение поля заголовка, в данном месте как раз доступен как заголовок так и обрабатываемая позиция, после чего, сбросил одно из полей контировки (данное поле автоматически рассчитывается в зависимости от значения поля заголовка). Сброс поля привел к обработке автоматического перерассчета контировок, что мне и было нужно в данном случае.

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

PS: Сообщение не выставлял, как-то устал переписываться, да и времени особо нет.  8)
« Последнее редактирование: Октябрь 26, 2018, 01:50:12 pm от Uukrul »

Sapforum.Biz