相关服务中串联值属性的带有列表选择器的MDK筛选器操作

2020-08-14 17:23发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,团队。

我正在开发一个MDK应用程序,试图应用从列表选择器自动继承的某些过滤器,而该过滤器是在与可过滤对象表相关的过滤器操作中调用的过滤器页面中的。

对于该属性为直接值的列表选择器,它可以按预期工作。

例如:

FilterProperty:" COUNTRY_ID"

为OData服务/实体生成的过滤器:" $ filter = COUNTRY_ID eq'US'"

但是,当在相关的OData服务/实体中具有连接值的属性时,当前存在一种情况。

属性值示例:TAG_CONCAT ='H00002,H00035,H00435,H00878'

如果我们在列表选择器中通过以下方式设置FilterProperty:

FilterProperty:" TAG_CONCAT"

为OData生成的过滤器类似于:" $ filter =(TAG_CONCAT eq'H00035'或TAG_CONCAT eq'H00878')"

在大多数情况下,它们不会检索所需的行。

针对这种情况的解决方案(在Fiori/Web中的等效应用程序中实现)是使用Odata函数" substringof"以使条件如下:

" $ filter =(substringof('H00035',TAG_CONCAT)或substringof('H00878',TAG_CONCAT))"

我已经在列表选择器中尝试过这种方式:

FilterProperty:" substringof(,TAG_CONCAT)"

但是正在生成类似以下的过滤器:

" $ filter =(substringof(,TAG_CONCAT)eq'H00035'或substringof(,TAG_CONCAT)eq'H00878'))

并且不起作用。

我已经研究了一些地方,以尝试覆盖或更改生成的过滤器,因此我可以对其进行修复,并保留"列表选择器"功能,以及通常的"过滤器页面"功能,但没有成功。

我也尝试过在对象表透明度的查询选项中添加一些过滤器,但似乎如果它已与操作中的"可过滤"对象相关,则QueryOptions中的过滤器将被丢弃。

在这种情况下,请评论可能的选项或解决方法。

在此先感谢您的帮助。

最好的问候

爱德华多

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,团队。

我正在开发一个MDK应用程序,试图应用从列表选择器自动继承的某些过滤器,而该过滤器是在与可过滤对象表相关的过滤器操作中调用的过滤器页面中的。

对于该属性为直接值的列表选择器,它可以按预期工作。

例如:

FilterProperty:" COUNTRY_ID"

为OData服务/实体生成的过滤器:" $ filter = COUNTRY_ID eq'US'"

但是,当在相关的OData服务/实体中具有连接值的属性时,当前存在一种情况。

属性值示例:TAG_CONCAT ='H00002,H00035,H00435,H00878'

如果我们在列表选择器中通过以下方式设置FilterProperty:

FilterProperty:" TAG_CONCAT"

为OData生成的过滤器类似于:" $ filter =(TAG_CONCAT eq'H00035'或TAG_CONCAT eq'H00878')"

在大多数情况下,它们不会检索所需的行。

针对这种情况的解决方案(在Fiori/Web中的等效应用程序中实现)是使用Odata函数" substringof"以使条件如下:

" $ filter =(substringof('H00035',TAG_CONCAT)或substringof('H00878',TAG_CONCAT))"

我已经在列表选择器中尝试过这种方式:

FilterProperty:" substringof(,TAG_CONCAT)"

但是正在生成类似以下的过滤器:

" $ filter =(substringof(,TAG_CONCAT)eq'H00035'或substringof(,TAG_CONCAT)eq'H00878'))

并且不起作用。

我已经研究了一些地方,以尝试覆盖或更改生成的过滤器,因此我可以对其进行修复,并保留"列表选择器"功能,以及通常的"过滤器页面"功能,但没有成功。

我也尝试过在对象表透明度的查询选项中添加一些过滤器,但似乎如果它已与操作中的"可过滤"对象相关,则QueryOptions中的过滤器将被丢弃。

在这种情况下,请评论可能的选项或解决方法。

在此先感谢您的帮助。

最好的问候

爱德华多

