数据源分页问题(修订)

时间:2019-05-16 01:08:00

标签: google-app-maker

一个简单的测试设置:部门:员工,1:M和一个搜索表单,该表单可以过滤Emploee FirstName =,lastname =,电子邮件包含,年龄> =,加入日期<=和相关部门=。

一种搜索表单,其中的窗口小部件绑定到云SQL数据源查询脚本的参数。

搜索表单上的“提交”按钮打开一个查询结果页面,该页面的表绑定到云SQL查询脚本数据源。

查询脚本

var params = query.parameters;

return getEmployeeRecords_( 
  params.param_FirstName, 
  params.param_LastName, 
  params.param_Email, 
  params.param_StartDate, 
  params.param_Age, 
  params.param_Department
);

function getEmployeeRecords_( firstName, lastName, email, startDate, age,     
department) {

 var ds = app.models.Employee.newQuery();

 if ( firstName !== null ) {
    ds.filters.FirstName._equals = firstName;
 }
 if ( lastName !== null ) {
    ds.filters.LastName._equals = lastName;
 }
 if ( email !== null) {
    ds.filters.Email._contains = email;
 }
 if ( startDate !== null) {
    ds.filters.StartDate._greaterThanOrEquals = startDate;
 }
 if ( age !== null) {
    ds.filters.Age._lessThanOrEquals = parseInt(age, 10);
 }
 if ( department !== null) {
    ds.filters.Department.Department._equals = department;
 }

 var records = ds.run();

 // intention is to store this value for future use
 var recs = records.length;

 return records;
}

在查询脚本的结果页面上,数据源分页刚刚中断。正确返回8条记录的查询(其中查询页面大小设置为5)使我可以根据需要将分页器转到页面1000,但是数据源始终位于记录的第一页上。将页面尺寸设置为例如100,可以清楚地显示正确的结果集。

实际上,我对这种查询所做的所有操作都有分页问题。如果我插入这段代码

var ds = app.models.Employee.newQuery();
//ds.filters.FirstName._equals = firstName;
//ds.filters.LastName._equals = lastName;
//ds.filters.Email._contains = '.com';
//ds.filters.StartDate._greaterThanOrEquals = startDate;
ds.filters.Age._lessThanOrEquals = 40;
//ds.filters.Department.Department._equals = department;
ds.sorting.Age._ascending();
var records = ds.run();
return records;

直接进入数据源查询脚本,我仍然遇到类似的分页问题。

如果我使用查询构建器脚本,例如

(
FirstName =? :param_FirstName and
LastName =? :param_LastName and
Email contains? :param_Email and
StartDate >=? :param_Startdate and
Age <=? :param_Age and
Department.Department =? :param_Department
)

和诸如

的绑定

@ datasources.Search_Query_Builder.query.parameters.param_FirstName

这没有问题。与直接过滤相同,我们使用诸如

的绑定

@ datasources.Employee.query.filters.FirstName._equals

任何人都认为这是什么东西出了什么主意。我们需要查询脚本来实现更好的控制,例如,具有检索记录计数的功能以及必须针对限制数据的条件(例如登录的用户与客户端有关,而客户端又与属性有关,并且属性值根据客户端受到限制。

...仅查看正在开发的真实应用程序,并在数据源查询脚本编辑器中使用查询脚本,没有参数,没有绑定,仅此代码:-

var ds = app.models.Incident.newQuery();
ds.filters.Id._greaterThanOrEquals = 200;
ds.filters.Id._lessThanOrEquals = 300;
var records = ds.run();
return records;

,将页面大小设置为20,然后再次使页面分页,即使页面号增加,也永远不会超出记录的第一页。

1 个答案:

答案 0 :(得分:0)

尽管尚不清楚究竟是什么导致了页面调度问题,以及我的建议是否可以解决根本问题,我还是有一些建议来解决此问题。但是,在我自己的应用程序环境中,我有几个实例,在这些实例中,我使用标准SQL模型,然后将过滤器应用于该模型的数据源,然后具有并发计算模型(数据源),该模型返回满足所应用过滤器的记录总数到我的其他数据源。我们开始:

在Employee模型下创建一个新的数据源,将其保留为默认的“查询生成器”类型,根据您的喜好调整查询页面的大小,但最好将其调整为您知道的查询查询时将返回一页以上记录的内容数据源。取消选中“自动加载数据”属性,除非您想在首次进入设置过滤器的页面时加载所有记录。不要在查询构建器中输入任何内容。

对于您称为Employee_RecordCount的计算出的数据源,请添加您的参数,FirstName_equals,LastName_equals,Email_contains,StartDate_greaterequals,Age_lessequals和Departments_equals(如果尚未添加)。在此计算模型中,您应该有一个称为RecordCount的字段。在此数据源的查询脚本部分中,应将函数设为return getEmployeeRecords_(query)

在服务器脚本部分中,getEmployeeRecords函数所在的代码如下:

function getEmployeeRecords_(query) {
 var params = query.parameters;
 var ds = app.models.Employee.newQuery();

 if (params.FirstName_equals !== null ) {
    ds.filters.FirstName._equals = params.FirstName_equals;
 }
 if (params.LastName_equals !== null ) {
    ds.filters.LastName._equals = params.LastName_equals;
 }
 if (params.Email_contains !== null) {
    ds.filters.Email._contains = params.Email_contains;
 }
 if (params.StartDate_greaterequals !== null) {
    ds.filters.StartDate._greaterThanOrEquals = params.StartDate_greaterequals;
 }
 if (params.Age_lessequals !== null) {
    ds.filters.Age._lessThanOrEquals = parseInt(params.Age_lessequals, 10);
 }
 if (params.Department_equals !== null) {
    ds.filters.Department.Department._equals = params.Department_equals;
 }
 var records = ds.run();

 // update calculated model with record count
 var calculatedModelRecord = app.models.Employee_RecordCount.newRecord();
 calculatedModelRecord.RecordCount = records.length;

 return [calculatedModelRecord];
}

现在转到搜索页面,创建一个新面板或将其设置为与您创建的新数据源相同的表单。确保拥有所有适当的字段,并将这些字段的绑定更改为:

@datasource.query.filters.firstName._equals
@datasource.query.filters.lastName._equals
@datasource.query.filters.email._contains
@datasource.query.filters.StartDate._greaterThanOrEquals
@datasource.query.filters.Age._lessThanOrEquals
@datasource.query.fitlers.Department.Department._equals

启动搜索的按钮应具有以下代码:

var ds = widget.datasource;
ds.load(function() {
  app.showPage(app.pages.YourSearchResultPage);
}
var calculatedDs = app.datasources.Employee_RecordCount;
var props = calculatedDs.properties;
props.FirstName_equals = ds.query.filters.firstName._equals;
props.LastName_equals = ds.query.filters.lastName._equals;
props.Email_contains = ds.query.filters.email._contains;
props.StartDate_greaterequals = ds.query.filters.StartDate._greaterThanOrEquals;
props.Age_lessequals = ds.query.filters.Age._lessThanOrEquals;
props.Department_equals = ds.query.filters.Department.Department._equals;
calculatedDs.load();

现在转到搜索结果页面,并确保您具有以下元素:

  1. 将数据源设置为Employee_RecordCount的面板。内 此面板创建标签并将绑定设置为 @datasource.item.RecordCount
  2. 具有数据源集的表 到第一步中创建的相同数据源。确保你的 表格已启用“分页”功能。

仅此而已,这在我的应用程序中有效。设置起来很麻烦,但恐怕这是拥有记录总数的唯一解决方法。我应该指出,我也从未遇到过任何分页问题。