我正在使用SAP Gateway开发消耗oData服务的SAPUI5应用程序。我已经实现了一个搜索功能,它正在生成一个SQL条件。条件的一部分如下所示:... OR DESCRIPTION LIKE '%searchString%'...
。在我的数据库表格中,我有一个字段DESCRIPTION
,其类型为LCHR
长度32000
。唯一的问题是字段DESCRIPTION
不能在WHERE
子句中。
通过oData服务在数据库表中搜索长字符串的正确方法是什么?我是否需要对搜索功能进行硬编码或是否有更简洁的方式?
答案 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.
一切都应该有效。希望能帮助到你。谢谢!