首页 > 解决方案 > 数据源分页问题(再次修订)

问题描述

有关原始问题,请参阅数据源分页问题(修订版)

Markus,您很友好地帮助解决了使用计算数据源将记录计数合并到查询中的问题。我有一个包含 15 个小部件的搜索表单 - 混合了日期范围、下拉列表、文本值和 ._contains、._equals、._greaterThanOrEquals、._lessThanOrEquals 等。

我已经针对 mySQL SQL 代码对此进行了广泛的测试,并且效果很好。

我现在添加了第 16 个参数 PropertyNames,它是一个带有绑定 @datasource.query.filters.Property.PropertyName._in 和 Options 空白的列表。表单上的小部件是隐藏的,因为它仅用于额外的过滤。

使用如下逻辑,使得特定登录用户只能查看自己的属性。因此,如果他们执行搜索并且未指定属性,我们会:-

if (params.param_Property === null && canViewAllRecords === false) {
    console.log(params.param_PropertyNames); // correct output
    ds.filters.Property.PropertyName._in  = params.param_PropertyNames;
}

记录计数(records.length)是正确的,如果我循环遍历记录数组,则记录集是正确的。

但是,在结果页面上,表格会显示一个更大的结果集,其中省略了 PropertyNames 过滤器。因此,如果我要搜索状态“打开”(mySQL 结果 50),然后为 params.param_PropertyNames 添加单个值 ['Property Name London SW45'],记录数为 6,记录数组为 6,但数据源显示是 50。所以数据源没有对属性数组进行过滤。

最初我尝试不添加额外的参数和表单小部件,只使用代码,例如

if (params.param_Property === null && canViewAllRecords === false) {
    console.log(params.param_PropertyNames); // correct output
    ds.filters.Property.PropertyName._in  = properties; // an array of 
        properties to filter out
}

但这不起作用,因此想到了向计算的记录计数数据源添加表单小部件和附加参数的想法。

如果我在 query.parameters 进行检查,那么我会看到:-

"param_Status": "Open", 
"param_PropertyNames": ["Property Name London SW45"],

如果我检查 query.filters:-

name=param_Status, value=Open
name=param_PropertyNames, value=[]}]}

看起来好像没有设置过滤器。即使硬编码 ds.filters.Property.PropertyName._in = ['Property Name London SW45'],我也会得到相同的结果。

你知道什么会导致这个问题以及我可以做些什么来解决这个问题吗?

标签: google-app-maker

解决方案


使用服务器端解决方案,我建议编辑应该按此属性列表过滤的 SQL 数据源查询脚本(服务器端),并在服务器端脚本中为计算的 Count 数据源包含相同的代码。代码看起来像这样,不知道你的确切细节:

var subquery = app.models.Directory.newQuery();
subquery.filters.PrimaryEmail._equals = Session.getActiveUser().getEmail();
subquery.prefetch.Property._add();
var results = subquery.run();

if(!results[0].CanViewAllRecords) {
  query.filters.Property.PropertyName._in = results[0].Property.map(function(i) {return i.PropertyName;});
}

通过添加此代码,您将按当前用户过滤您的目录并预取 Property 关系表,然后仅当您的用户 canviewallRecords 为 false 并使用 JS map 函数在 Property 表中创建 PropertyName 字段的数组时才设置过滤器。正如我所说,您的代码可能不完全相同,具体取决于您必须如何检索用户 canviewallrecords 属性,然后当然我也不知道您在用户和属性表之间的关系,是一对多还是其他. 但这应该让您了解如何在服务器端实现这一点。


推荐阅读