밑에 글 수정할까 하다가 새로운 글로 다시 올립니다. MBEW, MBEWH 테이블의 속성을 더 파악해보니, 아래 쏘스는 틀렸습니다. MBEWH 해당월 데이타가 없으면, MBEWH의 전월을 Copy해서 해당월 데이타로 인식했는데, 그게 아니더라구요. 새로운 쏘스 참고하시기 바랍니다.
REPORT ytest_han_002.
*---- variables -------------------------------------------------------*
TABLES : mbew. "General Material Data
TYPES : BEGIN OF ty_val,
matnr TYPE matnr,
bwkey TYPE bwkey,
lfgja TYPE lfgja,
lfmon TYPE lfmon,
meins TYPE meins,
waers TYPE waers,
lbkum TYPE lbkum,
salk3 TYPE salk3,
END OF ty_val.
DATA : it_val_cur TYPE TABLE OF ty_val WITH HEADER LINE,
it_val_his TYPE TABLE OF ty_val WITH HEADER LINE,
it_val_ins TYPE TABLE OF ty_val WITH HEADER LINE.
DATA : cur_lfgja TYPE lfgja,
cur_lfmon TYPE lfmon,
cal_lfgja TYPE lfgja,
cal_lfmon TYPE lfmon,
to_lfgja TYPE lfgja,
to_lfmon TYPE lfmon.
DATA : l_stop TYPE c.
*---- initial screen --------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS : s_matnr FOR mbew-matnr,
s_bwkey FOR mbew-bwkey.
SELECTION-SCREEN END OF BLOCK b1.
*---- select data -----------------------------------------------------*
START-OF-SELECTION.
*---- 01. current stock
SELECT w~matnr w~bwkey w~lfgja w~lfmon
m~meins c~waers w~lbkum w~salk3
INTO CORRESPONDING FIELDS OF TABLE it_val_cur
FROM mbew AS w INNER JOIN mara AS m ON w~matnr EQ m~matnr
INNER JOIN t001k AS k ON w~bwkey EQ k~bwkey
INNER JOIN t001 AS c ON k~bukrs EQ c~bukrs
WHERE w~matnr IN s_matnr
AND w~bwkey IN s_bwkey.
*---- 02. closed(history) stock
SELECT w~matnr w~bwkey w~lfgja w~lfmon
m~meins c~waers w~lbkum w~salk3
INTO CORRESPONDING FIELDS OF TABLE it_val_his
FROM mbewh AS w INNER JOIN mara AS m ON w~matnr EQ m~matnr
INNER JOIN t001k AS k ON w~bwkey EQ k~bwkey
INNER JOIN t001 AS c ON k~bukrs EQ c~bukrs
WHERE w~matnr IN s_matnr
AND w~bwkey IN s_bwkey.
*---- 03. sort
SORT it_val_cur BY matnr bwkey.
SORT it_val_his BY matnr bwkey lfgja lfmon.
*---- 04. to date setting
to_lfgja = sy-datum(4).
to_lfmon = sy-datum+4(2).
*---- 05. logic : insert month data which were omitted in history
LOOP AT it_val_cur.
CLEAR l_stop.
CLEAR it_val_his.
" finds 1st closed(history) data
READ TABLE it_val_his WITH KEY matnr = it_val_cur-matnr
bwkey = it_val_cur-bwkey
BINARY SEARCH.
cur_lfgja = it_val_his-lfgja.
cur_lfmon = it_val_his-lfmon.
DO. " loop from 1st history to current month
IF cur_lfmon = '13'.
cur_lfgja = cur_lfgja + 1.
cur_lfmon = '01'.
ELSE.
"
ENDIF.
*---- 06. read history
READ TABLE it_val_his WITH KEY matnr = it_val_cur-matnr
bwkey = it_val_cur-bwkey
lfgja = cur_lfgja
lfmon = cur_lfmon
BINARY SEARCH.
IF sy-subrc NE 0.
" copy month data if omitted
CLEAR : cal_lfgja, cal_lfmon.
cal_lfgja = cur_lfgja.
cal_lfmon = cur_lfmon + 1.
DO.
IF cal_lfmon = '13'.
cal_lfgja = cal_lfgja + 1.
cal_lfmon = '01'.
ELSE.
"
ENDIF.
IF cal_lfgja = to_lfgja AND
cal_lfmon = to_lfmon.
*---- 07. read mbew historical current
READ TABLE it_val_cur WITH KEY matnr = it_val_cur-matnr
bwkey = it_val_cur-bwkey
BINARY SEARCH.
*---- 08. repeat to current period
DO. "
IF cur_lfmon = '13'.
cur_lfgja = cur_lfgja + 1.
cur_lfmon = '01'.
ELSE.
"
ENDIF.
it_val_cur-lfgja = cur_lfgja.
it_val_cur-lfmon = cur_lfmon.
MOVE-CORRESPONDING it_val_cur TO it_val_ins.
APPEND it_val_ins.
" if current, get current data
IF cur_lfgja = to_lfgja AND
cur_lfmon = to_lfmon.
EXIT.
ENDIF.
l_stop = 'X'.
cur_lfmon = cur_lfmon + 1.
ENDDO.
EXIT.
ENDIF.
*---- 09. read history(+1)
READ TABLE it_val_his WITH KEY matnr = it_val_cur-matnr
bwkey = it_val_cur-bwkey
lfgja = cal_lfgja
lfmon = cal_lfmon
BINARY SEARCH.
IF sy-subrc EQ 0.
it_val_his-lfgja = cur_lfgja.
it_val_his-lfmon = cur_lfmon.
MOVE-CORRESPONDING it_val_his TO it_val_ins.
APPEND it_val_ins. CLEAR it_val_ins.
EXIT.
ELSE.
cal_lfmon = cal_lfmon + 1.
ENDIF.
ENDDO.
ELSE.
"
ENDIF.
" if current, get current data
IF cur_lfgja = to_lfgja AND
cur_lfmon = to_lfmon.
EXIT.
ENDIF.
IF l_stop = 'X'.
EXIT.
ENDIF.
cur_lfmon = cur_lfmon + 1.
ENDDO.
ENDLOOP.
*---- 10. merge
APPEND LINES OF it_val_ins TO it_val_his.
SORT it_val_his BY matnr bwkey lfgja lfmon.
*---- output ----------------------------------------------------------*
END-OF-SELECTION.
LOOP AT it_val_his.
WRITE : /1 it_val_his-matnr,
it_val_his-bwkey,
it_val_his-lfgja,
it_val_his-lfmon,
it_val_his-meins,
it_val_his-waers,
it_val_his-lbkum UNIT it_val_his-waers,
it_val_his-salk3 CURRENCY it_val_his-waers.
ENDLOOP.
*---- variables -------------------------------------------------------*
TABLES : mbew. "General Material Data
TYPES : BEGIN OF ty_val,
matnr TYPE matnr,
bwkey TYPE bwkey,
lfgja TYPE lfgja,
lfmon TYPE lfmon,
meins TYPE meins,
waers TYPE waers,
lbkum TYPE lbkum,
salk3 TYPE salk3,
END OF ty_val.
DATA : it_val_cur TYPE TABLE OF ty_val WITH HEADER LINE,
it_val_his TYPE TABLE OF ty_val WITH HEADER LINE,
it_val_ins TYPE TABLE OF ty_val WITH HEADER LINE.
DATA : cur_lfgja TYPE lfgja,
cur_lfmon TYPE lfmon,
cal_lfgja TYPE lfgja,
cal_lfmon TYPE lfmon,
to_lfgja TYPE lfgja,
to_lfmon TYPE lfmon.
DATA : l_stop TYPE c.
*---- initial screen --------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS : s_matnr FOR mbew-matnr,
s_bwkey FOR mbew-bwkey.
SELECTION-SCREEN END OF BLOCK b1.
*---- select data -----------------------------------------------------*
START-OF-SELECTION.
*---- 01. current stock
SELECT w~matnr w~bwkey w~lfgja w~lfmon
m~meins c~waers w~lbkum w~salk3
INTO CORRESPONDING FIELDS OF TABLE it_val_cur
FROM mbew AS w INNER JOIN mara AS m ON w~matnr EQ m~matnr
INNER JOIN t001k AS k ON w~bwkey EQ k~bwkey
INNER JOIN t001 AS c ON k~bukrs EQ c~bukrs
WHERE w~matnr IN s_matnr
AND w~bwkey IN s_bwkey.
*---- 02. closed(history) stock
SELECT w~matnr w~bwkey w~lfgja w~lfmon
m~meins c~waers w~lbkum w~salk3
INTO CORRESPONDING FIELDS OF TABLE it_val_his
FROM mbewh AS w INNER JOIN mara AS m ON w~matnr EQ m~matnr
INNER JOIN t001k AS k ON w~bwkey EQ k~bwkey
INNER JOIN t001 AS c ON k~bukrs EQ c~bukrs
WHERE w~matnr IN s_matnr
AND w~bwkey IN s_bwkey.
*---- 03. sort
SORT it_val_cur BY matnr bwkey.
SORT it_val_his BY matnr bwkey lfgja lfmon.
*---- 04. to date setting
to_lfgja = sy-datum(4).
to_lfmon = sy-datum+4(2).
*---- 05. logic : insert month data which were omitted in history
LOOP AT it_val_cur.
CLEAR l_stop.
CLEAR it_val_his.
" finds 1st closed(history) data
READ TABLE it_val_his WITH KEY matnr = it_val_cur-matnr
bwkey = it_val_cur-bwkey
BINARY SEARCH.
cur_lfgja = it_val_his-lfgja.
cur_lfmon = it_val_his-lfmon.
DO. " loop from 1st history to current month
IF cur_lfmon = '13'.
cur_lfgja = cur_lfgja + 1.
cur_lfmon = '01'.
ELSE.
"
ENDIF.
*---- 06. read history
READ TABLE it_val_his WITH KEY matnr = it_val_cur-matnr
bwkey = it_val_cur-bwkey
lfgja = cur_lfgja
lfmon = cur_lfmon
BINARY SEARCH.
IF sy-subrc NE 0.
" copy month data if omitted
CLEAR : cal_lfgja, cal_lfmon.
cal_lfgja = cur_lfgja.
cal_lfmon = cur_lfmon + 1.
DO.
IF cal_lfmon = '13'.
cal_lfgja = cal_lfgja + 1.
cal_lfmon = '01'.
ELSE.
"
ENDIF.
IF cal_lfgja = to_lfgja AND
cal_lfmon = to_lfmon.
*---- 07. read mbew historical current
READ TABLE it_val_cur WITH KEY matnr = it_val_cur-matnr
bwkey = it_val_cur-bwkey
BINARY SEARCH.
*---- 08. repeat to current period
DO. "
IF cur_lfmon = '13'.
cur_lfgja = cur_lfgja + 1.
cur_lfmon = '01'.
ELSE.
"
ENDIF.
it_val_cur-lfgja = cur_lfgja.
it_val_cur-lfmon = cur_lfmon.
MOVE-CORRESPONDING it_val_cur TO it_val_ins.
APPEND it_val_ins.
" if current, get current data
IF cur_lfgja = to_lfgja AND
cur_lfmon = to_lfmon.
EXIT.
ENDIF.
l_stop = 'X'.
cur_lfmon = cur_lfmon + 1.
ENDDO.
EXIT.
ENDIF.
*---- 09. read history(+1)
READ TABLE it_val_his WITH KEY matnr = it_val_cur-matnr
bwkey = it_val_cur-bwkey
lfgja = cal_lfgja
lfmon = cal_lfmon
BINARY SEARCH.
IF sy-subrc EQ 0.
it_val_his-lfgja = cur_lfgja.
it_val_his-lfmon = cur_lfmon.
MOVE-CORRESPONDING it_val_his TO it_val_ins.
APPEND it_val_ins. CLEAR it_val_ins.
EXIT.
ELSE.
cal_lfmon = cal_lfmon + 1.
ENDIF.
ENDDO.
ELSE.
"
ENDIF.
" if current, get current data
IF cur_lfgja = to_lfgja AND
cur_lfmon = to_lfmon.
EXIT.
ENDIF.
IF l_stop = 'X'.
EXIT.
ENDIF.
cur_lfmon = cur_lfmon + 1.
ENDDO.
ENDLOOP.
*---- 10. merge
APPEND LINES OF it_val_ins TO it_val_his.
SORT it_val_his BY matnr bwkey lfgja lfmon.
*---- output ----------------------------------------------------------*
END-OF-SELECTION.
LOOP AT it_val_his.
WRITE : /1 it_val_his-matnr,
it_val_his-bwkey,
it_val_his-lfgja,
it_val_his-lfmon,
it_val_his-meins,
it_val_his-waers,
it_val_his-lbkum UNIT it_val_his-waers,
it_val_his-salk3 CURRENCY it_val_his-waers.
ENDLOOP.




댓글을 달아 주세요