CAFE

ABAP

Report 프로그램 예제

작성자우승권|작성시간08.10.27|조회수600 목록 댓글 0

Report 프로그램은 사용자가 입력한 조건을 가지고 데이터베이스의 테이블을 읽어 사전에 정의된 출력 형태에 따라서 화면, 파일 및 프린터로 출력하는 형태의 프로그램을 말한다.  

 

1. 개발 가이드
   1) REPORT
      프로그램의 가장 첫부분에 위치하며, 프로그램의 이름 및 옵션 사항들을 기술한다. 자세한 사항은 아래와 같다.
      ○ 기본형태
         REPORT report_name.
      ○ 옵션
         -. NO STANDARD PAGE HEADING
            : Standard page header가 출력되지 않도록 하는 옵션이다. 이 경우, 프로그램 코드에서 헤더를 정의한다.
         -. LINE-SIZE col
            : 한 라인의 칼럼수를 정의한다. 132 이하의 값을 권장한다.
         -. LINE-COUNT (m)
            : 페이지당 라인수를 지정한다.
         -. MESSAGE-ID mid
            : 프로그램에 대한 표준 message class를 지정한다.

 

2) PARAMETERS
   SELECTION-SCREEN에서 사용하는 각종 PARAMETER들을 정의한다.
   ○ 기본형태
      PARAMETERS p.
   ○ 옵션 
      -. DEFAULT f : 파라미터에 대한 기본값 f를 지정한다.
      -. TYPE typ : 파라미터의 type을 지정한다.
      -. LIKE g : 테이블의 특정 칼럼이나 이미 정의된 인터널 테이블의 특정 필드와 같은 타입임을 나타낸다. 
      -. OBLIGATORY : 반드시 입력되어야 함을 뜻한다.
      -. AS CHECKBOX : 화면에 체크 박스로 표시됨을 뜻한다.
      -. RADIOBUTTON GROUP radi : 화면상에 라디오버튼으로 표시한다.
           
3) SELECT-OPTIONS
   다양한 selection option을 정의하는데 사용된다.
   ○ 기본형태 
      SELECT-OPTIONS sel FOR f.
   ○ 옵션 
      -. DEFAULT g : 기본값을 지정하는 추가구문이다.
      -. DEFAULT g TO h : 기본값을 from ..to로 지정할때 사용한다. 
      -. OBLIGATORY : LOW 필드에 반드시 값이 입력되어야 함을 뜻한다.
      -. NO INTERVALS : 화면에 최소값을 입력할 필드만을 표시한다.


2. 샘플 프로그램

*----------------------------------------------------------------------*
*  FILE NAME : ZREPORT.TXT
*  유효 버전 : 4.0B
*----------------------------------------------------------------------*
REPORT ZREPORT    MESSAGE-ID ZZ
                  NO STANDARD PAGE HEADING
                  LINE-SIZE 210.

*----------------------------------------------------------------------*
*  TABLE 선언.
*   - 프로그램에서 사용할 테이블들을 선언한다.
*----------------------------------------------------------------------*

TABLES:  ZC100,   "전체 단가 현황
         ...
         EQUP.

*----------------------------------------------------------------------*
*  DATA DEFINITION : INTERNAL TABLE
*   - INTERNAL TABLE 정의시 OCCURS는 평균 ACCESS 건수 만큼 정의
*   - 최대치로 정의하고 사용하지 않으면 MEMORY의 낭비 발생함.
*----------------------------------------------------------------------*
* 독립적인 INTERNAL TABLE 정의 SECTION
*----------------------------------------------------------------------*
DATA:  BEGIN  OF  INT_TAB  OCCURS  200,
         MATNR    LIKE  ZC100-MATNR,
         PSTYP    LIKE  ZC100-PSTYP,
         DOM_EXP  LIKE  ZC100-DOM_EXP,
         LIFNR    LIKE  ZC100-LIFNR,
         WERKS    LIKE  ZC100-WERKS,
         ZQUOTE   LIKE  EQUP-QUOTE,
       END  OF  INT_TAB.
*----------------------------------------------------------------------*
* 기정의된 STRUCTURE를 포함한 INTERNAL TABLE 정의 SECTION
*----------------------------------------------------------------------*
DATA:  BEGIN  OF  TMP_DATA  OCCURS  100.
         INCLUDE  STRUCTURE  ZC100.
