Select 심화 과정 소스

Jinsu Park (James)·2019년 12월 10일
2

ABAP

목록 보기
1/3

REPORT ZETC_1607.

TABLES : EKPO.

SELECT-OPTIONS : S_AEDAT FOR EKPO-AEDAT.

PARAMETERS : P_HAVE RADIOBUTTON GROUP G1.
PARAMETERS : P_SUB RADIOBUTTON GROUP G1.
PARAMETERS : P_EXIST RADIOBUTTON GROUP G1.
PARAMETERS : P_ALL RADIOBUTTON GROUP G1.
PARAMETERS : P_MAC RADIOBUTTON GROUP G1.
PARAMETERS : P_FORM RADIOBUTTON GROUP G1.
PARAMETERS : P_SYMB RADIOBUTTON GROUP G1.

START-OF-SELECTION.

DATA : LT_EKKO LIKE TABLE OF EKKO WITH HEADER LINE.
DATA : LT_EKPO LIKE TABLE OF EKPO WITH HEADER LINE.

CASE 'X'. " X 가 P_HAVE 일때 . 이런 방법으로 코딩도 가능하다.

WHEN  P_HAVE.

  DATA : BEGIN OF LT_SUM OCCURS 0,
              MATNR LIKE EKPO-MATNR,
              WERKS LIKE EKPO-WERKS,
              MENGE LIKE EKPO-MENGE,
            END OF LT_SUM.

  SELECT  MATNR WERKS SUM( MENGE )                     " menge 수량의 합계도 포함 .
    INTO TABLE LT_SUM
    FROM EKPO
    UP TO 100 ROWS                                                    " 수량이 너무 많아 100개까지만 가져온다는 뜻
    GROUP BY MATNR WERKS                                              " 그룹을 지정해줌.
            HAVING SUM( MENGE ) > 1000.                       "  수량합계가  1000 이상인 것만 가져온다는 having 구문 .



WHEN P_SUB .

  SELECT  MATNR WERKS SUM( MENGE )
    INTO TABLE LT_SUM
    FROM EKPO  AS A
    UP TO 100 ROWS
    WHERE MATNR IN ( SELECT MATNR                            "  서브커리로 조건을 더 디테일하게 함.       /    IN  말고  =  를 사용하면 데이터가 1대1 상응한다는 뜻이라서 데이터가 2개이상 있으면 덤프가 남.
                                    FROM MARA
                                    WHERE MATKL = '002' ")              " 자재그룹 002 인 것들만 발췌해라 .
                                    AND MATNR = A~MATNR  )         "  EKPO 안에 있는 자재번호만 가져온다는 뜻.

    GROUP BY MATNR WERKS      " 그룹을 지정해줌.
            HAVING SUM( MENGE ) > 1000.

  BREAK-POINT.


WHEN P_EXIST.

  SELECT  MATNR WERKS SUM( MENGE )
    INTO TABLE LT_SUM
    FROM EKPO  AS A
    UP TO 100 ROWS
    WHERE EXISTS ( SELECT MANDT                             "   EXISTS 명령어를 써서  존재여부만 확인한다는 뜻. + 필드 이름도 상관이 없음 . 아무거나 쓰고 존재 여부만 확인하면 되기 때문에.
                                    FROM MARA
                                    WHERE MATKL = '002' ")
                                    AND MATNR = A~MATNR  )

    GROUP BY MATNR WERKS      " 그룹을 지정해줌.
            HAVING SUM( MENGE ) > 1000.

  BREAK-POINT.

WHEN P_ALL.                                                             "  테이블 전체에 조건을 걸때

  SELECT *
    INTO TABLE LT_EKKO                                            " 5000개의 주문번호가 인터널테이블에 담김.( 헤더정보가)
    FROM EKKO
    UP TO 5000 ROWS.

  CHECK SY-SUBRC EQ 0.                                    "   중요함!
  •      LOOP AT LT_EKKO.                                              "  LOOP 을 돌리면서 추가로 발췌가 가능했다.
  •       한번에 발췌가 불가능한지 보여줌 / EKKO 위에
  •       EKPO 에 아이템 테이블에 데이터를 넣는데 EKKO 에서 구매번호를 기준으로 가져올 때, EKKO 의 전체 엔트리를 가져와서 조건을 건다음에 EKPO 에  INTO 할  수 있다.
    
    SELECT *
      INTO TABLE LT_EKPO                                       "   INTO 말고 APPENDIND 도 가능하다.
      FROM EKPO                                                      " 아이템 데이터를 담으려고 함
      FOR ALL ENTRIES IN LT_EKKO                            "   전체를 발췌 후 다음으로 조건을 걸고 싶을때 사용.
      WHERE EBELN = LT_EKKO-EBELN.
    
    BREAK-POINT.

    WHEN P_SYMB.

