Цена последней партии поставки. Транзакция ZPRICE_LAST.

Исправить по новым данным.

 

 

 

Проект комплексной автоматизации

системы управления предприятием

PLC “GMSM”

 

 

 

Техническое задание

на разработку

 

« Формирование Учетной цены с пользовательским расширением »

 

 

  1. Создаем вариант калькуляции 400 – оценка по последней партии поставки.Вариант оценки 100 – формирует стандартную цену ПФ и ГИ с оценкой сырья и покупных комплектующих по среднескользящей цене.
  2. В варианте оценки/завод настраиваем стратегию оценки сырья и покупных комплектующих в калькуляции ПФ.В приоритете 1 формируется массив материалов с расчетной ценой последней партии поставки.В приоритете 3 материалы, не оцененные по 1 и 2 приоритету будут оценены по данным инфозаписи закупок ( конкретно — давальческие материалы).
  3. В приоритете 4 и 5 материалы оценятся по ценам, внесенным в основную запись материалов, если не были найдены записи в предыдущих приоритетах.
  4. В приоритете 2   материалы , не оцененные по 1 приоритету будут оценены по среднескользящей цене.
  5. Формирование Учетной цены с пользовательским расширением производится посредством ежедневного наполнения специальной таблицы. Cформированные данные выводятся в транзакции ZPRICE_LAST_UPDATE — Обновление цены (программа ZHM_ZVERPR_LAST_DELI).
  6. Настройка пользовательского расширения.FUNCTION EXIT_SAPLCK21_002.
    *»———————————————————————-
    *»*»Lokale Schnittstelle:
    *»  IMPORTING
    *»     VALUE(F_MATBW) LIKE  CKIMATBW STRUCTURE  CKIMATBW
    *»     VALUE(IMP_KLVAR) LIKE  KEKO-KLVAR
    *»     VALUE(IMP_VALUATION) LIKE  CKIBEW-VALUATION
    *»     VALUE(IMP_BZOBJ) LIKE  KEKO-BZOBJ
    *»     VALUE(IMP_EKORG) LIKE  CKKALKTAB-EKORG
    *»     VALUE(IMP_LIFNR) LIKE  CKKALKTAB-LIFNR
    *»     VALUE(IMP_TVERS) LIKE  CKKALKTAB-TVERS
    *»     VALUE(IMP_CUOBJ) LIKE  CKKALKTAB-CUOBJ
    *»     VALUE(IMP_VBELN) LIKE  KANZ-VBELN
    *»     VALUE(IMP_POSNR) LIKE  KANZ-POSNR
    *»     VALUE(IMP_AUFNR) LIKE  CKIBEW-AUFNR
    *»  EXPORTING
    *»     VALUE(EXP_PREIS) LIKE  CKKALKTAB-GPREIS
    *»     VALUE(EXP_WAERS) LIKE  CKIBEW-OWAER
    *»  CHANGING
    *»     VALUE(EXP_PEINH) LIKE  CKKALKTAB-PEINH
    *»———————————————————————-
    INCLUDE ZXCKAU08 .
    ENDFUNCTION.«*»Lokale Schnittstelle:
    *»  IMPORTING
    *»     VALUE(F_MATBW) LIKE  CKIMATBW STRUCTURE  CKIMATBW
    *»     VALUE(IMP_KLVAR) LIKE  KEKO-KLVAR
    *»     VALUE(IMP_VALUATION) LIKE  CKIBEW-VALUATION
    *»     VALUE(IMP_BZOBJ) LIKE  KEKO-BZOBJ
    *»     VALUE(IMP_EKORG) LIKE  CKKALKTAB-EKORG
    *»     VALUE(IMP_LIFNR) LIKE  CKKALKTAB-LIFNR
    *»     VALUE(IMP_TVERS) LIKE  CKKALKTAB-TVERS
    *»     VALUE(IMP_CUOBJ) LIKE  CKKALKTAB-CUOBJ
    *»     VALUE(IMP_VBELN) LIKE  KANZ-VBELN
    *»     VALUE(IMP_POSNR) LIKE  KANZ-POSNR
    *»     VALUE(IMP_AUFNR) LIKE  CKIBEW-AUFNR
    *»  EXPORTING
    *»     VALUE(EXP_PREIS) LIKE  CKKALKTAB-GPREIS
    *»     VALUE(EXP_WAERS) LIKE  CKIBEW-OWAER
    *»  CHANGING
    *»     VALUE(EXP_PEINH) LIKE  CKKALKTAB-PEINH
    *»———————————————————————-
    exp_preis = zhmcl_co=>get_cost_last_delivery( f_matbw-matnr ).
    exp_waers = f_matbw-waers.
    break stecova_ae.
    break zhmailik_vv.
  7. Метод (ZHMCL_CO) GET_COST_LAST_DELIVERY   Static Method     Public                                           Определение стоимости по последней поставке
  8. В ZXCKAU08:
  9. В транзакции se85 «обработать объект» выбрать «ФункцМодель» exit_saplck21_002.
  10. Наполнение   таблицы производить по стратегии:
