반응형

    이번 포스팅에서는 ABAP의 독특한 구문중 하나인 Range 변수에 대하여 다루어 보겠습니다. 잘 알아두면 여러모로 편리한 구문입니다.

     

    보통 웹페이지나 프로그램 입력화면의 Edit box는 단일 입력을 받도록 되어있습니다. 여러 줄을 입력받거나 범위를 입력받으려면 화면을 수정 코딩하는 번거로움이 있는데 이것을 Internal Table 형식으로 극복한 것이 RANGE 변수라 하겠습니다.

     

    TYPE-1 Report 프로그램의 SELECTION-SCREEN 구성시 사용하는 SELECT-OPTIONS 변수도 같은 형식을 취하고 있습니다.

     

    1) 선언

    보통 RANGES 구문을 사용하여 선언하며 다른 방법으로도 선언이 가능합니다.

     

    2) 구조

    1)과 같이 RANGES 변수를 선언하면 변수는 자동적으로 4개의 필드를 가진 Internal Table이 됩니다.

    각 필드의 기능을 살펴 보겠습니다.

    SIGN     TYPE DDSIGN,

    OPTION TYPE DDOPTION,

    LOW     TYPE dobj.

    HIGH    TYPE dobj.

     

    2-1) 값 필드 LOW, HIGH

    조건값을 넣을 LOW, HIGH는 참조한 변수와 같은 유형으로 선언이 됩니다. 1)과 같이 선언하면 MATNR과 같은 CHAR 18자리의 변수가 선언됩니다.

     

    2-2) SIGN

    저장한 값을 포함할지 제외할지 결정하는 지시자로 I(Include 포함), E(Exclude 제외)의 값을 가질 수 있습니다.

    그 Domain값을 보면 아래와 같습니다.

    2-3) OPTION

    주어진 값에 대한 조건을 지정할 수 있습니다. 보다 크다, 같다 등의 연산자라 생각하면 되겠습니다.

    도메인의 값을 보면 가질 수 있는 값은 아래와 같습니다.

    3) 사용법      

    RANGES 변수는 SQL 문의 WHERE 조건절에 IN, NOT IN의 값으로 사용되거나, IF문 등의 조건으로 사용됩니다.

    사용법은 어렵게 생각하지 말고 글 쓰듯이 하면 되겠습니다. 우리 국어 실력을 믿어 봅시다.

     

    i) 자재번호가 A 인 것만 조건으로 하고 싶다 -> A만 포함하고 싶다는 말입니다.

    SIGN : 'I' (포함)

    OPTION : EQ(같은 거)

    LOW : 자재 'A'

    HIGH :

     

    ii) 자재 1000 ~ 2000번까지 인 것만 조건으로 하고 싶다. -> 1000 ~ 2000의 범위를 포함하고 싶다는 말입니다.

    SIGN : 'I' (포함)

    OPTION : BT(Between 범위 LOW ~ HIGH)

    LOW : 자재 '1000'

    HIGH : 자재 '2000'

     

    iii) 1000번 자재만 뺀 나머지 전체를 조건으로 하고 싶다, -> 1000번 만 제외하고 싶다는 말입니다.

    SIGN : 'E' (제외)

    OPTION : EQ(같은 거)

    LOW : 자재 '1000'

    HIGH :

     

    iv) 1000번, 2000번 만 조건으로 하고 싶다. -> 1000, 2000만 포함하고 싶다는 말입니다.

    RANGES 변수로 선언을 하면 Internal Tabel이라 언급했습니다. 그 말은 여러 줄 쌓을 수 있다는 것이고 조건을 여러 줄 넣을 수 있다는 것이죠.

     

    i) 번을 반복 수행하여  RANGES변수에 담으면 되겠습니다.

     

    더 이상의 예는 초등학교 시간이 되어서 그만 하겠습니다. ㅎ

    채워진 변수는 프로그램 안에서는 아래와 같이 사용하면 되겠습니다.

    4) TYPE-1 Report 프로그램에서 SELECT-OPTIONS 

    SELECT-OPTIONS: S_MATNR FOR MARA-MATNR.

     

    위와 같이 선언된 S_MATNR 변수는 화면에 Edit Box와 같이 입력창을 만들어 줍니다. 그 모양이 입력 간 1개가 아닌

    Ranges 변수의 특성을 모두 입력 가능합 형태로 자동 생성되어 지죠.

     

    아래와 같은 화면이 생성되면 앞이 LOW값 뒤가 HIGH값이 되겠습니다. SIGN, OPTION은 빨간 사각형을한 Extension을 눌러보면 구조를 알 수 있습니다. 

    Extension 버튼을 누르면 아래와 같은 화면이 나타납니다. 딱 봐도 3)에서 본 포함, 제외 , 범위를 넣는  탭 모양입니다.

    Ranges변수가 Internal Table이라서 여러 줄 넣을 수 있으니 여러 줄을 넣을 수 있는 모양으로 되어 있습니다.

     

    좀 더 다양한 OPTION 즉 LE, GE, CP를 포함하고 싶다면 하단 빨간 박스의 Define Selection Option(선택 옵션 정의)를 눌러 선택이 가능합니다. 

    넣지 않으면 기본으로 단일 값 -> EQ, 범위 -> BT가 들어가 있다고 생각하시면 됩니다.

    난 수학과 거리가 멀어 하시는 분들은 한 방향만 생각하면 편할 것 같습니다. 아래의 표현은 같은 표현입니다.

    하지만 E를 넣고 역으로 로직을 만드는 것은 조직에 순응해온 월급쟁이에게 더 어려운 거 같습니다. 제 얘기입니다.ㅜㅜ

    로직을 I의 순방향만 생각하면 쉬울 수도 있겠습니다.

     

    I(포함), EQ(같은 것), 1000(값)    =   E(제외), NE(같지 않은 것), 1000(값).

     

    참고 1) CP옵션

    CP옵션의 경우 SQL 문에서 LIKE 구문과 같은 동작을 합니다.

    아래의 두 구문은 1로 시작하는 모든 데이터를 읽기 위한 구문으로 같은 동작을 하게 됩니다.

    SQL은 Don't Care 확장자로 %를 Ranges변수를 사용하는 경우 *를 확장자로 사용하게 됩니다.

    참고 2) 이미 있는 Ranges 형식의 Table Type 찾기.

    DD40L(Table types (internal tables defined in DD)) 테이블에서 RANGE_CTYP필드에 원하는 DataElement를 넣고 검색하면 Standard에서 제공하는 Global 한 Ranges형식의 Table Type을 찾을 수 있습니다.

     

    펑션 등의 파라미터로 사용할 Ranges변수가 없으면 Dictionary의 Structure로 만들어 주고 사용해야 합니다. 

    혹시 안 만들고 있는 걸 쓸 수는 없나 찾다 보니 자주 사용하는 Data Element는 선언되어 있는 것이 있습니다.

     

    MATNR로 조회하면 여러개가 나옵니다. 그중 하나인 RANGES_MATNR Table Type을 SE11로 조회하여 보면 아래와 같이 조회됩니다.

    찾은 Table Type은 아래처럼 사용하거나 펑션 등의 파라미터로 활용하면 되겠습니다.

     

    긴 글 읽어주셔서 감사합니다.

     

     

     

     

     

    728x90
    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기