关于用CL_SHDB_SELTAB转换select-options为sql-where的一些小记录

先看这个例子:

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...

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值