Ссылка Таблица Поле Комментарий
1* MARA MATNR Для MARA-ZBESK равно либо “T”, “E”.
2* MAKT MAKTX Для MAKT-MATNR= MSEG-MATNR
3* Писать в 3*:

значение 5*, если значение 5* не найдено или =0, переходить к значению 6*. Писать значение 6*,если значение 6* не найдено или = 0, переходить к значению 7*. Писать значение 7*, если значение 7* не найдено или =0, переходить к стратегии оценки в варианте оценки калькуляции 400.

3.1* Вывести валюту БЕ
3.1* Переводить цену в   БЕИ
4* MBEW-LBKUM <> « » and MBEW-BWKEY= «1000» and   MBEW-BWTAR= « »
5* MSEG-DMBTR / MSEG-MENGE,
5.1.* MSEG-WAERS
6* ekpo-netpr / ekpo-peinh
6.1* EKPO-EBELN=EKKO-EBELN
6.2* EKPO-EBELP
6.3* EKKO-WAERS
7* 7* = EKPO-EFFWR / EKPO — MENGE
7.1* EKKO-WAERS

 

 

материал Краткий текст материала Учетная цена с пользовательским расширением Валюта цены БЕИ Запас Цена посл. поступления c учетом таможенной пошлины Валюта цены посл поступления с учетом ТП
1* 2* 3* 3.1* 3.2* 4* 5* 5.1*
Цена договора закупок (инфозапись) Документ Закупки Позиция документа закупки Валюта цены договора закупок Цена посл.поступл. в иностанной валюте с переводом на текущий курс Валюта цены последнего поступления
6* 6.1* 6.2* 6.3* 7* 7.1*

 

  • Формирование массива материалов для вывода в таблицу.

 

В столбец 1* записываются материалы (номера ОЗМ), у которых признак значение поля MARA-ZBESK равно либо “T”, “E”. По данному перечню материалов производить расчет цены последней партии поставки (приоритет 1 в варианте оценки 400) согласно заданному алгоритму.

 

Связываем таблицу MARA с необходимыми таблицами по полю MATNR.

  • Выбирается цена последнего поступления + Таможенная пошлина при наличии запасов материала.
    1. Связываем таблицы MARA- MATNR и MBEW- MATNR.
    2. Проверяем наличие значение запаса по полю MBEW-LBKUM <> « » на области оценки /заводе 1000 MBEW-BWKEY= «1000» с видом оценки равным пусто   MBEW-BWTAR= « » .
    3. Если запас на 1000 заводе есть, производить расчет цены последней партии поставки.
    4. Связываем таблицы MARA- MATNR и MSEG-MATNR

 

Для каждого материала MATNR** из списка формируется строка по последнему поступлению по следующему алгоритму:

