ABAP 宿主表达式(Host Expressions)的简单使用

ABAP宿主表达式是一种在ABAP 7.40及更高版本中引入的特性,‌它允许在SQL表达式的操作数位置或编写SQL语句的工作区中使用任何ABAP表达式。‌ 这种表达式通过在表达式前加上@符号来标识,‌形式为@(abap_expression)。‌宿主表达式的引入,‌使得ABAP开发者能够更灵活地在SQL查询中使用ABAP的计算结果,‌从而丰富了SQL查询的功能和表达能力。‌

宿主表达式的应用场景非常广泛,‌包括但不限于:‌

  • 构造表达式:‌用于创建复杂的数据结构。‌
  • 内表访问表达式:‌用于从内存表或其他数据源中读取数据。‌
  • 算术表达式:‌进行数学运算。‌
  • 字符串表达式:‌处理文本数据。‌
  • bit表达式:‌处理二进制数据。‌
  • 内建函数:‌使用SAP提供的函数进行处理。‌
  • 函数性的方法:‌调用定义在类中的方法。‌

通过使用宿主表达式,‌开发者可以将ABAP的计算结果直接嵌入到SQL查询中,‌这不仅增加了SQL查询的灵活性,‌也提高了代码的复用性和可维护性。‌例如,‌开发者可以使用宿主表达式来动态构建查询条件,‌或者根据业务逻辑动态调整查询结果的处理方式。‌

此外,‌宿主表达式的计算是从左到右进行的,‌其结果作为宿主变量传递给数据库,‌可以视为通过ABAP表达式为ABAP帮助变量赋值的简写。‌这种特性使得ABAP开发者在处理复杂的数据查询和业务逻辑时更加得心应手,‌同时也为SAP系统的性能优化和业务逻辑的实现提供了更多的可能性。‌

 

【Constructor expression】构造表达式

DATA(countryfr) = |Germany|.

SELECT carrid, connid, countryfr, cityfrom, cityto FROM spfli
 WHERE countryfr = @( COND #( WHEN countryfr = 'America' THEN 'US'
                              WHEN countryfr = 'Japan' THEN 'JP'
                              WHEN countryfr = 'Germany' THEN 'DE'
                              WHEN countryfr = 'Singapore' THEN 'SG'
                              ELSE 'ZH') )
  INTO TABLE @DATA(result).

cl_demo_output=>display( result ).

执行结果:

 

【Table Expressions】内表表达式

需要注意的是,在使用表达式的方式访问内表时,若内表内容未找到,并不会给sy-subrc返回值。而是会抛出异常cx_sy_itab_line_not_found

SELECT carrid, connid, cityfrom, cityto, countryfr
  FROM spfli INTO TABLE @DATA(flight_tab).
*
TRY .

    SELECT carrid, connid, cityfrom, cityto,  countryfr FROM spfli
     WHERE countryfr = @( flight_tab[ 1 ]-countryfr )
      INTO TABLE @DATA(flight_land).

    cl_demo_output=>write( flight_tab[ 1 ] ).

    cl_demo_output=>write( flight_land ).

  CATCH cx_sy_itab_line_not_found.

    cl_demo_output=>write('GG').
ENDTRY.

cl_demo_output=>display( ).

执行结果:

 

【String Expressions】字符串表达式

目前唯一的字符串运算符:&&

DATA cityfrom TYPE spfli-cityfrom VALUE 'SAN'.

SELECT carrid, connid, cityfrom, cityto FROM spfli
 WHERE cityfrom = @( |{ cityfrom } | && `FRANCISCO` ) " } | 中间有空格
  INTO TABLE @DATA(result).

cl_demo_output=>display( result ).

执行结果:

 

函数性的方法

调用定义在类中的方法

CLASS demo DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:
      main,
      input RETURNING VALUE(free_seats) TYPE i.
ENDCLASS.

CLASS demo IMPLEMENTATION.
  METHOD main.
    SELECT carrid, connid, fldate, seatsmax, seatsocc,
           seatsmax - seatsocc AS seatsfree
           FROM sflight
           WHERE seatsmax - seatsocc > @( input( ) )
           INTO TABLE @DATA(result).
    cl_demo_output=>display( result ).
  ENDMETHOD.
  METHOD input.
*    cl_demo_input=>request( CHANGING field = free_seats ).
    free_seats = 450.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  demo=>main( ).

执行结果:

 

posted @ 2024-08-06 16:08  做梦都笑醒  阅读(11)  评论(0编辑  收藏  举报