从数据库字段的值下拉

时间:2018-02-22 11:59:18

标签: google-app-maker

我遇到了与数据过滤相关的问题。我有一个用于存储数据的Google云端硬盘表,我想在下拉列表中显示此数据源的一个字段,以便按此字段(国家/地区)进行过滤。

Field

Dropdown filter

问题是这个下拉过滤器只显示列表当前页面上显示的国家/地区。例如,如果在第一页显示下拉列表中的一个国家(泰国),我只会看到泰国。

example

如果我们转到列表的第二页,我们还有另外两个国家(西班牙和葡萄牙),然后下拉列表只显示西班牙和葡萄牙。 我真正想要的是一个显示所有国家的下拉列表,无论它们是否在当前页面上,但我不知道如何修复它。

这是国家选择器的配置:

example4

在帮助中,它说我们应该使用@datasource.model.fields.COUNTRY.possibleValues, 但如果我将此参数用作选项,则选择器中不会显示任何内容。

Appmaker Help

我花了很多时间试图解决这个问题但我找不到解决方案,我想和你确认一下这是一个问题还是我做某事错...

你能帮帮我吗?

1 个答案:

答案 0 :(得分:4)

您正在为下拉列表和表使用相同的数据源,并且#distinct()#sort()您正在过滤已加载到浏览器的项目(与存储在数据库中的整个数据集相对)。

您需要为下拉列表提供单独的数据源。至少有三种技术可以做到这一点:

可能的值

您可以为Country字段预定义allowed values,并使用它们填充创建表单和表格过滤@datasource.model.fields.Country.possibleValues中的下拉选项,如您所述: Possible values

为各国创建模型

通过为国家/地区引入专用related model,您可以获得以下好处:

  • 规范化数据(您不会多次存储同一个国家/地区)
  • 你将能够保持你的国家名单清洁(目前的做法是有可能让同一个国家有不同的拼写,如'美国','美国','美国'等)
  • app用户创建新记录时,可以从下拉列表中选择所需的国家/地区(反对每次为所有新记录输入错误)。
  • 您的下拉式绑定将如下这些简单:
// for names
@datasources.Countries.items..Names

// for options
@datasources.Countries.items.._key

// for value
@datasource.query.filters.Country._key._equals

创建计算模型

使用Calculated Model,您可以从表格中挤出唯一的国家/地区值。您的服务器查询脚本可能类似于:

function getUniqueCountries_() {
  var consumptions = app.models.Consumption.newQuery().run();
  var countries = [];

  consumptions.reduce(function (allCountries, consumption) {
    if (!allCountries[consumption.Country]) {
      var country = app.models.CountryCalc.newRecord();
      country.Name = consumption.Country;
      countries.push(country);
      allCountries[consumption.Country] = true;
    }
  }, {});

  return countries;
}

然而,随着您的消费表的增长,它可以为您带来显着的性能开销。在这种情况下,我宁愿研究Cloud SQLCalculated SQL model的方向。

注意:

我给出了一个非常广泛的答案,也涵盖了类似的情况,当时的选项数量可以无限制(与有限的国家号码相对)。