* field symbol

  DATA : BEGIN OF LT_SYM OCCURS 0,
             YEAR TYPE CHAR04,
             MONTH01 TYPE I,
             MONTH02 TYPE I,
             MONTH03 TYPE I,
             MONTH04 TYPE I,
             MONTH05 TYPE I,
             MONTH06 TYPE I,
             MONTH07 TYPE I,
             MONTH08 TYPE I,
             MONTH09 TYPE I,
             MONTH10 TYPE I,
             MONTH11 TYPE I,
             MONTH12 TYPE I,
             SUM TYPE I,
           END OF LT_SYM.

  LOOP AT LT_EKPO.                                                " 년도, 월 필드에다가 카운팅   1씩 셀거다.
    LT_SYM-YEAR = LT_EKPO-AEDAT(4).                   "  aedat 에서 4자리를 짤라서 사용.
    LT_SYM-SUM = 1.                                                    "  1개씩 + 더한다.

    DATA : LV_FLD TYPE CHAR30.                                          "  대략/ 필드이름 지정.
    FIELD-SYMBOLS : <FS_FLD>.
    CONCATENATE 'LT_SYM-MONTH' LT_EKPO-AEDAT+4(2)           " 필드이름이 같은 ''LT_SYM-MONTH' 을 쓰고 뒤에 01, 02 는 ' LT_EKPO-AEDAT+4(2) '  로 카운팅해준다.

        INTO LV_FLD.
    ASSIGN (LV_FLD) TO <FS_FLD>.
    <FS_FLD> = 1 .
  •      CASE LT_EKPO-AEDAT+4(2).
  •          WHEN '01'.
  •             LT_SYM-MONTH01 = 1.
  •            WHEN '02'.
  •              LT_SYM-MONTH02 = 1.
  •                WHEN '03'.
  •              LT_SYM-MONTH03 = 1.
  •      ....12개
    
      COLLECT LT_SYM.
      CLEAR LT_SYM.
    
    ENDLOOP.
    
    BREAK-POINT.
  •        ENDLOOP.
    WHEN P_MAC.

*ALV data declarations

  TYPE-POOLS SLIS.

  DATA: FIELDCATALOG TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE.

  "  매크로 이용해서 alv 사용하기.

  DEFINE MAKE_FCAT.     " 총 8개 매크로 가능. &1, & 2 ...

    FIELDCATALOG-FIELDNAME   = &1.
    FIELDCATALOG-SELTEXT_M   = &2.
    FIELDCATALOG-COL_POS     = &3.

    APPEND FIELDCATALOG TO FIELDCATALOG.      "   FIELDCATALOG 에  데이터를 넣어준다.
    CLEAR  FIELDCATALOG.

  END-OF-DEFINITION.

  "   매크로는 디버깅이 걸리지 않는다. 참고해두자 !
  MAKE_FCAT 'EBELN' 'Purchase Order' 0.               "   make_fcat 라는 문법으로 사용 가능하다.
  MAKE_FCAT 'EBELP' 'PO Item' 1.
  MAKE_FCAT 'STATU' 'Status' 2.


  BREAK-POINT.
  • perform 을 이용한 매크로
    PERFORM MAKE_FCAT USING 'EBELN' 'Purchase Order' 1. " 만드는 과정
    PERFORM MAKE_FCAT USING 'EBVLN' 'PurchasSe Order' 2. " 만드는 과정
    PERFORM MAKE_FCAT USING 'EBELK' 'Purchase OrdDDer' 0. " 만드는 과정

    BREAK-POINT.

*BREAK-POINT.

  •                밑에 처럼 하나하나 다  코딩은 되지만 재사용성이 없기에 define 으로 지정해서 코딩해줌.
  •  FIELDCATALOG-FIELDNAME   = 'EBELN'.
  •  FIELDCATALOG-SELTEXT_M   = 'Purchase Order'.
  •  FIELDCATALOG-COL_POS     = 0.
  •  APPEND FIELDCATALOG TO FIELDCATALOG.
  •  CLEAR  FIELDCATALOG.
  •  FIELDCATALOG-FIELDNAME   = 'EBELP'.
  •  FIELDCATALOG-SELTEXT_M   = 'PO Item'.
  •  FIELDCATALOG-COL_POS     = 1.
  •  APPEND FIELDCATALOG TO FIELDCATALOG.
  •  CLEAR  FIELDCATALOG.
  •  FIELDCATALOG-FIELDNAME   = 'STATU'.
  •  FIELDCATALOG-SELTEXT_M   = 'Status'.
  •  FIELDCATALOG-COL_POS     = 2.
  •  APPEND FIELDCATALOG TO FIELDCATALOG.
  •  CLEAR  FIELDCATALOG.

ENDCASE.

&---------------------------------------------------------------------
& Form MAKE_FCAT
&---------------------------------------------------------------------*

  •   text

    ----------------------------------------------------------------------

  •  -->P_0275   text
  •  -->P_0276   text
  •  -->P_0      text

    ----------------------------------------------------------------------
    FORM MAKE_FCAT USING P1 P2 P3 .

    FIELDCATALOG-FIELDNAME = P1.
    FIELDCATALOG-SELTEXT_M = P2.
    FIELDCATALOG-COL_POS = P3.

    APPEND FIELDCATALOG TO FIELDCATALOG. " FIELDCATALOG 에 데이터를 넣어준다.
    CLEAR FIELDCATALOG.

ENDFORM. " MAKE_FCAT

profile
JS ABAP collection

1개의 댓글

comment-user-thumbnail
2019년 12월 10일

좋은 정보 감사해요!

답글 달기