先看这个例子:
TABLES:vbak.
SELECT-OPTIONS:vbeln FOR vbak-vbeln,
auart FOR vbak-auart.
DATA(lv_where) = cl_shdb_seltab=>combine_seltabs(
it_named_seltabs = VALUE #(
( name = 'VBELN' dref = REF #( vbeln[] ) )
( name = 'AUART' dref = REF #( auart[] ) ) ) ).
SELECT SINGLE * FROM vbak INTO @data(wa_vbak)
WHERE (lv_where).
程序运行后dump了
通过查看notes:2669135 - Using class cl_shdb_seltab method combine_seltabs的解释,这个类 CL_SHDB_SELTAB是用来转换range tables成sql-where子句到HANA DB层使用的,而不是用来生成Open-SQL。这里顺便唠叨一下,我们要知道select-options不是SQL功能,它是一个ABAP(或OPEN SQL)功能,SQL脚本不能理解它,因此考虑将select-options变量(range)直接推送到数据库层是不可能的。所以就有了将这些select-options选项转换为SQL理解的where语句的需求,而AMDP可以帮我们实现这个需求。
notes的解释:
因此我们可以创建一个类似的AMDP类,然后在程序中使用它
AMDP类暂时只能在ADT里面创建
CLASS zcl_amdp_select_options DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES if_amdp_marker_hdb.
TYPES:zvbak_tab TYPE STANDARD TABLE OF vbak.
CLASS-METHODS execute IMPORTING VALUE(iv_where_cond) TYPE string
EXPORTING VALUE(result) TYPE zvbak_tab.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS zcl_amdp_select_options IMPLEMENTATION.
METHOD execute BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT
OPTIONS READ-ONLY using vbak.
RESULT = APPLY_FILTER(vbak, :iv_where_cond);
ENDMETHOD.
ENDCLASS.
在ADT new-abap class后激活就可以在ABAP程序中使用了。
TABLES:vbak.
SELECT-OPTIONS:vbeln FOR vbak-vbeln,
auart FOR vbak-auart.
DATA(lv_where) = cl_shdb_seltab=>combine_seltabs(
it_named_seltabs = VALUE #(
( name = 'VBELN' dref = REF #( vbeln[] ) )
( name = 'AUART' dref = REF #( auart[] ) ) ) ).
* SELECT SINGLE * FROM vbak INTO @data(wa_vbak)
* WHERE (lv_where).
zcl_amdp_select_options=>execute(
EXPORTING
iv_where_cond = lv_where
IMPORTING
result = DATA(lt_itab) ).
READ TABLE lt_itab INTO DATA(wa_vbak) INDEX 1.
that's all,thanks...