SAP/ABAP
SELECT 시 인터널 테이블을 조건으로 사용할 때
Linkin
2023. 11. 20. 23:40
SELECT 시 테이블을 조건으로 사용해야 될 때가 있다.
CDS View 조인을 하다가 순간 막혀 정리해 보았다.
정리한 3가지 방법을 사용하자.
FOR ALL ENTRIES IN
SELECT a~product,
a~plant,
a~location,
a~batch,
b~locator,
b~bwtar,
a~uom,
FROM I_CdsView( P_Currency = @gv_waers ) AS a
LEFT JOIN mcha AS b ON a~product = b~matnr
AND a~plant = b~werks
AND a~batch = b~charg
FOR ALL ENTRIES IN @gt_booking
WHERE a~plant = @gt_booking-werks
AND a~product = @gt_booking-matnr
AND a~location = @gt_booking-lgort
INTO TABLE @data(lt_data).
- 테이블을 불러와서 조건으로 사용, 정말 편하다.
gt_booking 테이블의 정보를 끌어다가 바로 사용할 수 있다.
Group by 사용이 되지 않는다.
Range Value 사용
LOOP AT gt_itab INTO DATA(ls_tmp).
lt_werks[] = VALUE #( BASE lt_werks[]
sign = 'I' option = 'EQ'
( low = ls_tmp-werks ) ).
lt_matnr[] = VALUE #( BASE lt_matnr[]
sign = 'I' option = 'EQ'
( low = ls_tmp-matnr ) ).
lt_lgort[] = VALUE #( BASE lt_lgort[]
sign = 'I' option = 'EQ'
( low = ls_tmp-lgort ) ).
CLEAR ls_tmp.
ENDLOOP.
SELECT a~product,
a~plant,
a~location,
a~batch,
b~locator,
b~bwtar,
a~uom,
SUM( t_qty ) AS qty
FROM I_CdsView( P_Currency = @gv_waers ) AS a
LEFT JOIN mcha AS b ON a~product = b~matnr
AND a~plant = b~werks
AND a~batch = b~charg
WHERE a~plant IN @lt_werks
AND a~product IN @lt_matnr
AND a~location IN @lt_lgort
GROUP BY a~product, a~plant, a~location, a~batch,
b~locator, b~bwtar, a~uom
INTO TABLE @DATA(lt_data).
- 사용하고 싶은 테이블의 필드를 각각 Range 변수에 담아 in 을 사용해 Select-options처럼 사용한다.
조건마다 변수를 따로 정의해야 하는 번거로움은 있으나 가장 직관적이고 빨리 사용이 가능하다.
Group By 사용 가능하다.
Internal Table 직접 사용
select a~product,
a~plant,
a~location,
a~batch,
b~locator,
b~bwtar,
a~uom,
sum( t_qty ) as qty
FROM I_CdsStockValue( P_Currency = @gv_waers ) as a
left join mcha as b ON a~product = b~matnr
and a~plant = b~werks
and a~batch = b~charg
where a~plant in ( SELECT m~werks FROM @gt_booking AS m )
* 시도하였으나 나머지 조건 사용 불가
* and a~product in ( select n~matnr from @gt_booking as n )
* and a~location in ( select x~lgort from z_itab as x
* where x~werks = @p_werks
* and x~lgort_group in (@c_a, @c_o, @c_i) )
GROUP BY a~product, a~plant, a~location, a~batch,
b~locator, b~bwtar, a~uom
INTO TABLE @DATA(lt_data).
- where 조건에서는 인터널 테이블을 한 번만 사용 가능하다. 그렇기에 다른 조건들에 넣을 수 없다.
하지만 조건이 한번만 필요하다면 편한 방법 같다. 퍼포먼스 적인 면은 좀 더 찾아봐야 한다.
테이블을 변수처럼 @ 처리해서 사용하면 된다.
Group by 사용 가능하다.