1

我正在使用 SAP Gateway 开发一个使用 OData 服务的 UI5 应用程序,我在其中实现了一个搜索功能,该功能生成一个 SQL where条件。条件的一部分如下所示... OR DESCRIPTION LIKE '%searchString%'...:在我的数据库表中,我有一个DESCRIPTION类型为LCHRlength的字段32000。唯一的问题是该字段DESCRIPTION不能在WHERE子句中。

通过 OData 服务在数据库表中搜索长字符串的正确方法是什么?我需要对搜索功能进行硬编码还是有一些更简洁的方法?

4

1 回答 1

3

答案是CDS 表函数。基本思想是将搜索下推到由AMDP实现的 HANA 。我做了一些本地测试,通过具体代码来回答这个问题。

我创建了一个表zza_test

@EndUserText.label : 'TEST'
@AbapCatalog.enhancementCategory : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #LIMITED
define table zza_test {
    key mandt : mandt not null;
    key bukrs : bukrs not null;
    cnt       : abap.int4;
    des       : abap.lchr(2000);
}

定义了一个zza_test_tf带参数的 CDS 表函数search_str

@EndUserText.label: 'TEST TF'
define table function zza_test_tf
with parameters
    @Environment.systemField: #CLIENT
       clnt   :abap.clnt,
       search_str : char255
returns
{
    mandt : mandt;
    bukrs : bukrs;
    cnt   : abap.int4;
    des   : abap.lchr(2000);

}
implemented by method zcl_zza_test_tf=>search_des;

创建一个zcl_zza_test_tf带接口的类if_amdp_marker_hdb并实现方法search_des

class zcl_zza_test_tf definition
public
final
create public .

public section.
  interfaces if_amdp_marker_hdb.
  class-methods search_des

      for table function zza_test_tf.
 endclass.

class zcl_zza_test_tf implementation.
   
   method search_des by database function for hdb
      language sqlscript
      options read-only
      using zza_test.
   
      return select mandt,bukrs, cnt, des
                from zza_test where des like concat( concat( '%', 
                   :search_str), '%');

   endmethod.

endclass.

现在我们有了一个带参数的 CDS 表函数。运行 CDS 视图并输入搜索参数以获取结果。您甚至可以使用模糊搜索在您的 AMDP 实现中定义您的 HANA SQL 。

为了满足要求,您在网关层的此 CDS 视图上实现 Open SQL 选择。

data:
    lt_test type standard table of ZZA_TEST_TF.

select * from ZZA_TEST_TF( search_str = 'DUM' ) into table @lt_test.

一切都应该工作。希望能帮助到你。谢谢!

于 2018-01-08T13:56:42.223 回答