본문 바로가기

ABAP 프로그래밍 개념/ABAP Structue and Internal Table

5.2.5 Control Break Statements

루프에서 데이터를 처리하는 동안, 제어 브레이크 구문을 통해 특별한 제어 수준 처리(special control-level processing)를 수행할 수 있습니다.

LOOP라는 Statement Block(구문 블록 : LOOP~ENDLOOP)은 Control Structure를 포함할 수 있는데 Control Strcture은 Control Strcture이 변화할 때 Control Break 구문의 실행을 발생시킬 (트리거 시킬)수 있습니다.

예를 들어 루프에서 첫 번째 레코드가 처리될 때, Control Strcture의 필드 값이 변경될 때 또는 루프의 마지막 레코드가 처리될 때 Control Break 구문이 트리거됩니다. Control Break 구문은 AT로 시작하여 ENDAT으로 닫힙니다.

Control Break에는 네가지 방법이 있습니다.

■ AT FIRST
-> 첫번 째 루프에서 트리거 됨

■ AT NEW component
-> Row에서 명시한 Component의 값이 이전과 비교하여 바뀐 그 순간 트리거 됨

■ AT END OF component
-> Row에서 명시한 Component의 값이 다음과 비교하여 바뀌기 전 마지막에 트리거 됨

■ AT LAST
-> 루프의 마지막에서 트리거 됨

* LT_SFLIGHT에 세 개의 Component(CARRID, CONNID, FLDATE)가 있다고 가정하여, 다음 예시를 통해 Control Break을 보겠습니다.

LOOP AT it_sflight INTO wa_sflight.

AT FIRST.
"첫번째 루프에서 이 안에 구문이 실행 됨."
ENDAT.

AT NEW carrid.
"이전 루프문에서 Carrid 값을 비교하여 바뀌는 그순간 이 안에 구문이 실행됨"
ENDAT.

AT NEW connid.
"이전 Loop문과 비교하여, CARRID와 CONNID를 비교하여 실행함. CONNID의 값이 같더라도, CARRID의 값이
다르다면, 선행 Component의 값이 다르면 새로운 CONNID로 인식한다"
ENDAT.

AT END OF connid.
"CARRID와 CONNID를 비교하여 마지막 CARRID의 CONNID인 것을 확인하여 인식"
ENDAT.

AT LAST.
"마지막 루프에서 이 안에 구문이 실행 됨."
ENDAT.

ENDLOOP

Control Break 구문은 항상 루프에서의 순서에 상관없이 유지될 수 있는데 Control Break에 의해서만 트리거되며 코드에 유지되는 순서와 관계없이 실행되기 때문입니다. 아래 코드 샘플에서는 일부 Control Break 구문의 예가 나와 있습니다. 이 예제 코드는 대금청구문서의 헤더 및 항목 정보를 인쇄하면서 Control Break 구문이 보고서 출력을 제어하는 방법을 강조합니다.

"대금청구문서 헤더 구조"
TYPES: BEGIN OF TY_VBRK,
        VBELN TYPE VBELN_VF, "Document Number"
        FKDAT TYPE FKDAT, "Bill Date"
        NETWR TYPE NETWR, "Net Value"
        KUNRG TYPE KUNRG, "Payer"
       END OF TY_VBRK.

"대금청구문서 품목 정보"
TYPES: BEGIN OF TY_VBRP.
        VBELN TYPE VBELN_VF, "Document Number"
        POSNR TYPE POSNR_VF, "Item Number"
        ARKTX TYPE ARKTX, "Description"
        FKIMG TYPE FKIMG, "Qty"
        VRKME TYPE VRKME, "Sales Unit"
        NETWR TYPE NETWR_FP, "Net Value"
        MATNR TYPE MATNR, "Material Num"
        MWSBP TYPE MWSBP, "Tax amt"
       END OF TY_VBRP.
DATA: it_vbrp TYPE TABLE OF ty_vbrp,
      it_vbrk TYPE TABLE OF ty_vbrk,
      wa_vbrk TYPE ty_vbrk,
      wa_vbrp TYPE ty_vbrp.
      
"Selection Screen 선언"
SELECT-OPTIONS: s_vbeln FOR wa_vbrp-vbeln.

START-OF-SELECTION.

"헤더 데이터 select"
SELECT VBELN FKDAT NETWR KUNRG FROM VBRK
INTO TABLE it_vbrk
WHERE VBELN in s_matnr.

"item 데이터 select"
SELECT VBELN POSNR ARKTX FKIMG VRKME NETWR MATNR MWSBP
FROM vbrp INTO TABLE it_vbrp WHERE vbeln in s_vbeln.

END-OF-SELECTION

"Sort 구문이 아니면 Internal Table을 반드시 Sort 해주어야함"
SORT it_vbrp BY vbeln.

