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( ).
执行结果: