具有长字符串的SAP Gateway oData服务

时间:2018-01-05 14:31:44

标签: sql odata sapui5 abap

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

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

1 个答案:

答案 0 :(得分:2)

答案是CDS Table Function。基本思路是将搜索推送到由AMDP实现的HANA。我做了一些本地测试,通过具体代码回答这个问题。

我创建了一个表 TimeDiscount || DateDiscount TimeDiscount || 0 0 || DateDiscount

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); } 定义了CDS表函数zza_test_tf

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

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

要满足要求,请在GateWay层的此CDS视图上实现Open SQL select。

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.

一切都应该有效。希望能帮助到你。谢谢!