Формируется выборка (5* таблицы) MSEG-MBLNR*, MSEG-MJAHR* из MSEG-MKPF (связка MSEG-MKPF по MKPF-MBLNR=MSEG-MBLNR, MKPF-MJAHR=MSEG-MJAHR), где:

MSEG-MATNR = MATNR

MKPF-BUDAT <= DATE*

MSEG-BWART = “101” — вид движения

MSEG-LIFNR <> “пусто” — номер счета поставщика

MSEG-SHKZG = “S” (Дебет) -дебет счета

MSEG-SOBKZ=” “ — код особого запаса

MSEG-EBELN, MSEG-EBELP <> “пусто” номер заказа на поставку, позиция номера заказа на поставку

MSEG-SMBLN = “пусто”, -номер документа материала

MSEG-SMBLP = “пусто” -позиция документа материала

и не существует MSEG-MBLNR для которого MSEG-SMBLN = MSEG-MBLNR*

MSEG-KZBEW = “B” — Код движения

MSEG-KZZUG = “ ”. — Код поступления

В данной выборке определяется строка MSEG с наибольшей датой MKPF-BUDAT <= DATE*.

Данную строку MSEG обозначаем далее MSEG**.

Если цена выбрана и цена по полю 5* <> 0,00, пишем ее в таблицу 3*.

Если на данном шаге цена последнего поступления не выбрана, приступаем к следующему шагу.

 

  • Выбираются информация из инфозаписей закупок (6* таблицы) имеющие договора. 

 

  1. Так как создание договора на закупку сырья и покупных комплектующих в системе автоматически создает инфозапись закупки, рассматриваем информацию из таблиц документов закупки.
  2. (если не выбраны данные на шаге 1, т.е. 5* с условием MSEG**-DMBTR / MSEG**-MENGЕ = «0,00»)

Если поле 3* не заполнено, выполнять поиск из таблиц договоров на закупку, найденную цену в валюте БЕ (byn) записывать в поле 6*..

    1. Связываем таблицы MARA- MATNR и EKPO — MATNR .
    2. Связываем таблицы EKPO – EBELN = EKKO – EBELN.
    3. Связываем таблицы при t001k-bwkey = ekpo-werks.
    4. Связываем таблицы при t001-bukrs = t001k-bukrs   .
    5. Формируется выборка EKPO – EBELN = EKKO – EBELN , где:Номер документа закупки EKPO-EBELNЗавод EKPO-WERKSОбъем заказа на поставку EKPO-MENGEЕдиница измерения цены заказа на поставку EKPO-BPRMEЕдиница цены EKPO-PEINHКонец времени выполнения EKKO-KDATE
    6. Если EKKO-WAERS не отличается от валюты БЕ   (t001-waers при t001-bukrs=t001k-bukrs  при t001k-bwkey= ekpo-werks) , то
    7. Начало срока действия EKKO-KDATB
    8. Цена нетто в документе закупки в валюте документа EKPO-NETPR
    9. ЕИ заказа на поставку EKPO-MEINS
    10. Номер инфо-записи закупки EKPO-INFNR
    11. Номер позиции документа закупки EKPO-EBELP
    12. Тип документа закупки EKPO- BSTYP= «K»   ( K Контракт)

7* = ekpo-netpr / ekpo-peinh

Если EKKO-WAERS отличается от валюты БЕ необходимо перевести эту цену в валюту БЕ:

7* = EKPO- NETPR/ EKPO- PEINH

умножить на курс валюты: TCURR-UKURS при TCURR-KURST=M, TCURR –FCURR= EKKO-WAERS,

TCURR –TCURR= T001-   waers при TCURR-gdatu равно на сегодняшний день (равно текущей дате или самой поздней дате).

