数据源分页问题(再次修订)

时间:2019-06-11 02:16:34

标签: google-app-maker

请参见Datasource Paging Issue (Revised) 原来的问题。

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 = ['属性名称伦敦SW45'], 我得到同样的重用。

您是否知道会导致此问题的原因以及我可以采取的解决方法?

1 个答案:

答案 0 :(得分:0)

使用服务器端解决方案,我建议同时编辑应该由该属性列表过滤的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;});
}

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