vga написал(а):
organmusic написал(а):
У кого аналогичная задача - может кто ввозьмется расшифровать алгоритм MCBA, а я б подсобил с тем что уже накопал
Там расшифровать особенно нечего. Используются s032, s031 и mbew.
st05 смотрите.
Выборки из таблиц там простые, дело в их обработке чтобы получить ДО КО шт руб с учетом переоценок
Вот начало фрагмента вычисления:
----------------- Cut ---------------------
FORM korrektur_bestandswert TABLES inttab STRUCTURE int_s000.
DATA: BEGIN OF l_korr_tab OCCURS 0,
matnr LIKE s039-matnr,
werks LIKE s039-werks,
spmon LIKE s039-spmon,
sptag LIKE s039-sptag,
spwoc LIKE s039-spwoc,
spbup LIKE s039-spbup,
mbwbest LIKE s039-mbwbest,
wbwbest LIKE s039-wbwbest,
wzubb LIKE s039-wzubb,
wzubb0 LIKE s039-wzubb, " Zugang ohne Menge
wagbb LIKE s039-wagbb,
wagbb0 LIKE s039-wagbb, " Abgang ohne Menge
mzubb LIKE s039-mzubb,
magbb LIKE s039-magbb,
mgvbr LIKE s039-mgvbr,
wgvbr LIKE s039-wgvbr,
wuvbr LIKE s039-wuvbr,
muvbr LIKE s039-muvbr,
anz TYPE i,
flg_mbwbest,
index_mbwbest TYPE i,
END OF l_korr_tab.
DATA: l_preis TYPE f,
l_preis_old TYPE f,
l_preis_vbr TYPE f,
l_int_s000 LIKE int_s000,
l_tabix LIKE sy-tabix,
l_tabix_mbew LIKE sy-tabix,
l_mbwbest_old LIKE s039-mbwbest,
l_mbwbest_lg LIKE s039-mbwbest,
l_delta_1 LIKE s039-wzubb,
l_delta_2 LIKE l_delta_1,
l_sum LIKE s039-wbwbest,
l_anz TYPE i.
CHECK va EQ true.
* Lagerort space soll erster Eintrag sein, damit auf diesen keine
* Rundungsdifferenz gebucht wird.
CASE sav_speri.
WHEN con_speri_spmon.
SORT inttab BY matnr werks spmon lgort.
WHEN con_speri_sptag.
SORT inttab BY matnr werks sptag lgort.
WHEN con_speri_spwoc.
SORT inttab BY matnr werks spwoc lgort.
WHEN con_speri_spbup.
SORT inttab BY matnr werks spbup lgort.
ENDCASE.
LOOP AT inttab ASSIGNING <int_s000>.
IF NOT l_int_s000 IS INITIAL AND
( l_int_s000-matnr NE <int_s000>-matnr OR
l_int_s000-werks NE <int_s000>-werks OR
l_int_s000-spmon NE <int_s000>-spmon OR
l_int_s000-sptag NE <int_s000>-sptag OR
l_int_s000-spwoc NE <int_s000>-spwoc OR
l_int_s000-spbup NE <int_s000>-spbup ).
APPEND l_korr_tab.
CLEAR l_korr_tab.
ENDIF.
IF l_korr_tab IS INITIAL.
MOVE-CORRESPONDING <int_s000> TO l_korr_tab.
l_korr_tab-anz = 1.
ELSE.
ADD <int_s000>-mbwbest TO l_korr_tab-mbwbest.
ADD <int_s000>-wbwbest TO l_korr_tab-wbwbest.
ADD <int_s000>-wzubb TO l_korr_tab-wzubb.
ADD <int_s000>-wagbb TO l_korr_tab-wagbb.
ADD <int_s000>-mzubb TO l_korr_tab-mzubb.
ADD <int_s000>-magbb TO l_korr_tab-magbb.
ADD <int_s000>-mgvbr TO l_korr_tab-mgvbr.
ADD <int_s000>-wgvbr TO l_korr_tab-wgvbr.
ADD <int_s000>-muvbr TO l_korr_tab-muvbr.
ADD <int_s000>-wuvbr TO l_korr_tab-wuvbr.
ADD 1 TO l_korr_tab-anz.
ENDIF.
IF NOT <int_s000>-mbwbest IS INITIAL.
l_korr_tab-flg_mbwbest = true.
MOVE l_korr_tab-anz TO l_korr_tab-index_mbwbest.
ENDIF.
l_int_s000 = <int_s000>.
ENDLOOP.
IF NOT l_korr_tab IS INITIAL.
APPEND l_korr_tab.
ENDIF.
CLEAR l_korr_tab.
CLEAR l_tabix.
LOOP AT inttab ASSIGNING <int_s000>.
sy-subrc = 0.
* Korrektureintrag, Preis und alten Preis ermitteln
WHILE sy-subrc EQ 0 AND
( l_korr_tab-matnr NE <int_s000>-matnr OR
l_korr_tab-werks NE <int_s000>-werks OR
l_korr_tab-spmon NE <int_s000>-spmon OR
l_korr_tab-sptag NE <int_s000>-sptag OR
l_korr_tab-spwoc NE <int_s000>-spwoc OR
l_korr_tab-spbup NE <int_s000>-spbup ).
ADD 1 TO l_tabix.
READ TABLE l_korr_tab INDEX l_tabix.
IF sy-subrc NE 0.
* Sollte nicht vorkommen k_nnen
EXIT.
ENDIF.
CLEAR l_sum.
CLEAR l_anz.
* Preis f_r Merkmalskombination ermitteln
* Ist das _berhaupt notwendig?
IF l_korr_tab-mbwbest IS INITIAL AND
l_korr_tab-mzubb IS INITIAL AND
l_korr_tab-magbb IS INITIAL AND
l_korr_tab-mgvbr IS INITIAL AND
l_korr_tab-muvbr IS INITIAL AND
и т д
--------- Cut ---------