Если цена выбрана и цена по полю 6* <> 0,00, пишем ее в таблицу 3*.

                Если на данном шаге цена в белорусских рублях не выбрана из договора закупки, приступаем к следующему шагу.

 Выбираются информация по материалам без остатка на заводе 1000. Берется цена последнего поступления в валюте с переводом по действующему курсу (7* таблицы)

    (если не выбрана информация в предыдущих шагах).

 

    1. Связываем таблицы MARA- MATNR и MBEW- MATNR.
    2. Проверяем наличие занчения запаса по полю MBEW-LBKUM = « » на области оценки /заводе 1000 MBEW-BWKEY= «1000» с видом оценки равным пусто   MBEW-BWTAR= « » .
    3. Если запас на 1000 заводе есть, производить расчет цены последней партии поставки.
    4. Связываем таблицы MARA- MATNR и MSEG-MATNR

Для каждого материала MATNR** из списка формируется строка по последнему поступлению по следующему алгоритму:

Формируется выборка (7* таблицы) MSEG-MBLNR*, MSEG-MJAHR* из MSEG-MKPF (связка MSEG-MKPF по MKPF-MBLNR=MSEG-MBLNR, MKPF-MJAHR=MSEG-MJAHR), где:

MSEG-MATNR = MATNR**

MKPF-BUDAT <= DATE*

MSEG-BWART = “101”

MSEG-LIFNR <> “пусто”

MSEG-SHKZG = “S” (Дебет)

MSEG-SOBKZ=” “

MSEG-EBELN, MSEG-EBELP <> “пусто”

MSEG-SMBLN = “пусто”, MSEG-SMBLP = “пусто” и не существует MSEG-MBLNR для которого MSEG-SMBLN = MSEG-MBLNR*

MSEG-KZBEW = “B”

MSEG-KZZUG = “ ”.

В данной выборке определяется строка MSEG с наибольшей датой MKPF-BUDAT <= DATE*.

    1. Связываем таблицы MSEG-EBELN= EKPO-EBELN, MSEG-EBELP= EKPO-EBELP
    2. Связываем таблицы EKKO -EBELN= EKPO-EBELN

                         Если EKKO-WAERS отличается от валюты БЕ необходимо перевести эту цену в валюту БЕ:

7* = EKPO-EFFWR / EKPO — MENGE

умножить на курс валюты: TCURR-UKURS при TCURR-KURST=M, TCURR –FCURR= EKKO-WAERS,

TCURR –TCURR= T001-   waers при TCURR-gdatu равно на дату формирования таблицы.

Если цена выбрана и цена по полю 7* <> 0,00, пишем ее в таблицу 3*.

Было:

Данные из таблицы ZVERPR_LAST_DELI.  Таблица формируется автоматически ночью. Программа обновления ZHM_ZVERPR_LAST_DELI

ММ-021- ИП-2018- Ведение разрешений на временное отступление от требований технической документации (транзакция ZAM_RAZR_V)

