Sapforum.Biz

Логистика => Управление материальными потоками (MM) => Тема начата: Uukrul от Февраль 27, 2017, 11:04:13 pm

Название: Cоздание собственного шага для записи условия в схеме калькуляции заказа ММ
Отправлено: Uukrul от Февраль 27, 2017, 11:04:13 pm
1.   Создание собственного шага для записи условия в схеме калькуляции заказа на закупку

Стандартно в заказах на закупку используется схема калькуляции: RM0000 - Документ закупок. Для формирования базовой цены существует код условия: PB00 - Цена брутто, сумма данного поля может формироваться исходя из множества условий. В стандартной схеме калькуляции обычно введен набор вариантов определения цены, при этом доступ к условиям задан монопольным, это значит, что как только одно из условий выполнилось, система считает, что базовая цена определена и дальше можно выполнять остальные условия из схемы, например расчет НДС от базовой суммы и т.д. На рисунке 1-1, показана часть стандартной схемы калькуляции.

(http://sapforum.biz/index.php?action=dlattach;topic=2900.0;attach=4295;image)

Как видим, система сначала попытается определить цену в зависимости от цены тары, шаг 005, далее, будет попытка определения цены из позиции контракта ММ в зависимости от кода завода, шаг 010 и т.д. Как только цена будет найдена, система установит ее в качестве базовой цены позиции в заказе на поставку.  Например, в данном случае цена была найдена в условии PB00, шаг 011, на рисунке 1-1, это шаг без текста и именно о создании данного шага и поговорим далее. В заказе, рисунок 1-2, данная цена была установлена как 300 UAH.

(http://sapforum.biz/index.php?action=dlattach;topic=2900.0;attach=4297;image)

В данной системе, заказы создавались со ссылкой на заявку на закупку и контракт ММ, т.е. выполнялась двойная ссылка, дело в том, что в контракте ММ, позиция контракта формировалась с типом позиции М - материал не известен. Далее в тексте позиции указывали, например "Поставка системы кондиционирования" и ставили общую контрактную сумму, например 100 000 UAH. С другой стороны в заявках на закупку прописывались уже конкретные коды закупаемых ОЗМ с ценой закупки для каждой позиции. Заявки так же включали в себя как материалы, так и услуги по установке системы кондиционирования, т.е. с одной стороны общая сумма контролировалась по контракту, с другой стороны был ответственные за закупку, которые контролировали закупаемые позиции, путем формирования заявок, т.е. правильные закупочные цены на материалы находились в заявках. Как оказалось при такой комбинации, система берет стоимость позиций из контракта, т.е. каждая ссылочная позиция брала базовой суммой 100 000 UAH, в общем-то, это и понятно, так как из схемы калькуляции система находила контракт на закупку и копировала цену из контракта, что оказалось крайне не приемлемым.  Исправлять в заказах на закупку десятки и сотни позиций, перенося цену из заявок было не очень удобным (так как суммы уже были внесены в заявках один раз), опять же проблема правильности внесения цифр требовала дополнительной проверки. Поэтому встала задача, а сделайте так, чтобы сумма в позиции заказа на закупку копировалась из заявки, ну типа там BADI же есть, вот и подставьте. Конечно, BADI есть, но копировать сумму в позицию в пользовательском расширении, оказалось крайне не правильно и по ряду причин работало все при таком копировании не корректно, поэтому был выбран пусть добавления собственного шага в схему калькуляции. Оказалось, что это можно сделать для заявок ММ, но для этого как обычно нужно немного настройки +  немного ABAP. За основу был взят шаг 010 - копирование цены из контракта на закупку.

1.1.   Создание собственного шага в схеме калькуляции.

Настройка схем условий находится в транзакции SPRO по следующему пути: Управление материальными потоками - Закупки - Условия, рисунок 1-3. Собственно сама схема условий в данном случае нас не интересует, нас интересует настройка условия PB00, которое находится схеме RM0000, поэтому, сначала идем в ветку "Определение видов условий" для определения последовательности доступа, которая присвоенная данному условию. Собственно говоря, перечень шагов это и есть последовательность доступа для условия.

(http://sapforum.biz/index.php?action=dlattach;topic=2900.0;attach=4299;image)

После перехода к просмотру условия PB00, видно, что данному условию присвоена последовательность доступа 0002, рисунок 1-4.

(http://sapforum.biz/index.php?action=dlattach;topic=2900.0;attach=4301;image)

Переходим к ведению последовательностей, ветка меню: "Определение последовательностей доступа". Как видим шаги состоят из последовательности шагов, где каждый шаг кроме номера шага имеет так же код таблицы условий, в нашем случае таблицы условий с полями заявки на закупку не существует, поэтому, сначала необходимо создать новую таблицу условий, рисунок 1-5.

(http://sapforum.biz/index.php?action=dlattach;topic=2900.0;attach=4303;image)

Таблицы условий для пользователей должны начинаться с номера 9 и в общем виде таблица условий, представляет из себя перечень полей, по которым мы будем определять выбор цены. В данном случае нам необходимы поля номера и позиции заявки. Стандартно в системе данные поля не объявлены в специальном каталоге возможных полей, для использования в таблицах условий, поэтому сначала мы должны добавить такие поля в каталог. Для этого необходимо в транзакции SE11 расширить структуру KOMPAZ - Расчет цен - позиция связи:  модификация клиента, путем добавления двух необходимых полей номер заявки и позиция заявки, рисунок 1-6, при добавлении полей имена полей должны начинаться с символов ZZ, типы полей берем из таблицы заявок EBAN.

(http://sapforum.biz/index.php?action=dlattach;topic=2900.0;attach=4305;image)

После добавления структуры дополнения, активируем созданные объекты и возвращаемся в настройку. Если все сделано правильно, то в ветке "Расширение каталога полей для таблиц условий" данные поля можно будет добавить в список каталога, рисунок 1-7.

(http://sapforum.biz/index.php?action=dlattach;topic=2900.0;attach=4307;image)

Каталог полей расширен, можно перейти к созданию таблицы условий, для этого выбираем пункт "Ведение таблицы условий", и далее в диалоговом окне необходимо выбрать пункт "Создание таблицы условий". Как говорилось выше, номера пользовательских таблиц должны начинаться с цифры 9, поэтому создаем таблицу 901. Далее из полей в колонке справа, находим наши поля, заявка и позиция заявки и переносим их в колонку слева, рисунок 1-8. После переноса полей заявки необходимо выполнить генерацию созданной таблицы условий.

(http://sapforum.biz/index.php?action=dlattach;topic=2900.0;attach=4309;image)

Таблица условий создана и активирована, можно вернуться к ветке ведения  последовательностей доступа: "Определение последовательностей доступа". Создадим собственный шаг. Номер шага 011 выбран не случайно, в данном случае контракты создаются без ссылки на завод, поэтому условие 010 будет невыполнимо, а вот условие 013 выдаст значение суммы из ссылочного контракта, а так как доступ к шагам задан монопольно, то система прекратит обработку условий, как только будет найдена первая цена. Поэтому мы добавили свое условие 011 шагом, если бы контракты имели ссылку на завод, то номер шага необходимо было бы задавать, например как 007.  И так добавили новый шаг 011, таблица условий 901, переходим к ведению полей. Система должна корректно выставить перенос значений, рисунок 1-9, на основе таблицы условий.

(http://sapforum.biz/index.php?action=dlattach;topic=2900.0;attach=4311;image)

Теперь необходимо в пользовательском расширении, выполнить перенос значений заявки из документа закупки в структуры расчета цены. Для этого, в системе создан CusnomerExit: LMEKO002 - Extend communications structure KOMP for pricing, который нужно включить в проект расширения. В данном расширении переносим значения из документа закупку в структуру E_COMP, которую систему использует для расчета цены. Код переноса значений в расширении следующий:
Код: You are not allowed to view links. Register or Login
*&---------------------------------------------------------------------*
*&  Include           ZXM06U15
*&---------------------------------------------------------------------*
*"*"Lokale Schnittstelle:
*"       IMPORTING
*"             VALUE(I_EKPO) LIKE  EKPO STRUCTURE  EKPO OPTIONAL
*"             VALUE(I_T001W) LIKE  T001W STRUCTURE  T001W OPTIONAL
*"             VALUE(I_EKKO) LIKE  EKKO STRUCTURE  EKKO OPTIONAL
*"             VALUE(I_KOMK) LIKE  KOMK STRUCTURE  KOMK OPTIONAL
*"             VALUE(I_MT06E) LIKE  MT06E STRUCTURE  MT06E OPTIONAL
*"             VALUE(I_EINA) LIKE  EINA STRUCTURE  EINA OPTIONAL
*"             VALUE(I_EINE) LIKE  EINE STRUCTURE  EINE OPTIONAL
*"             VALUE(I_KOMP) LIKE  KOMP STRUCTURE  KOMP OPTIONAL
*"       CHANGING
*"             VALUE(E_KOMP) LIKE  KOMP STRUCTURE  KOMP
*"----------------------------------------------------------------------
MOVE i_komp TO e_komp.

* Якщо є посилання на контракт, заявка та є позиція матеріала, тоді передати
* номер заявки для розрахунку ціни у схему калькуляції замовлення на закупівлю
IF e_komp-evrtn <> space AND
   e_komp-evrtp <> space AND
   e_komp-evrtt <> space AND
   e_komp-matnr <> space.
  MOVE i_ekpo-banfn TO e_komp-zz_banfn.
  MOVE i_ekpo-bnfpo TO e_komp-zz_bnfpo.
ENDIF.

Т.е. мы переносим значения заявки только в том случае, если в документе заказа на закупку выполняется ссылка на документ контракта и заявки. В принципе такое условие можно было не использовать, а просто перенести значения из позиции заказа в структуру интерфейса, но тогда в записи условия необходимо было бы реализовать собственную программу предпосылки. Данная программа управляет тем учитывать шаг условия в схеме калькуляции или нет, например, в заказе заполнена только ссылка заявки на закупку, без контракта. В таком случае шаг 011, необходимо пропустить. Однако с программами предпосылок есть одна неприятность, для ее создания необходимо получать ключ модификации объекта, поэтому в данном случае, чтобы не запрашивать ключ, был принято решение, что позиции заявки переносятся в расширении, т.е. по факту кроме собственно переноса значений, так же используется проверка условия, когда необходимо  выполнять перенос. Следовательно, если поля контракта и заявки не заполнены, то переноса номера заявки в структуру расчета сделано не будет и шаг 011 не будет выполнен. На этом работа со схемой калькуляции закончена, однако чтобы схема работала, необходимо теперь зайти в транзакцию ведения условий и внести, номер заявки и позицию, после чего указать цену. Стандартно для этого используется транзакция MEK1, рисунок 1-10. Вводим код вида условия PB00, нажимаем ввод, система предложит нам перечень доступных таблиц условий, наш шаг это 011 (в данном случае текст текста был не введен, чтобы было видно созданное условие).

(http://sapforum.biz/index.php?action=dlattach;topic=2900.0;attach=4313;image)

После выбора шага, система предлагает перейти к ведению условий. Система, согласно созданной таблицы условий, затребует номер заявки и позиции, рисунок 1-11.

(http://sapforum.biz/index.php?action=dlattach;topic=2900.0;attach=4315;image)
После внесения записей условий, при создании заказа со ссылкой на контракт и заявку система подтянет сумму из заявки на закупку, это видно в анализе расчета цены заказа, рисунок 1-12.

(http://sapforum.biz/index.php?action=dlattach;topic=2900.0;attach=4317;image)

Можно сказать, что все работает, однако вносить заявки и цены в записи условий, в транзакции MEK1 по факту тоже самое что и повторный ввод цены в позиции заказа, а собственно говоря, этого мы стараемся избежать, поэтому за основу был проанализирован алгоритм работы системы с контрактами и определено, что система при создании контрактов автоматически заполняет таблицу условий контракта. В данном случае это стандартная таблица условий 016, при этом физическое имя таблицы система формирует как соединение буквы A + <номер таблицы условия>, т.е. в данном случае имя таблицы базы данных для контрактов A016, и следовательно таблица условий для заявки будет A901. Если зайти в просмотр таблицы A016, то можно увидеть, что в таблицу всегда попадают все контракты, которые создаются в системе. Следовательно, нам нужно обеспечить аналогичное ведение нашей таблицы условий создаваемыми заявками. Для этого можно использовать BADI-расширение ME_REQ_POSTED - Сохранение заявки на закупку. Данное расширение вызывается при каждом сохранении заявки, в нем мы можем заполнить таблицу условий. Создание расширения выполняется в транзакции SE19. Расширение имеет только один метод POSTED - Purchase Requisition Posted, который необходимо реализовать. Код реализации метода не совсем тривиальный, так как для правильного формирования записи условий, кроме заполнения таблицы A901, необходимо еще заполнить таблицы KONH и KONP, т.е. фактически реализовать механизм ведения транзакции MEK1, для этого, достаточно базовых знаний ABAP.

Пример реализации кода в методе POSTED:

Код: You are not allowed to view links. Register or Login
METHOD if_ex_me_req_posted~posted.
  DATA: ls_a901 TYPE a901,
        ls_konh TYPE konh,
        ls_konp TYPE konp,
        ls_eban TYPE LINE OF mereq_t_ueban.


  ls_a901-kappl    = 'M'.
  ls_a901-kschl    = 'PB00'.
  ls_a901-kfrst    = space.
  ls_a901-datbi    = '99991231'.
  ls_a901-kbstat   = space.
  LOOP AT im_eban INTO ls_eban.
    ls_a901-zz_banfn = ls_eban-banfn.
    ls_a901-zz_bnfpo = ls_eban-bnfpo.
    ls_a901-datab    = ls_eban-erdat.

    CALL FUNCTION 'NUMBER_GET_NEXT'
      EXPORTING
        nr_range_nr = '01'
        object      = 'KONH'
      IMPORTING
        number      = ls_a901-knumh.


    ls_konh-knumh = ls_a901-knumh.
    ls_konh-ernam = sy-uname.
    ls_konh-erdat = ls_a901-datab.
    ls_konh-kvewe = 'A'.
    ls_konh-kotabnr = '901'.
    ls_konh-kappl = 'M'.
    ls_konh-kschl = 'PB00'.
    CONCATENATE ls_eban-banfn ls_eban-bnfpo INTO ls_konh-vakey.
    ls_konh-datab = ls_a901-datab.
    ls_konh-datbi = ls_a901-datbi.


    ls_konp-knumh = ls_a901-knumh.
    ls_konp-kopos = '1'.
    ls_konp-kappl = 'M'.
    ls_konp-kschl = 'PB00'.
    ls_konp-stfkz = 'A'.
    ls_konp-krech = 'C'.
    ls_konp-kbetr = ls_eban-preis.
    ls_konp-konwa = ls_eban-waers.
    ls_konp-kpein = ls_eban-lpein.
    ls_konp-kmein = ls_eban-meins.
    ls_konp-kznep = abap_true.
    ls_konp-zaehk_ind = 1.

    MODIFY: a901 FROM ls_a901,
            konh FROM ls_konh,
            konp FROM ls_konp.
  ENDLOOP.
ENDMETHOD.

Теперь, каждая созданная заявка, попадает в таблицу условий и как следствие участвует в схеме калькуляции расчета цены для позиций заказа на закупку, таким образом, мы решили задачу копирования цены из заявки на закупку со ссылкой на позиции, как заявки, так и контракта. Данный метод можно использовать для реализации различных собственных условий определения цен, которые можно подключать к схемам калькуляций системы.
Название: Cоздание собственного шага для записи условия в схеме калькуляции заказа ММ
Отправлено: Uukrul от Февраль 27, 2017, 11:05:49 pm
Все одним файлом. Условия стандартные, оперативное обновление файла не гарантируется.