【问题标题】:In App Maker, how do you make dynamic table cell text?在应用制作工具中,如何制作动态表格单元格文本?
【发布时间】:2019-10-31 15:48:43
【问题描述】:

在应用制作工具中,我正在显示一个表格,并希望使用来自另一个表格的数据查找将表格单元格数据替换为不同的文本。假设有两个表,DepartmentsEmployees

  • Departments 是两个字段,DeptID 和 DeptDescription。
  • Employees 是多个字段,包括 DeptID。

Employees 的列表中,我想将DeptID 替换为DeptDescription。 (页面数据源是Employees。我不想在数据模型之间建立关系。)

我猜我想在onDataLoad 事件中为 DeptID 的表格单元格标签编写一些脚本。到目前为止我有这么多:

 app.datasources.Departments.query.filters.DeptID._equals = widget.datasource.item.DeptID;
 app.datasources.Departments.newQuery().run();
 widget.text = app.datasources.Departments.item.DeptDescription;

我知道这不正确,但我接近了吗?

【问题讨论】:

  • 不确定为什么不想在表之间建立关系?这会让事情变得简单得多。您当前的代码只会对员工表中的第一项运行一次查询,并且您将客户端代码与服务器代码混合在一起,因此这不起作用。我可以想到一个可能的解决方案,但需要一点时间来收集我的想法。
  • 我正在寻找完成此类任务的机制,因为我们正在将整个系统转换为 Google Cloud。建立关系不是一种选择,因为我们使用的是在应用程序之外管理和维护的 MySQL 表。 AppMaker 将数据模型更改应用于数据库。像 Departments 这样的表可能与数百个其他表相关,如果您对具有 Department 字段的所有内容执行此操作,则将其乘以可能用于下拉列表或建议的每个成本代码、供应商、员工、零件号等数百个应用程序的框...
  • 在 PHP 中,我将遍历主要数据源记录并写入我的表行。我会在读取每条记录后停下来,对另一个表进行快速查询,然后将描述写入 Dept 单元格。我正在寻找如何通过 AppMaker 界面完成此任务。

标签: google-app-maker


【解决方案1】:

这个答案未经测试,但我想提出一个可能的解决方案,它不需要大量的数据库调用,尤其是那些重复调用服务器脚本的解决方案,这可能会在您进行订单项调用时消耗大量处理时间.

  1. 在部门模型下设置单独的数据源。将默认的“查询生成器”更改为“查询脚本”并添加“列表(数字)”或“列表(字符串)”类型的参数,这应该与您的主键字段类型匹配。取消选中“自动加载”选项。
  2. 在“查询脚本”部分输入以下代码:

    query.filters.Id._in = query.parameters.YourParameter;

    返回查询.run();

  3. 转到应生成表的员工数据源并找到“加载时”客户端脚本部分。在此部分输入以下代码:

    var departmentDs = app.datasources.YourDepartmentsDs;

    departmentsDs.properties.YourParameter = datasource.items.map(function(deptIds) {return deptIds.DeptID;});

    departmentDs.load();

  4. 现在转到包含您的表格的页面。如果您尚未创建标签小部件,请立即创建。在文本绑定的标签小部件中输入以下内容:

    @datasources.YourDepartmentsDs.loaded && (@datasources.YourDepartmentsDs.items).map(function(Id){return Id.Id}).indexOf(@widget.datasource.item.DeptID) !== -1 ? @datasources.YourDepartmentDs.items[(@datasources.YourDepartmentsDs.items).map(function(Id){return Id.Id}).indexOf(@widget.datasource.item.DeptID)].DeptDescription : '无法检索部门说明'

如上所述,这是未经测试的,我在没有应用程序制作工具的情况下从内存中编写代码,因此可能需要一些额外的调整。选择 J.G. 提出的第一个选项。不过,这也是一个非常可行的解决方案。我很抱歉,但代码格式化程序似乎对我不起作用。

【讨论】:

  • 我喜欢这个!我没有尝试将查找表加载到属性中,但听起来很棒。
  • 我想感谢你的建议,但它对我来说有点太复杂了,所以我最终得到了上面的答案。
  • @Jeff 另一种方法是为部门设置一个数据源,将其限制设置为 0。在应用程序启动脚本期间加载此数据源,然后您仍然可以在第 4 步中使用绑定。基本上,步骤 4 中的绑定类似于 Excel/GSheets 中的 vLookup 函数。我猜你的部门表可能没有数百条记录,此时表的满载可能会降低效率。如前所述,当您可能有 25 行时,使用服务器函数检索表行上的记录会消耗一些资源。
  • 我想试一试,但我不明白第4步中的代码。“&&”是做什么的?为什么在“.map”之前的代码的某些部分周围有括号?在“function(Id){return Id.Id}”中,是“LD”还是“id”,它代表什么?什么是“!== -1?”?这是标准编程语言语法还是 App Maker 专有的语法?很抱歉这些基本问题,但我是一名必须学习 App Maker 的大型框架程序员,它没有任何支持、手册或课程。应用制作工具中的帮助按钮将您带到这里。感谢您的耐心等待。
  • @Jeff '!== -1' 表示在值数组中未找到值时的返回值。它相当于 Excel 等 Vlookup 中的“N/A”评估,它表示在查找表中未找到该值。另外,请记住,步骤 4 纯粹是一个绑定,就像在 AM 中工作的大多数其他绑定一样。 '&&' 是一个 'and' 评估器,就像在标准 JS 中一样。基本上,第 4 步是使用绑定和评估组合的表达式。一些绑定在它们周围有 '()' 的原因是因为它需要访问一些 JS 数组函数,如 .map()
【解决方案2】:

1 方式)如果您需要绕过使用关系功能,请创建一个连接您的表的聚合表。这样就可以在数据源定义中使用sql连接两个表

2) 如果您不想创建新表。将文本从值绑定更改为“更多选项”

=getDescription(@datasource.item.DeptId)

然后是您在客户端脚本中编写的代码

function getDescription(id){
  google.script.run
  .withSuccessHandler(function successHandler(result){    return result;})
  .withFailureHandler( function failureHandler(e){ console.log(" Failed" +e);})
  .queryValue(id); 

}

服务器端脚本:

function queryValue(id){ 
  var query = app.models.Departments.newQuery();
  query.filters.DeptID._equals = id;
  var results = query.run();
  return results[0]["DeptDescription"];
}

最后一行可能是 results[0].DeptDescription

【讨论】:

  • 文本值的绑定没有客户端或服务器端脚本区域,只有脚本区域。我无法知道该脚本区域是客户端还是服务器端。左侧面板中 PAGES 下的 SCRIPTS 区域是否可以放置其中之一?
  • 哦,等等,你的意思是我将这两个脚本添加到数据模型客户端/服务器脚本区域吗?如果有,是员工还是部门?
  • 有两个客户端脚本区域,onLoad 和 onItemChange。我猜 onItemChange 是放置它的地方。这会获得第一条记录,还是我也需要将其放入 onLoad?
  • 脚本区域在您添加页面的左侧下方。添加一个客户端脚本和一个服务器脚本。
  • 我终于能够通过一些调整让它工作。服务器脚本与 results[0].DeptDescription 一样很好。客户端脚本的工作方式与编写的不完全一致,但我将其与此处另一个答案的类似脚本结合在一起 - https://stackoverflow.com/questions/41645111 并将其放入标签小部件的 onDataLoad 事件中。我确实将 DeptID 绑定到标签的文本,如果查询没有失败,则让脚本覆盖。感谢您的所有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 2010-10-28
  • 2021-08-24
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
相关资源
最近更新 更多