ABAP SELECT 문에서 동적으로 테이블 지정 방법(동적 필드 지정 포함)

SAP 테이블 중에 동일한 필드 구성을 가진 여러 개의 테이블이 존재하고, 특정한 조건에 따라 테이블을 다르게 선택하여 SELECT 구문을 처리한다고 할 때 서로 다른 테이블을 어떻게 처리하면 효과적일까요?

가장 쉽게 구현할 수 있는 방법은 조건에 따라 SELECT 문을 각각 다르게 만들어 처리하는 방법입니다.
쉽게 구현할 수 있다는 것은 장점이지만 SELECT 문이 긴 경우 불필요한 소스 코딩이 많아진다는 단점이 있습니다.

또는 월 별로 테이블을 분리해서 데이터를 관리하는 경우 검색 조건의 기간에 따라 해당 월의 테이블을 SELECT 해야 하는 경우 조건(IF)문으로는 처리가 불가능해 집니다.

SELECT 문에서 가져오는 필드는 동일하고 단지 테이블만 다를 경우 테이블을 동적으로 지정할 수 있으면 간단하게 하나의 SELECT 문으로 처리를 할 수 있습니다.

이번 글에서는 ABAP SELECT 문에서 동적으로 테이블 지정 방법(동적 필드 지정 포함)에 대해 알아보겠습니다.

ABAP SELECT 문에서 테이블 동적 지정 방법

1. 아래 ABAP 프로그램 소스는 동적으로 테이블과 필드를 지정하는 예제 입니다.

  • 이해를 돕기 위해 SELECT 문을 나누어 기술하였습니다.
REPORT  YTEST0001.
 
DATA: TBL(100),
      FLD(100).
DATA: WA_FLD LIKE ZCO224TSMEBTR.
 
WRITE: / ‘** ZCO224T’.
WRITE: / ‘** ZRATE’.
 
TBL = ‘ZCO224T’.
FLD = ‘ ZRATE’.
 
SELECT (FLD) FROM (TBL) INTO WA_FLD
  WHERE ZYYMM = ‘202312’ AND STAGR = ‘ARE’ .
 
  WRITE: / WA_FLD.
 
ENDSELECT.
 
SKIP 2.
WRITE: / ‘** ZCO224T_O’.
WRITE: / ‘** SMEBTR ‘.
 
TBL = ‘ZCO224T_O’.
FLD = ‘ SMEBTR’.
 
SELECT (FLD) FROM (TBL) INTO WA_FLD
  WHERE ZYYMM = ‘202312’ AND STAGR = ‘ARE’ .
 
  WRITE: / WA_FLD.
 
ENDSELECT.
  • TBL : 테이블을 동적을 지정하기 위한 변수입니다.
  • FLD : 필드를 동적으로 지정하기 위한 변수입니다.
  • 테이블 및 필드를 동적으로 지정하기 위해 괄호로 묶어주었습니다.
  • ZCO224T 테이블의 ZRATE 필드를 SELECT 하는 구문과 ZCO224T_O 테이블의 SMEBTR 필드를 SELECT 하는 구문을 동적으로 처리하는 예제입니다.
ABAP SELECT 문에서 동적으로 테이블 지정 방법(동적 필드 지정 포함) 1

2. 앞의 ABAP 프로그램을 실행했을 때의 결과 화면입니다.

ABAP SELECT 문에서 동적으로 테이블 지정 방법(동적 필드 지정 포함) 2

실제 ABAP 프로그램에서 테이블을 동적으로 사용하는 예제

1. 실제 ABAP 프로그램을 개발할 때는 아래 소스와 같이 SELECT 문을 한번만 사용해서 처리하게 됩니다.

  • 사용자가 ‘USR1’인 경우 ZCO224T 테이블과 ZRATE 필드를 SELECT 하고,
    그 외 사용자인 경우 ZCO224T_O 테이블과 SMEBTR 필드를 SELECT 하게 됩니다.
REPORT  YTEST0001.
 
DATA: TBL(100),
           FLD(100).
DATA: WA_FLD LIKE ZCO224TSMEBTR.
 
 
IF SYUNAME = ‘USR1’.
  TBL = ‘ZCO224T’.
  FLD = ‘ ZRATE’.