DATA:    NNETPR(16)     TYPE  P  DECIMALS  5.  
DATA:    KNETPR(16)     TYPE  P  DECIMALS  5.  
DATA:  END  OF  TMP_DATA.
*----------------------------------------------------------------------*
* 기정의된 INTERNAL TABLE(TMP_DATA) 과 같은
* 또 다른 INTERNAL TABLE(TMP1_TAB) 정의 방법
*----------------------------------------------------------------------*
* 방법1
*----------------------------------------------------------------------*
DATA:  TMP1_TAB  LIKE  TMP_DATA OCCURS  100  WITH  HEADER  LINE.

*----------------------------------------------------------------------*
* 방법2
*----------------------------------------------------------------------*
DATA:  BEGIN  OF  TMP2_DATA  OCCURS  100.
         INCLUDE  STRUCTURE  ZC100.
DATA:    NNETPR(16)     TYPE  P  DECIMALS  5.   
DATA:    KNETPR(16)     TYPE  P  DECIMALS  5.   
DATA:  END  OF  TMP2_DATA.

*----------------------------------------------------------------------*
*  DATA DEFINITION : SINGLE DATA VARIABLE
*----------------------------------------------------------------------*
DATA: RATE     TYPE P DECIMALS 5, 
      FFACT    LIKE TCURF-FFACT,  
      TFACT    LIKE TCURF-TFACT,  
      DATUM    LIKE SY-DATUM.     


*----------------------------------------------------------------------*
*  화면 입력 PARAMETER DEFINITION
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TITLE1.

   SELECTION-SCREEN SKIP.

*----------------------------------------------------------------------*
* FROM ~ TO SELECTTION 사용
*----------------------------------------------------------------------*
   SELECT-OPTIONS:
      S_WERKS1   FOR  MARC-WERKS          "대상구매조직
                      NO-EXTENSION   NO INTERVALS  OBLIGATORY,
      S_WERKS2   FOR  MARC-WERKS,         "비교구매조직
      S_MATKL    FOR  MARA-MATKL,         "자재그룹
      S_MATNR    FOR  MARA-MATNR.         "자재이름

   SELECTION-SCREEN ULINE.
*----------------------------------------------------------------------*
* RADIO BUTTON 사용
*----------------------------------------------------------------------*
   PARAMETERS:
      S_EXE RADIOBUTTON GROUP G1,    "수출용 단가비교
      S_DOM RADIOBUTTON GROUP G1.    "국판용 단가비교

*----------------------------------------------------------------------*
* CHECK BOX 사용
*----------------------------------------------------------------------*
   PARAMETERS:
      CK_PM1 AS CHECKBOX.   
      CK_PM2 AS CHECKBOX.

SELECTION-SCREEN END OF BLOCK B1.

INITIALIZATION.
   TITLE1 = '♣ 사업부별 단가 비교 - Price comparision ♣'.

*----------------------------------------------------------------------*
*  MAIN SELECTION PROCESS
*----------------------------------------------------------------------*
START-OF-SELECTION.

   IF S_DOM NE SPACE.
      DOM_EXP_SELECT = 'D'.
   ELSE.
      DOM_EXP_SELECT = 'E'.
   ENDIF.

*----------------------------------------------------------------------*
*  기본 Data 발췌
*----------------------------------------------------------------------*
   PERFORM DATA_SELECT.

*----------------------------------------------------------------------*
*  Source plant Data select.
*----------------------------------------------------------------------*
   PERFORM FOOTER_WRITE.

END-OF-SELECTION.

*----------------------------------------------------------------------*
*  REPORT Header 정의
*----------------------------------------------------------------------*
TOP-OF-PAGE.

   WRITE:/55  '============================',
         /55  '단가차이 효과금액 분석리스트',
         /55  '============================'.

   ULINE.
   FORMAT  INTENSIFIED  OFF  COLOR  6.
   WRITE:/1     'Material',
          20    'Desc.',
          53    'I',
          56    'D/E'.
   FORMAT  INTENSIFIED  OFF.  FORMAT  COLOR  OFF.
   WRITE:/1    'Org.',
          7    'Vendor_name',
          ...
          136   'Total_cost'.
   ULINE.