LOOP AT it_vbrp INTO wa_vbrp.
     AT FIRST. 
     WRITE AT: /05 'ITEM',
                15 'DESCRIPTION',
                60 'BILLED QUANTITY',
                80 'UNITS',
                105 'NET VALUE',
                130 'MATERIAL NUMBER',
                150 'TAX AMOUNT'.

          WRITE SY-ULINE.

     ENDAT.
     
     AT NEW VBELN. " 새 대금청구 문서번호일 때마다 실행되도록"
        
        READ TABLE it_vbrk into wa_vbrk WITH KEY
                                        VBELN = wa_vbrp-vbeln.
                                        
        WRITE AT : /5 'Billing Document' LEFT-JUSTIFIED.
        WRITE AT : 30 wa_vbrk-vbeln LEFT-JUSTIFIED COLOR 2.
        WRITE AT : /5 'Payer' LEFT-JUSTIFIED.
        WRITE AT : 30 wa_vbrk-kunrg LEFT-JUSTIFIED COLOR 3.
        WRITE AT: /5 'BILLING DATE' LEFT-JUSTIFIED.
        WRITE AT: 30 wa_vbrk-fkdat LEFT-JUSTIFIED COLOR 5.
        WRITE AT: /5 'NET VALUE' LEFT-JUSTIFIED.
        WRITE AT: 30 wa_vbrk-netwr LEFT-JUSTIFIED COLOR 6.
     ENDAT.
"Item 출력하기"
        WRITE : /5 wa_vbrp-posnr LEFT-JUSTIFIED,
                15 wa_vbrp-arktx LEFT-JUSTIFIED,
                60 wa_vbrp-fkimg LEFT-JUSTIFIED,
                80 wa_vbrp-vrkme LEFT-JUSTIFIED
                105 wa_vbrp-netwr LEFT-JUSTIFIED,
                130 wa_vbrp-matnr LEFT-JUSTIFIED,
                150 wa_vbrp-mwsbp LEFT-JUSTIFIED.
                
"ITEM의 마지막에서 Net Value의 합을 구하기"
     AT END OF vbeln
        
        SUM.      
        WRITE : / 105 WA_VBRP-NETWR LEFT-JUSTIFIED.
        
     ENDAT.
     
"최종 Loop 때 출력"
     AT LAST.
        WRITE : / 'END OF REPORT'.
     ENDAT.
ENDLOOP.

대금청구문서의 헤더 데이터와 아이템 데이터를 처리합니다. 헤더 데이터는 데이터베이스 테이블 VBRK에서 가져오고, 아이템 데이터는 데이터베이스 테이블 VBRP에서 가져옵니다. 우리는 SELECT-OPTIONS 문을 통해 선택 화면을 사용자에게 제공하여 사용자는 프로그램에서 처리해야 할 여러 문서 번호를 입력할 수 있습니다.

사용자의 입력에 기반하여, 우리는 데이터베이스 테이블에서 관련 레코드를 가져와 출력용으로 WRITE 문을 사용하여 처리합니다. 우리는 IT_VBRP의 LOOP 문 내에서 Control Break 문을 사용하여 출력 형식을 지정합니다.

예를 들어, 우리는 AT FIRST 문을 사용하여 첫 번째 루프 패스를 식별하여 열 제목을 출력합니다. AT NEW는 새 문서를 식별하여 헤더 레코드를 읽고 출력하는 데 사용됩니다. AT END OF는 현재 문서의 마지막 아이템을 식별하여 문서의 총합을 출력하는 데 사용됩니다. 마지막으로, AT LAST 문을 사용하여 내부 테이블의 마지막 레코드를 식별하여 보고서 종료 문을 출력합니다.

WRITE 문은 다양한 형식 기술을 지원합니다. 예를 들어,  WRITE AT Addition 구문을 사용하여 레코드를 화면의 위치에 출력하거나, /를 사용하여 레코드를 새 줄에 출력하는 등의 형식 기술을 지원합니다.

아래는 Control Break를 구문을 사용할 때 적용해야하는 규칙입니다.

■ Internal Table 필드는Control Break에서 사용되는 필드 순으로 정렬되어야 합니다.
■ 루프 내에서 Internal Table은 수정할 수 없습니다.
■ LOOP 문의 INTO 추가 구문에서 지정된 Work Area의 내용은 수정할 수 없습니다.

AT-ENDAT Control 구조가 입력되면, Work Area의 데이터는 아래 내용과 같이 변경됩니다.

■ Control Break가 적용된 Components의 내용은 변경되지 않습니다.
■ 현재 컨트롤 키(Control Key) 이후의 Character-like flat data type을 가진 모든 구성 요소는 각 위치에서 문자 *로 설정됩니다.
■ 현재 컨트롤 키(Control Key) 이후의 다른 모든 구성 요소는 초기 값으로 설정됩니다.

아래 그림은 Control Break에 들어가기 전에 Work Area의 데이터를 나타낸 것 입니다.

아래는 Control Break에 들어간 후에에 Work Area의 데이터를 나타낸 것 입니

AT-ENDAT Control Structture를 빠져 나올 때, 현재 테이블 행의 내용이 전체 Work Area에 할당됩니다.

반응형

'ABAP 프로그래밍 개념 > ABAP Structue and Internal Table' 카테고리의 다른 글

5.1.5 Use Cases  (0) 2023.04.19
5.1.4 Working with Structures  (0) 2023.04.19
5.1.3 Global Structures  (0) 2023.04.19
5.1.2 Local Structures  (0) 2023.04.19
5.1.1 When to Define Structures  (0) 2023.04.18