ELSE.
  TBL = ‘ZCO224T_O’.
  FLD = ‘ SMEBTR’.
ENDIF.
 
SELECT (FLD)  FROM (TBL) INTO WA_FLD
  WHERE ZYYMM = ‘202312’ AND STAGR = ‘ARE’ .
 
  WRITE: / WA_FLD.
 
ENDSELECT.

ABAP에서 테이블을 동적으로 지정할 때 주의사항

1. 동적으로 필드를 지정하거나 테이블을 지정할 때 오직 하나의 동적 필드 또는 동적 테이블만 지정이 가능합니다.

  • SELECT (FLD)  FROM (TBL) INTO WA_FLD. : 오류가 없습니다.
  • SELECT (FLD)  FROM ZCO244T INTO WA_FLD. : 오류가 없습니다.
  • SELECT ZRATE  FROM (TBL) INTO WA_FLD. : 오류가 없습니다.
  • SELECT ZRATE SMEBTR  FROM (TBL) INTO (WA_FLD1, WA_FLD2). : 오류가 없습니다.
  • SELECT (FLD1) (FLD2)  FROM (TBL) INTO (WA_FLD1, WA_FLD2). : 오류가 발생합니다.
  • SELECT (FLD1) ZRATE  FROM (TBL) INTO (WA_FLD1, WA_FLD2). : 오류가 발생합니다.
  • SELECT (FLD1) (FLD2)  FROM ZCO244T INTO (WA_FLD1, WA_FLD2). : 오류가 발생합니다.
  • SELECT ZRATE  FROM (TBL) AS A INNER JOIN ZCO244T_O INTO WA_FLD. : 오류가 발생합니다.

2. 만약 여러 개의 필드를 사용하고자 할 경우 아래와 같이 여러 필드를 동적 필드 변수 하나에 묶어서 지정해서 사용할 수 있습니다.

  • FLD = ‘SMEBTR ZRATE’.
  • 두 개의 필드를 FLD 변수에 넣고, SELECT 문에서는 (FLD) 하나만 사용해서 오류 없이 실행할 수 있습니다.
DATA: TBL(100),
      FLD(100).
DATA: WA_SMEBTR LIKE ZCO224TSMEBTR,
      WA_ZRATE LIKE ZCO224TZRATE.
 
TBL = ‘ZCO224T’.
FLD = ‘SMEBTR ZRATE’.
 
SELECT (FLD) FROM (TBL) INTO (WA_SMEBTR, WA_ZRATE)
  WHERE ZYYMM = ‘202312’ AND STAGR = ‘ARE’ .
 
  WRITE: / WA_SMEBTR, WA_ZRATE.
 
ENDSELECT.

▼ 또는 INTO CORRESPONDING FIELDS OF TABLE을 사용하여 한번에 인터널테이블로 받아올 수 있습니다.

DATA: TBL(100),
      FLD(100).
 
DATA IT_TAB TYPE TABLE OF ZCO224T WITH HEADER LINE.
 
TBL = ‘ZCO224T’.
FLD = ‘SMEBTR ZRATE’.
 
SELECT (FLD) FROM (TBL) INTO CORRESPONDING FIELDS OF TABLE IT_TAB
  WHERE ZYYMM = ‘202312’ AND STAGR = ‘ARE’ .
 
LOOP AT IT_TAB.
  WRITE: / IT_TABZRATE, IT_TABSMEBTR.
ENDLOOP.

마무리

ABAP 프로그램에서 테이블 SELECT 동적으로 테이블을 지정할 수 있으면 무척 편리하게 합니다.

사용자에 따라 다른 테이블의 정보를 SELECT 할 때 동적 테이블 사용하면 간단하게 처리가 가능합니다.

또는 기간 별로 테이블을 분리해서 관리하는 경우 SELECT 검색 조건의 기간에 따라 동적으로 테이블을 지정해서 SELECT를 할 수 있어 검색 기간에 따른 테이블 지정에 대한 고민을 할 필요가 없습니다.





이 글이 도움이 되었기를 바랍니다. ^-^


답글 남기기