*----------------------------------------------------------------------*
*  SUB FORM PROCESS SECTION
*----------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&      Form  DATA_SELECT
*&---------------------------------------------------------------------*
FORM DATA_SELECT.

   CLEAR ITAB. REFRESH ITAB.
   SELECT * FROM ZC100
      WHERE MATNR IN S_MATNR
        AND MATKL IN S_MATKL
        AND WERKS IN S_WERKS1
        AND DOM_EXP = DOM_EXP_SELECT.
      CLEAR ITAB.
      MOVE: ZC100-MATNR     TO   ITAB-MATNR,
            ZC100-PSTYP     TO   ITAB-PSTYP.
      COLLECT ITAB.
   ENDSELECT.

*----------------------------------------------------------------------*
*  위 문장은 MATNR, PSTYP 의 종류를 구하는 SQL 문으로
*  다음과 같이 한문장으로 표현하면 좀 더 효율적임.
*  SELECT MATNR PSTYP INTO TABLE ITAB
*  FROM ZC100
*     WHERE MATNR IN S_MATNR
*       AND MATKL IN S_MATKL
*       AND WERKS IN S_WERKS1
*       AND DOM_EXP = DOM_EXP_SELECT
*  GROUP BY MATNR PSTYP.
*----------------------------------------------------------------------*
ENDFORM.                    " DATA_SELECT

*&---------------------------------------------------------------------*
*&      Form  TARGET_DATA_SELECT
*&---------------------------------------------------------------------*
FORM TARGET_DATA_SELECT.
      SELECT * FROM ZC100
         WHERE MATNR = ITAB-MATNR
           AND WERKS NE 'PC10'
           ...
           AND EKORG NE 'BX0D'.

         PERFORM NETPR_RATE.

ENDFORM.                    " TARGET_DATA_SELECT

*&---------------------------------------------------------------------*
*&      Form  DATA_WRITE
*&---------------------------------------------------------------------*
FORM DATA_WRITE.

 SELECT  SINGLE  *  FROM  MAKT            "자재명
     WHERE  MATNR  =  TARGET_DATA-MATNR
       AND  SPRAS  =  SY-LANGU.
     IF  SY-SUBRC  NE  0.
       MOVE  '****'      TO  MAKT-MAKTX.
     ENDIF.

   FORMAT INTENSIFIED OFF COLOR 6.
   WRITE:/1        TARGET_DATA-MATNR,                  "자재코드
          20(32)   MAKT-MAKTX,                  "품명/규격
          53(1)    TARGET_DATA-PSTYP.                  "Info category
   FORMAT INTENSIFIED OFF. FORMAT COLOR OFF.

ENDFORM.                    " DATA_WRITE

*&---------------------------------------------------------------------*
*&      Form  SOURCE_DATA_SELECT
*&---------------------------------------------------------------------*
FORM SOURCE_DATA_SELECT.

   CLEAR SOURCE_DATA. REFRESH SOURCE_DATA.
   SELECT * FROM ZC100
      WHERE MATNR = TARGET_DATA-MATNR
        AND PSTYP = TARGET_DATA-PSTYP
        AND WERKS IN S_WERKS1
        AND DOM_EXP = DOM_EXP_SELECT
        AND EKORG NE 'BX0D'
        AND EKORG NE 'BX0E'.

      CLEAR SOURCE_DATA.
      PERFORM NETPR_RATE.

      IF ZC100-WAERS = 'KRW'.
         MOVE: 1     TO   RATE,
               1     TO   FFACT,
               1     TO   TFACT.
      ELSE.
         PERFORM GET_RATE.
      ENDIF.

      MOVE-CORRESPONDING ZC100   TO  SOURCE_DATA.

      SOURCE_DATA-NNETPR = ZC100-NETPR / ZC100-PEINH.
      SOURCE_DATA-KNETPR = SOURCE_DATA-NNETPR * RATE / FFACT * TFACT.

      IF TARGET_DATA-BPRME NE SOURCE_DATA-BPRME.
         PERFORM UNIT_DIFF.
      ENDIF.

      APPEND SOURCE_DATA.

   ENDSELECT.

   SORT SOURCE_DATA BY KNETPR ASCENDING.
   LOOP AT SOURCE_DATA FROM 1 TO 1.
      PERFORM SOURCE_DATA_WRITE.
   ENDLOOP.

ENDFORM.                    " SOURCE_DATA_SELECT

다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