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 사용 가능하다.