付费偷看设置
发送
4条回答
大简至美
1楼 · 2020-08-14 17:39.采纳回答

如果希望自定义过滤器页面以与标准过滤器页面相同的方式显示,则仍可以使用"过滤器操作"。 我将如何在OnLoaded中设置当前过滤器。 这是我的自定义过滤器的示例。

通过调用以下内容并将yearFilter存储到上一页中的Client Data中,我得到要存储的选择器值

 let yearFilter = clientAPI.evaluateTargetPath('#Page:CustomFilter/#  Control:YearPicker/#Value'); 

因为我允许从列表选择器中进行多个选择,所以我在OnLoaded中设置给控件的值必须是返回值的数组。 由于我存储在客户数据中的数组包含返回值和显示值,因此我需要构造一个新的返回值数组以设置到选择器。

导出默认函数SetFilterDefaults(context){
   让prevPage = context.evaluateTargetPathForAPI('#Page:-Previous');
   让clientData = prevPage.getClientData();
   让yearFilter = clientData.yearFilter;
   让yearPicker = context.evaluateTargetPathForAPI('#Page:CustomFilter/#Control:YearPicker');
   如果(yearFilter && yearFilter [0]){
     让我们选择= [];
     for(让i = 0; i   
Haoba3210
2楼-- · 2020-08-14 17:42

嗨,比尔。

通过仅发送具有setValue()函数返回值的JSON数组,解决了该问题。

关于使用过滤器操作,最初我尝试使用它,但是它迫使我分配一个可过滤的对象(在这种情况下,列表页面中的相关对象表)。 这样可以避免在相关的QueryOptions规则上影响查询的行为。 实际上,我试图在主页上为该Filterable对象使用一个虚拟对象表,但是那里从未传递过on过滤器成功操作。 最终,我通过正常的导航操作实现了这一点,并且效果很好。

感谢您的快速回复和所有帮助。

最好的问候

爱德华多

---附加评论:

之所以没有使用"筛选器操作",是因为"查询选项"不适用于我们,仅在iOS中,当我们为哪个实体提供服务时,DataQueryBuilder()(无法避免默认的MDK搜索) 支持参数,如下所示:

//InputParams( ='')/结果

此实体是使用Hana后端中的" xsodata"工件创建的。

希望并希望您能对此进行审核,以避免我们实施某些变通办法。

感谢和问候

Eduardo

SKY徐
3楼-- · 2020-08-14 17:59

Eduardo,

在这种情况下,自动过滤器将对您不起作用。 筛选器操作当前仅支持与指定字段的完全匹配。 我们对路线图进行了增强,以支持过滤器的数据查询构建器,但在此之前,您需要实现自己的自定义过滤器作为解决方法。

在过滤器页面中,您将不希望将列表选择器映射为返回值,而是可能将所选值存储在上一页(列表页面)的客户端数据中。 在列表页面上,您将需要为查询选项编写一条规则,以检查存储的过滤器值并解析并根据您的自定义逻辑(在这种情况下,应用为子字符串)应用于查询选项。

通过使用一些其他规则,您将能够实现过滤器相同的基本行为。

-Bill

callcenter油条
4楼-- · 2020-08-14 17:54

感谢Bill。

我遵循了您的建议,并且已经实现了一个带有列表选择器的页面(没有到达其的过滤器操作),并且我将带有要过滤的对象表的页面的相关clientData传递给要获取的列表选择器值 与控件的getValue()函数配合使用,并且按预期方式工作。

当前问题是当我使用列表选择器导航回"筛选器页面"时。 我想用相关控件的setValue()函数填充页面的OnLoaded事件中的列表选择器,但是到目前为止还不能正常工作(OnLoaded中的代码附带的屏幕截图)。

目前,我正在按原样传递JSON对象,并使用通过" getValue()获得的值(尝试在setValue()处设置的值附加值)

setValue()参数应该不同吗? 这样可以正常使用,并且需要控件的redraw()或其他功能吗?

我已将代码放在页面的" OnLoaded"事件中,但是我不知道是否需要在其他地方。

提前感谢您的评论。

最好的问候

Eduardo

一周热门 更多>