728x90

# SAP SELECT(SQL) 동적 시작하기 전 


# SQL에서 사용을 할 때 동적으로 조건설정해주어야 할 때가 있다. 

# 조건을 설정하기 위해서는 동적 조건을 받을 변수동적으로 변경되는 값을 설정해야 한다. 

 

동적으로 줄 때에는 크게 3가지로 나뉜다. 

- PARAMETER

- SELECT-OPTIONS

- 변수 

 

# 시나리오


# PARAMETERSELECT-OPTIONS에 대한 동적 조건을 만들어보겠다. 

 

 

# 01. 동적으로 받을 조건 설정 


# 01. 우선 사용자 입력을 하기 위해 다음과 같이 설정해 보자.

TABLES: SFLIGHT.

PARAMETERS: 
  PA_ID TYPE SFLIGHT-CARRID.

SELECT-OPTIONS: 
  SO_DATE FOR SFLIGHT-FLDATE.

 

# 02. 동적 조건을 설정하기 위해서는 다음과 같이 [ Internal Table ] or [ Structure ] 설정해야 한다.

DATA:
  GS_WHERE(20),
  GT_WHERE LIKE TABLE OF GS_WHERE.

 

 

#02. Where 동적 조건 만들기


#01. 조건을 만들기 위해서는 Concatenate문을 통해서 설정해야 한다. 

( 여기서는 New Syntax을 통해서 설명하겠다. Old Syntax 예시로만 들겠다 ) 

 

 

# Old Syntax 설명


# Old Syntax으로 설정하면 다음과 같이

CONCATENATE 'CARRID = '''PA_CAID'''' INTO GS_WHERE.  " Old Syntax

 

예를 들어

PA_CAID에 값을 AA로 넘었다고 하면 다음과 같이 나올 것이다. 

 

# CONCATENATE을 이런 식으로 설정한 이유는 

Concatenate안에 변수를 넣으려면

'변수' -> 이런 식으로 넣어야 한다

 ( # 따옴표 ' ' 두 개를 사용해서 안에 변수를 넣어주는 방식. )

# 빨간 상자를 지워보자.

 

남은 건 'CARRID ='  ' '  이다.

더욱 쉽게 보면 'CARRID ='AA' ' 인 것이다. 

CONCATENATE를 사용하면서 변수가 아닌 문자를 써주려면 따옴표가 감싸줘야 하기 때문에 처음 시작부터 사용을 하였다. 

 

마지막으로 보면 결과 값은 

CARRID ='AA'이다. 

이렇게 되면 완성인 것이다. 

 

# New Syntax 설명


# 01. New Syntax으로 설정하면 다음과 같이 설정할 수 있다. 


GS_WHERE = |CARRID = '{ PA_CAID }' |.

 

 

#03. Where 동적 조건 PERFORM 설정 


# 하지만 우리가 봐야 할 것은 Parameter 일 경우, 연산자가 계속 바뀔 경우도 있기도 하고, 필드가 바뀔 수도 있기 때문에 그것 또한 동적으로 설정해야 한다.

# 또한, SELECT-OPTIONSParameter와 다르게 설정을 해야지만, Dump을 막을 수가 있다. 

 

그래서 다음과 같이 로직을 설정하였다. ( 로직 설명은 안 하겠.. 다..! ) 

FORM DYNAMIC_WHERE
  TABLES
    PT_WHERE LIKE GT_WHERE
  USING
    VALUE(P_SEL)   " Parameter or Select-Options "
    VALUE(P_FIELD)
    VALUE(P_CONDIT) " ex) EQ, NE, GT, LE ... "
    VALUE(P_VALUE).

  IF GT_WHERE IS INITIAL.
    CASE P_SEL.
      WHEN SPACE.
        GS_WHERE = |{ P_FIELD } { P_CONDIT } '{ P_VALUE }'|.

      WHEN ABAP_TRUE.
        GS_WHERE = |{ P_FIELD } IN { P_VALUE }|.
    ENDCASE.
  ELSE.

    GS_WHERE = 'AND'.
    APPEND GS_WHERE TO GT_WHERE.

    CASE P_SEL.
      WHEN SPACE.
        GS_WHERE = |{ P_FIELD } { P_CONDIT } '{ P_VALUE }'|.

      WHEN ABAP_TRUE.
        GS_WHERE = |{ P_FIELD } IN { P_VALUE }|.
    ENDCASE.
  ENDIF.

  APPEND GS_WHERE TO GT_WHERE.
  CLEAR
    GS_WHERE.

ENDFORM.                    "DYNAMIC_WHERE

 

# 로직에서 중요한 것은 Parameter냐? Select-Options냐? 의 차이점이게 된다.

 

# SELECT-OPTIONS일 경우에만 앞에 ' X ' 값만 넣어주면 된다. 

PERFORM DYNAMIC_WHERE
  TABLES
    GT_WHERE:
  USING
    ' ' 'CARRID' 'EQ' PA_ID,
  USING
    'X' 'FLDATE' '' 'SO_DATE[]'.

 

# Parameter 일 경우 

 

# Select-Options 일 경우 

 

# [ GT_WHERE ] 값

 

 

# OPEN SQL 사용 시, 추가적인 상황( HANA 기준으로 설명 )


# 예를 들어 Parameter가 아닌 Select-Options을 넣어야 할 때가 있을 것이다. 

 

동적으로 Parameter을 넣을 경우에는 다음과 같이 넣으면 되고,

GS_WHERE = |CARRID = '{ PA_CAID }' |.

 

동적으로 Select-Options으로 넣을 경우에는 다음과 같이 넣으면 된다.

GS_WHERE = |{ P_FIELD } IN @{ P_VALUE }|.

 

# 여기서 주의할 점7.40 버전 이후를 사용할 경우 [ @ ]을 사용해야 하기 때문에 다음과 같이 설정해야 덤프 발생이 안된다.

 

 

끝..!! 

 

도움이 되셨으면 하단에 있는 광고 한 번씩 눌러주세요!!

 

728x90

'.ABAP > ..모든 것' 카테고리의 다른 글

SAP TRY .. CATCH 구문  (3) 2022.05.03
SAP Tabstrip 정리( Screen )  (6) 2022.04.15
SAP Query [2] 정리  (0) 2022.03.26
SAP Query [1] 정리  (1) 2022.03.20
SAP MACRO,DEFINE 정리  (2) 2022.02.16