Code: Alles auswählen.
*&---------------------------------------------------------------------*
*& Form GET_REQUIRED_STARTING_STOCK
*&---------------------------------------------------------------------*
* get required starting stock
*----------------------------------------------------------------------*
FORM get_required_starting_stock .
CLEAR: gt_allrecs[],
gt_intime[],
gt_outtime[],
gf_budat,
gf_abgang,
gf_zugang,
lf_endbestand,
lf_stocktd .
* get actual stock - 'today'
SELECT SINGLE labst FROM mard INTO lf_stocktd
WHERE matnr = s_matnr-low
AND werks = s_werks-low.
* get all records mseg
SELECT mblnr mjahr zeile bwart matnr werks lifnr ebeln ebelp menge meins smbln smblp sjahr FROM mseg INTO CORRESPONDING FIELDS OF TABLE gt_allrecs
WHERE xauto = space
AND matnr = s_matnr-low
AND werks = s_werks-low.
* split data - intime / outtime
LOOP AT gt_allrecs INTO gs_allrecs.
SELECT SINGLE budat FROM mkpf INTO gf_budat
WHERE mblnr = gs_allrecs-mblnr
AND mjahr = gs_allrecs-mjahr.
IF gf_budat EQ s_datum-low OR gf_budat EQ s_datum-high OR gf_budat BETWEEN s_datum-low AND s_datum-high.
APPEND gs_allrecs TO gt_intime.
ELSEIF gf_budat > s_datum-high.
APPEND gs_allrecs TO gt_outtime.
ENDIF.
CLEAR: gs_allrecs.
ENDLOOP.
LOOP AT gt_intime INTO gs_intime.
IF gs_intime-smbln NE space.
SELECT SINGLE budat FROM mkpf INTO gf_budat
WHERE mblnr = gs_intime-smbln.
ENDIF.
IF gf_budat EQ s_datum-low OR gf_budat EQ s_datum-high OR gf_budat BETWEEN s_datum-low AND s_datum-high.
ELSEIF gf_budat > s_datum-high.
DELETE gt_intime WHERE smbln = gs_intime-smbln.
ENDIF.
CLEAR: gs_intime.
ENDLOOP.
* calculate lf_endbestand
IF sy-datum EQ s_datum-low OR sy-datum EQ s_datum-high OR sy-datum BETWEEN s_datum-low AND s_datum-high.
lf_endbestand = lf_stocktd.
ELSE.
LOOP AT gt_outtime INTO gs_outtime.
SELECT SINGLE xstbw zu_ab sign FROM zmmkg_zoll INTO CORRESPONDING FIELDS OF gs_outtime_t
WHERE bwart = gs_outtime-bwart.
gs_outtime_t-mblnr = gs_outtime-mblnr.
gs_outtime_t-mjahr = gs_outtime-mjahr.
gs_outtime_t-menge = gs_outtime-menge.
APPEND gs_outtime_t TO gt_outtime_t.
CLEAR: gs_outtime.
ENDLOOP.
LOOP AT gt_outtime_t INTO gs_outtime_t.
CASE gs_outtime_t-zu_ab.
WHEN 'A'.
IF gs_outtime_t-sign EQ '-'.
gf_abgang = gf_abgang - gs_outtime_t-menge.
ELSE.
gf_abgang = gf_abgang + gs_outtime_t-menge.
ENDIF.
WHEN 'Z'.
IF gs_outtime_t-sign EQ '-'.
gf_zugang = gf_zugang - gs_outtime_t-menge.
ELSE.
gf_zugang = gf_zugang + gs_outtime_t-menge.
ENDIF.
ENDCASE.
CLEAR: gs_outtime_t.
ENDLOOP.
lf_endbestand = lf_stocktd - gf_zugang + gf_abgang.
ENDIF.
ENDFORM. " GET_REQUIRED_STARTING_STOCK
*&---------------------------------------------------------------------*
*& Form GET_ALL_RECORDS_WO_REVERSAL
*&---------------------------------------------------------------------*
* 1. GET_ALL_RECORDS_WO_REVERSAL
*----------------------------------------------------------------------*
FORM get_all_records_wo_reversal .
CLEAR: gs_intime,
lf_bwart.
* delete records with unrequired bwart
LOOP AT gt_intime INTO gs_intime.
SELECT SINGLE bwart FROM zmmkg_zoll INTO lf_bwart
WHERE bwart = gs_intime-bwart.
IF sy-subrc EQ 0.
ELSE.
DELETE gt_intime WHERE bwart = gs_intime-bwart.
ENDIF.
CLEAR: gs_intime.
ENDLOOP.
* delete storno records
LOOP AT gt_intime INTO gs_intime.
SELECT SINGLE xstbw zu_ab sign FROM zmmkg_zoll INTO CORRESPONDING FIELDS OF gs_intime
WHERE bwart = gs_intime-bwart.
MODIFY gt_intime FROM gs_intime.
IF gs_intime-xstbw EQ 'X' AND gs_intime-smbln EQ space.
APPEND gs_intime TO gt_reversal2.
ENDIF.
ENDLOOP.
DELETE gt_intime WHERE xstbw NE space.
ENDFORM. " GET_ALL_RECORDS_WO_REVERSAL
*&---------------------------------------------------------------------*
*& Form GET_ALL_REVERSAL_W_REFERENCE
*&---------------------------------------------------------------------*
* 2. GET_ALL_REVERSAL_W_REFERENCE
*----------------------------------------------------------------------*
FORM get_all_reversal_w_reference .
* delete records with unrequired bwart
LOOP AT gt_allrecs INTO gs_allrecs.
SELECT SINGLE bwart FROM zmmkg_zoll INTO lf_bwart
WHERE bwart = gs_allrecs-bwart.
IF sy-subrc EQ 0.
ELSE.
DELETE gt_allrecs WHERE bwart = gs_allrecs-bwart.
ENDIF.
CLEAR: gs_allrecs.
ENDLOOP.
* get storno records with reference outtime
LOOP AT gt_allrecs INTO gs_allrecs.
SELECT SINGLE xstbw zu_ab sign FROM zmmkg_zoll INTO CORRESPONDING FIELDS OF gs_allrecs
WHERE bwart = gs_allrecs-bwart.
MODIFY gt_allrecs FROM gs_allrecs.
IF gs_allrecs-xstbw EQ 'X' AND gs_allrecs-smbln NE space.
APPEND gs_intime TO gt_reversal1.
ENDIF.
ENDLOOP.
ENDFORM. " GET_ALL_REVERSAL_W_REFERENCECode: Alles auswählen.
LOOP AT gt_intime INTO gs_intime.
lf_new = gs_intime-budat+4(2).
IF NOT lf_old IS INITIAL AND lf_old NE lf_new.
gs_intime-labst = gf_abgang.
gs_intime-menge = gf_zugang.
gs_intime-budat = lf_old.
APPEND gs_intime TO lt_test.
CLEAR: gf_zugang,
gf_abgang.
ELSE.
IF gs_intime-zu_ab EQ 'Z'.
gf_zugang = gf_zugang + gs_intime-menge.
ELSE.
gf_abgang = gf_abgang + gs_intime-menge.
ENDIF.
ENDIF.
lf_old = gs_intime-budat+4(2).
CLEAR: gs_intime.
ENDLOOP.