OpenSQL Expressions
ABAP New syntax의 Open SQL에서 처리할 수 있는 표현식이 Native 못지 않게 상당히 많이 늘어나서
이제 ABAP 영역에서 처리하던 작업을 쿼리문을 통해 데이터베이스 영역에서 처리하여 성능 향상 시킬수 있습니다
자세한 내용은 T-Code : ABAPDOCU 에서 확인 할 수 있습니다
아래는 제 개인적인 기준으로 자주 사용하고 있는 SQL Functions 입니다.
이외에도 && 을 이용한 문자열 결합, coalesce 을 이용한 null 대체 등
더 많은 내용은 위의 ABAPDOCU에서 사용법을 확인하여 적절히 활용하시면 좋습니다.
#1. SQL Numeric Functions
사용 예시
TYPES: BEGIN OF T_TMP,
SQL_EXP1 TYPE P LENGTH 8 DECIMALS 5,
SQL_EXP2 TYPE P LENGTH 8 DECIMALS 5,
SQL_EXP3 TYPE I,
SQL_EXP4 TYPE I,
END OF T_TMP.
DATA LT_TMP TYPE STANDARD TABLE OF T_TMP.
LT_TMP = VALUE #( ( SQL_EXP1 = '123.45678' SQL_EXP2 = '11.00000' SQL_EXP3 = 7 SQL_EXP4 = 3 )
( SQL_EXP1 = '123.56789' SQL_EXP2 = '11.55670' SQL_EXP3 = 3 SQL_EXP4 = 7 )
( SQL_EXP1 = '123.99999' SQL_EXP2 = '11.95670' SQL_EXP3 = 10 SQL_EXP4 = 2 )
( SQL_EXP1 = '-123.45678' SQL_EXP2 = '11.00000' SQL_EXP3 = -7 SQL_EXP4 = 3 )
( SQL_EXP1 = '-123.56789' SQL_EXP2 = '-11.55670' SQL_EXP3 = 3 SQL_EXP4 = -7 )
( SQL_EXP1 = '123.99999' SQL_EXP2 = '-11.95670' SQL_EXP3 = -10 SQL_EXP4 = -2 ) ).
SELECT
SQL_EXP1, SQL_EXP2,
ABS( SQL_EXP1 ) AS ABS_EXP1,
ABS( SQL_EXP2 ) AS ABS_EXP2,
CEIL( SQL_EXP1 ) AS CEIL_EXP1,
CEIL( SQL_EXP2 ) AS CEIL_EXP2,
DIVISION( SQL_EXP1, SQL_EXP2, 1 ) AS DIVISION,
FLOOR( SQL_EXP1 ) AS FLOOP_EXP1,
FLOOR( SQL_EXP2 ) AS FLOOP_EXP2,
ROUND( SQL_EXP1, 1 ) AS ROUND_EXP1,
ROUND( SQL_EXP2, 1 ) AS ROUND_EXP2,
SQL_EXP3, SQL_EXP4,
DIV( SQL_EXP3, SQL_EXP4 ) AS DIV,
MOD( SQL_EXP3, SQL_EXP4 ) AS MOD
FROM @LT_TMP AS A
INTO TABLE @DATA(LT_RESULT).
ZCL_SALV_TEST=>DISPLAY( LT_RESULT ).
#2. SQL String Functions
사용예시
TYPES: BEGIN OF T_TMP,
SQL_EXP1(100) TYPE C,
SQL_EXP2(100) TYPE C,
END OF T_TMP.
DATA LT_TMP TYPE STANDARD TABLE OF T_TMP.
LT_TMP = VALUE #( ( SQL_EXP1 = 'aBc dEFG' SQL_EXP2 = '문자열 2' ) ).
SELECT
SQL_EXP1, SQL_EXP2,
CONCAT( SQL_EXP1, SQL_EXP2 ) AS CONCAT,
CONCAT_WITH_SPACE( SQL_EXP1, SQL_EXP2, 3 ) AS CONCAT_WS,
LEFT( SQL_EXP1, 2 ) AS LEFT_EXP1,
LEFT( SQL_EXP2, 2 ) AS LEFT_EXP2,
RIGHT( SQL_EXP1, 2 ) AS RIGHT_EXP1,
RIGHT( SQL_EXP2, 2 ) AS RIGHT_EXP2,
LENGTH( SQL_EXP1 ) AS LENGTH_EXP1,
LENGTH( SQL_EXP2 ) AS LENGTH_EXP2,
LOWER( SQL_EXP1 ) AS LOWER_EXP1,
LOWER( SQL_EXP2 ) AS LOWER_EXP2,
UPPER( SQL_EXP1 ) AS UPPER_EXP1,
UPPER( SQL_EXP2 ) AS UPPER_EXP2,
REPLACE( SQL_EXP1, 'EF', '이에프' ) AS REPLACE_EXP1,
SUBSTRING( SQL_EXP1, 2, 4 ) AS SUBSTRING
FROM @LT_TMP AS A
INTO TABLE @DATA(LT_RESULT).
ZCL_SALV_TEST=>DISPLAY( LT_RESULT ).
#3. SQL Case 구문
쿼리문 내에서 case를 이용하여 조건에 따른 값을 가져올 수 있습니다.
사용 예시
차/대변 지시자(SHKZG)를 CASE를 이용하여 대변(H)일 경우 수량 * -1 처리
TABLES MATDOC.
PARAMETERS: P_WERKS TYPE T001W-WERKS.
SELECT-OPTIONS: S_MATNR FOR MATDOC-MATNR,
S_BUDAT FOR MATDOC-BUDAT.
SELECT
A~MATNR,
T1~MAKTX,
A~WERKS,
A~LGORT,
A~BUDAT,
SUM( CASE WHEN A~SHKZG EQ 'H' THEN A~MENGE * -1
ELSE A~MENGE END ) AS MENGE,
B~PMATN,
B~VERID
FROM MATDOC AS A
INNER JOIN CKMLMV013 AS B ON A~AUFNR EQ B~AUFNR
LEFT OUTER JOIN MAKT AS T1 ON A~MATNR EQ T1~MATNR AND T1~SPRAS EQ @SY-LANGU
WHERE A~MATNR IN @S_MATNR
AND A~WERKS EQ @P_WERKS
AND A~BUDAT IN @S_BUDAT
GROUP BY A~MATNR,
T1~MAKTX,
A~WERKS,
A~LGORT,
A~BUDAT,
B~PMATN,
B~VERID
HAVING SUM( CASE WHEN A~SHKZG EQ 'H' THEN A~MENGE * -1
ELSE A~MENGE END ) <> 0
INTO TABLE @DATA(LT_TMP).
ZCL_SALV_TEST=>DISPLAY( LT_TMP ).
'ABAP > Syntax' 카테고리의 다른 글
[Syntax] CORRESPONDING - Structure 및 Internal Table 값 복사 (0) | 2023.07.20 |
---|---|
[Syntax] CONV - 형 변환 (0) | 2023.07.19 |
[OpenSQL] Internal Table을 이용한 JOIN (FOR ALL ENTRIES 대체) (0) | 2023.07.18 |
[Syntax] VALUE - structure 와 internal table에 값 할당 (0) | 2023.07.18 |
[Syntax] COND, SWITCH 문 (SQL의 case문과 유사) (0) | 2023.07.18 |
댓글