*&amp;---------------------------------------------------------------------*
*&amp; Report ZHM_ZVERPR_LAST_DELI
*&amp;
*&amp;---------------------------------------------------------------------*
*&amp;
*&amp;
*&amp;---------------------------------------------------------------------*
report zhm_zverpr_last_deli.
tables: zverpr_last_deli.
types: begin of ty_marc,
matnr type marc-matnr,
werks type marc-werks,
sobsl type marc-sobsl,
end of ty_marc.
types: begin of ty_mseg,
matnr type mseg-matnr,
end of ty_mseg.
data: it_mseg type table of ty_mseg,
data_update type datum,
verpr type verpr,
it_marc type sorted table of ty_marc with unique key matnr,
it_zverpr_last_deli type table of zverpr_last_deli.
field-symbols: like line of it_mseg,
like line of it_marc,
like line of it_zverpr_last_deli.
select single min( data_update ) as data_update into data_update from zverpr_last_deli.
if data_update is initial. "Если таблица пустая, берем данные за последние 2 года
call function 'MONTH_PLUS_DETERMINE'
exporting
months = '-24'
olddate = sy-datum
importing
newdate = data_update.
else.
call function 'MONTH_PLUS_DETERMINE'
exporting
months = '-1'
olddate = data_update
importing
newdate = data_update.
endif.
select * from marc into corresponding fields of table it_marc where marc~werks = '1000' and sobsl = '20'.
select * from mseg inner join mkpf on mseg~mblnr = mkpf~mblnr and mseg~mjahr = mkpf~mjahr
up to 2000000 rows into corresponding fields of table it_mseg
where mkpf~budat &gt;= data_update.
if sy-subrc = 0.
sort it_mseg.
delete adjacent duplicates from it_mseg.
loop at it_mseg assigning .
read table it_marc assigning with table key matnr = -matnr.
if is assigned. unassign .else.continue.endif.
append initial line to it_zverpr_last_deli assigning .
-matnr = -matnr.
-verpr = zhmcl_co=&gt;get_cost_last_delivery( -matnr ).
-user_change = sy-uname.
-data_change = sy-datum.
-time_change = sy-uzeit.
unassign .
endloop.
clear it_marc.
delete it_zverpr_last_deli where verpr is initial.
modify zverpr_last_deli from table it_zverpr_last_deli.
if sy-subrc = 0.
commit work and wait.
update zverpr_last_deli set data_update = sy-datum.
commit work and wait.
message 'Данные обновлены' type 'I'.
else.
message 'Ошибка обновления цен' type 'E'.
endif.
endif.
method get_cost_last_delivery. "Определение цены последней партии поставки на склады ДОП
types: begin of cena,
matnr type mbew-matnr," Номер материала
verpr type mbew-verpr," Цена
bwtar type mbew-bwtar,
del type char01,
end of cena.
types: begin of ty_mseg,
matnr type mseg-matnr,
budat type mkpf-budat,
bwart type mseg-bwart,
charg type mseg-charg,
mblnr type mseg-mblnr,
mjahr type mseg-mjahr,
zeile type mseg-zeile,
end of ty_mseg.
data: it_cena type table of cena,
v_matnr type mseg-matnr,
st_102 type i value 0,
st_101 type i value 0,
sobsl type marc-sobsl,
it_mseg type hashed table of ty_mseg with unique key matnr charg bwart mblnr mjahr zeile.
field-symbols: like line of it_cena,
like line of it_mseg.
clear: sobsl,verpr.
select single sobsl into sobsl from marc where werks = '1000' and matnr = matnr.
if sobsl = 20. "Специальный вид заготовки: 20 - заготовка на стороне
select single verpr into verpr from zverpr_last_deli where matnr = matnr and data_update = sy-datum.
if verpr is initial.
select matnr verpr bwtar from mbew into corresponding fields of table it_cena
where vprsv = 'V' and ( bklas like '10%' or bklas = '2100' ) and bwkey = '1000' and matnr = matnr.
if sy-subrc = 0.
select * from mseg inner join mkpf on mseg~mblnr = mkpf~mblnr and mseg~mjahr = mkpf~mjahr
into corresponding fields of table it_mseg where matnr = matnr and lgort like 'D%' and ( bwart = '101' or bwart = '102' ).
if sy-subrc = 0.
loop at it_cena assigning .
if strlen( -bwtar ) &lt;&gt; 10.
-del = 'X'.
endif.
endloop.
delete it_cena where bwtar(1) &lt;&gt; '0' or del = 'X'."исключить виды оценки, созданные вручную, не автоматически
"т.е, количество знаков в виде оценки должно быть =10, начинаться на ноль
sort it_cena by matnr bwtar descending.
sort it_mseg by matnr bwart descending.
clear v_matnr.
loop at it_cena assigning .
st_102 = 0. st_101 = 0.
if v_matnr = -matnr. exit. endif.
loop at it_mseg assigning where matnr = -matnr and charg = -bwtar.
if -bwart = '101'.
st_101 = st_101 + 1.
endif.
if -bwart = '102'.
st_102 = st_102 + 1.
endif.
endloop.
if ( st_102 = 0 and st_101 &gt; 0 ) or -bwtar = ''.
v_matnr = -matnr.
verpr = -verpr.
endif.
endloop.
endif.
endif.
endif.
endif.
endmethod.

Добавить комментарий