티스토리 툴바


밑에 글 수정할까 하다가 새로운 글로 다시 올립니다. 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.
저작자 표시
Posted by 한상열

트랙백 주소 :: http://erpsarang.tistory.com/trackback/12 관련글 쓰기

댓글을 달아 주세요

구축된 시스템마다 조금씩 틀릴 수 있겠지만, 일반적인 플랜트 재고 History를 알아내는 프로그램입니다. 로직은 MBEW, MBEWH를 찾아서 기간로직을 구현하면 됩니다.



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.


*---- 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.
*---- 1. 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.
*---- 2. 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.
*---- 3. sort
  SORT it_val_cur BY matnr bwkey.
  SORT it_val_his BY matnr bwkey lfgja lfmon.
*---- 4. logic : insert month data which were omitted in history
  LOOP AT it_val_cur.
    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.
      
" if current, get current data
      
IF cur_lfgja = it_val_cur-lfgja AND
         cur_lfmon = it_val_cur-lfmon.
        
EXIT.
      
ENDIF.
      
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 before data if omitted
        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.
      
ENDIF.
      cur_lfmon = cur_lfmon + 
1.
    
ENDDO.
    
MOVE-CORRESPONDING it_val_cur TO it_val_ins.
    
APPEND it_val_ins.  CLEAR it_val_ins.
  ENDLOOP.
*---- 5. 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.
저작자 표시
Posted by 한상열

트랙백 주소 :: http://erpsarang.tistory.com/trackback/11 관련글 쓰기

댓글을 달아 주세요

배부 로직

분류없음 2009/11/19 10:48
101을 100개에 고르게 나눠줄려면? 전기세를 각 코스트센터의 매출 비율에 따라 나눠줄려면? 이처럼 전기세, 전화비, 수돗세, 광열비 등을 각 부서에 합리적으로 할당하는 걸 배부라 하죠. 이때 배부를 하다보면 나머지 금액이 생기면 어쩔거냐란 질문이 꼬리표처럼 나오는데, 다음 로직은 그와 같은 질문에 대한 아주 표준적인 답입니다.

REPORT  ytest_syh_003.

*---- screen
PARAMETERS : p_dvend TYPE i DEFAULT 101,
             p_opera TYPE c DEFAULT '%',
             p_dvsor TYPE i DEFAULT 100.

*---- variables
TYPES      : BEGIN OF ty_distributed,
               id  TYPE char10,
               val TYPE i,
             END OF ty_distributed.
DATA       : it_distributed TYPE TABLE OF ty_distributed WITH HEADER LINE.

DATA       : v_accumulated TYPE i.

*---- make internal table
DO p_dvsor TIMES.
  it_distributed-id = sy-index.  APPEND it_distributed.
ENDDO.
SORT it_distributed BY id.

*---- normal distribution logic
LOOP AT it_distributed.
  it_distributed-val = ( p_dvend - v_accumulated ) / p_dvsor.
  v_accumulated = v_accumulated + it_distributed-val.
  p_dvsor = p_dvsor - 
1.
  
MODIFY it_distributed.  CLEAR it_distributed.
ENDLOOP.

*---- output
LOOP AT it_distributed.
  WRITE : /01 it_distributed-id,
           11 it_distributed-val.
ENDLOOP.
저작자 표시
Posted by 한상열

트랙백 주소 :: http://erpsarang.tistory.com/trackback/10 관련글 쓰기

댓글을 달아 주세요

이전페이지 1 2 3 4 다음페이지

태그목록

사이드바 열기