Выяснилось, что VPRS работает только по MBEW, т.е. вы получите себестоимость на уровне Область оценки/Вида оценки обычного запаса. Для особых запасов (Q - Запас проекта(таб.QBEW), E - Запас под заказ клиента(таб.EBEW)) ОНО НЕ РАБОТАЕТ. Пару часов времени были убиты на написание формул для расчета стоимости условий.
Итак алгоритм (может кому и пригодится)
Для особого запаса Q
Создаем вид условия QVPR - Учетная цена 'Q'
Класс условий "В - Цены", правило расчета "С - Количество", обработка вручную невозможно, условие позиции, пересчет количества.
Расширяем структуру KOMPAZ (структура связи расчета цен для позиции заказа). Добавляем туда поля:
ZZSOBKZ - Код особого запаса
ZZPSPNR - Код СПП элемента
Запоняем их в заказе (MV45AFZZ)
Code:
FORM USEREXIT_PRICING_PREPARE_TKOMP.
MOVE VBAP-SOBKZ TO TKOMP-ZZSOBKZ.
MOVE VBAP-PS_PSP_PNR TO TKOMP-ZZPSPNR.
ENDFORM.
и в фактуре (RV60AFZZ)
Code:
FORM USEREXIT_PRICING_PREPARE_TKOMP.
DATA:
ZVBAPVB LIKE VBAPVB,
ZVBAP LIKE VBAP.
* Заполняем в структуре связи TKOMP поле ZZPSPNR (СПП-элемент)
MOVE VBRP-PS_PSP_PNR TO TKOMP-ZZPSPNR.
* Считываем позицию из заказа для переноса данных
CALL FUNCTION 'SD_VBAP_SINGLE_READ'
EXPORTING
I_VBELN = VBRP-AUBEL
I_POSNR = VBRP-AUPOS
IMPORTING
E_VBAPVB = ZVBAPVB
E_VBAP = ZVBAP
EXCEPTIONS
RECORD_NOT_FOUND = 1
OTHERS = 2.
MOVE ZVBAP-SOBKZ TO TKOMP-ZZSOBKZ.
ENDFORM.
Далее создаем предпосылку для этого вида условия
Code:
FORM KOBED_904.
perform kobed_002.
sy-subrc = 4.
check: komp-zzsobkz = 'Q'.
sy-subrc = 0.
ENDFORM.
FORM KOBEV_904.
sy-subrc = 0.
ENDFORM.
Формула для расчета стоимости
Code:
FORM FRM_KONDI_WERT_905.
DATA:
ZQBEW like QBEW.
IF KOMP-ZZPSPNR ne ''.
CALL FUNCTION 'QBEW_SINGLE_READ'
EXPORTING
MATNR = KOMP-MATNR
BWKEY = KOMP-BWKEY
BWTAR = KOMP-BWTAR
SOBKZ = 'Q'
PSPNR = KOMP-ZZPSPNR
IMPORTING
WQBEW = ZQBEW
EXCEPTIONS
WRONG_CALL = 1
NOT_FOUND = 2
OTHERS = 3.
case ZQBEW-VPRSV.
when 'V'.
xkwert = ZQBEW-VERPR * komp-mgame.
when 'S'.
xkwert = ZQBEW-STPRS * komp-mgame.
endcase.
xkomv-kbetr = ZQBEW-VERPR.
xkwert = xkwert / 1000.
ENDIF.
ENDFORM.
Для особого запаса E
Создаем вид условия EVPR - Учетная цена 'E'
Настройки те же что и для QVPR.
Далее создаем предпосылку для этого вида условия
Code:
FORM KOBED_905.
perform kobed_002.
sy-subrc = 4.
check: komp-zzsobkz = 'E'.
sy-subrc = 0.
ENDFORM.
FORM KOBEV_905.
sy-subrc = 0.
ENDFORM.
Формула для расчета стоимости
Code:
FORM FRM_KONDI_WERT_906.
DATA:
ZEBEW like EBEW.
CALL FUNCTION 'EBEW_SINGLE_READ'
EXPORTING
MATNR = KOMP-MATNR
BWKEY = KOMP-BWKEY
BWTAR = KOMP-BWTAR
SOBKZ = 'E'
VBELN = KOMP-AUBEL
POSNR = KOMP-AUPOS
IMPORTING
WEBEW = ZEBEW
EXCEPTIONS
WRONG_CALL = 1
NOT_FOUND = 2
OTHERS = 3.
case ZEBEW-VPRSV.
when 'V'.
xkwert = ZEBEW-VERPR * komp-mgame.
when 'S'.
xkwert = ZEBEW-STPRS * komp-mgame.
endcase.
xkomv-kbetr = ZEBEW-VERPR.
xkwert = xkwert / 1000.
ENDFORM.
Вот в общем то и все.
