Народ! Я тоже долго ковырялся, есть кое-какие наработки по этому поводу. Хотелось бы узнать, нужны ли они кому-нить, кроме меня. Может, кто даст свою оценку моим стараниям...
Code:
FUNCTION GET_STOCK_TABLE.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" REFERENCE(P_WERKS) LIKE MARD-WERKS DEFAULT '2000'
*" REFERENCE(P_CHARG) LIKE MCHB-CHARG OPTIONAL
*" REFERENCE(P_MATNR) LIKE MARA-MATNR OPTIONAL
*" REFERENCE(P_LFGJA) LIKE MARD-LFGJA OPTIONAL
*" REFERENCE(P_LFMON) LIKE MARD-LFMON OPTIONAL
*" REFERENCE(P_STOCK_STRUC) TYPE ZSTOCK OPTIONAL
*" TABLES
*" P_STOCK STRUCTURE ZSTOCK
*" LGORT STRUCTURE BAPI_RANGESBUKRS OPTIONAL
*" EXCEPTIONS
*" E_NO_MATERIAL
*" E_NO_DATA_FOUND
*" E_OBLIGATORIES_MISSING
*"----------------------------------------------------------------------
data: vlfgj(4) type n, vlfmo(2), vmatn type matnr, done.
data: vlgor(4), vstpr like mbew-stprs, vverp like mbew-verpr.
data: vwerk type werks_d, vchar type charg_d.
data: stock type standard table of zstock
with header line initial size 50.
data: begin of slgor occurs 0,
sign,
option(2),
low type lgort_d,
high type lgort_d,
end of slgor.
clear stock.
refresh slgor.
vmatn = p_matnr.
vwerk = p_werks.
vchar = p_charg.
vlfgj = p_lfgja.
vlfmo = p_lfmon.
* здесь я определяю цену периода проводки:
* цель фм и заключается в запасах/их стоимости в периоде
stock-matnr = vmatn.
stock-werks = vwerk.
stock-charg = vchar.
endif.
* если тип оценки пустой, то ищем запас только в таблицах общих запасов
if vchar is initial.
* выборка из таблицы истории запасов
select * into corresponding fields of stock
from mardh
where matnr = vmatn and werks = vwerk
and lgort in lgort
and lfgja ge vlfgj and lfmon ge vlfmo
* and labst > 0
order by lgort lfgja lfmon.
* если склад не равен сохраненному складу, значит - новый блок записей
if vlgor ne stock-lgort.
* сохранить новое значение склада и очистить признак обработки блока
vlgor = stock-lgort.
clear done.
endif.
if done is initial.
done = 'X'.
append stock.
slgor-sign = 'I'.
slgor-option = 'EQ'.
slgor-low = vlgor.
append slgor.
endif.
endselect.
* выборка текущего запаса
if stock[] is initial.
select * into corresponding fields of stock from mard
where matnr = vmatn and werks = vwerk
and lgort in lgort and labst > 0.
append stock.
endselect.
else.
select * into corresponding fields of stock from mard
where matnr = vmatn and werks = vwerk
and lgort not in slgor and lgort in lgort
and labst > 0.
append stock.
endselect.
endif.
else.
clear done.
clear vlgor.
* выборка из таблицы истории запасов
select lgort lfgja lfmon clabs
into (stock-lgort, stock-lfgja, stock-lfmon, stock-labst)
from mchbh
where matnr = vmatn and werks = vwerk and charg = vchar
and lgort in lgort and lfgja ge vlfgj and lfmon ge vlfmo
* and clabs > 0
order by lgort lfgja lfmon.
* если склад не равен сохраненному складу, значит - новый блок записей
if vlgor ne stock-lgort.
* сохранить новое значение склада и очистить признак обработки блока
vlgor = stock-lgort.
clear done.
endif.
if done is initial.
done = 'X'.
slgor-sign = 'I'.
slgor-option = 'EQ'.
slgor-low = vlgor.
append slgor.
append stock.
endif.
endselect.
* выборка текущего запаса
if stock[] is initial.
select lgort lfgja lfmon clabs
into (stock-lgort, stock-lfgja, stock-lfmon, stock-labst)
from mchb
where matnr = vmatn and werks = vwerk
and charg = vchar and lgort in lgort
and clabs > 0.
append stock.
endselect.
else.
select lgort lfgja lfmon clabs
into (stock-lgort, stock-lfgja, stock-lfmon, stock-labst)
from mchb
where matnr = vmatn and werks = vwerk
and charg = vchar
and lgort not in slgor and lgort in lgort
and clabs > 0.
append stock.
endselect.
endif.
endif.
loop at stock where labst eq 0.
delete table stock.
endloop.
if not stock[] is initial.
append lines of stock to p_stock.
endif.
ENDFUNCTION.