如何以编程方式将新创建的记录链接到另一个表中的记录

时间:2019-06-16 00:48:46

标签: google-app-maker

谢谢您的建议!

背景 我正在创建一个数据库来跟踪客户下的订单。

Orders”表存储有关订单的常规详细信息,例如客户的姓名,订单日期和交货日期。

单独的“ Order_Items”表存储了客户已订购的特定商品。

这是'Orders表和'Order_Items'表之间的一对多关系,即一个'Order'可以有很多'Order_Items ',但每个'Order_Item'必须仅与一个'Order'相关联。

当前状态 目前,我有一个页面,用户可以在其中创建新的“ Order”记录。然后,用户被带到另一个页面,他们可以在其中创建订单所需的许多“ Order_Item”记录。

期望状态 我要实现的是:当用户创建新的“ Order_Item”记录时,它会自动将当前的“ Order”记录分配为新的“ Order_Item”记录的外键。

到目前为止我尝试过的事情

用户的手动操作:在“ Order”及其所有“ Order_Items”之间建立链接的一种方法是添加一个下拉菜单小部件,它可以有效地询问用户诸如“所有这些商品都属于哪个订单号”?用户的操作随后将在两个表之间建立链接并关联一个'Order ',其中有许多'Order_Items'。但是,我的目标是改为以编程方式处理此步骤。

官方文档:我提到了offical documentation,它很有用,但是由于我仍在学习中,所以我并不确切知道要搜索什么。 prefetch功能看起来很有希望,但实际上并没有建立链接。它只会更有效地加载关联的记录。

App Maker教程:我发现一个App Maker tutorial创建了一个HR App,用户可以在其中创建“ Departments”列表,然后创建一个列表。 'Employees',然后将'Employee'链接到'Department'。但是,在示例应用程序中,此连接是由用户手动建立的。在我想要的状态下,我希望以编程方式建立链接。

手动保存模式: 我还尝试过切换到manual save mode,以便用户必须先创建草稿“ Orders”记录,然后再创建多条草稿“ Order Items”记录,然后一次保存它们。但是,我还没有做到这一点。我不确定这种方法的失败是否是因为1)我试图在多个表上创建草稿记录,2)我做得不正确,或者3)我以为我在该草稿的某处读过记录已弃用。

其他想法

我对该领域非常陌生,可能是错误的,但是我觉得我可能需要使用一些脚本来建立链接。例如,也许我可以使用全局变量来记住用户创建的“ Order”。然后,对于每个'Order_Item',我可以使用onBeforeCreate事件来触发一个脚本,该脚本建立被记住的'Order_Item'和'Order'之间的链接来自先前建立的全局变量。

更新的问题

感谢Markus和Morfinismo的回答。我一直使用两个答案都取得了一些成功。

Morfinismo:我已经在现有记录上成功使用了您指导我的代码,但似乎无法使其用于新创建的记录。

例如:


widget.datasource.createItem(); // This creates a new record

var managerRecord = app.datasources.Manager.item; // This sets the Manager of the currently selected parent record as a variable successfully. 

var teamRecord = app.datasources.Teams.item; // This attempts to set the Manager of the currently selected record as a variable. However, the record that was created in line 1 is not selected. Therefore, App Maker does not seem to know which record this line of code relates to and returns the error Cannot set property ‘Manager’ of null.

// Assign the manager to the team.
teamRecord.Manager = managerRecord; // This successfully assigns the manager but only in cases where the previous line of code was successful (i.e. existing records and not newly created ones).

您对如何将此代码应用于第1行中的初始代码行创建的记录有任何建议或评论吗?

2 个答案:

答案 0 :(得分:0)

我在您的问题下发表的评论包括指向official documentation的链接,该链接解释了您的需求。无论如何,您的问题尚不清楚,无法确定您是通过客户端脚本还是通过服务器脚本创建记录,因此这是一个非常通用的答案。

要通过client script管理关系:

var managerRecord = app.datasources.Manager.item;
var teamRecord = app.datasources.Teams.item;

// Assign the manager to the team.
teamRecord.Manager = managerRecord;

// Changes are saved automatically if the datasource in auto-save mode

// Add a team member to a Manager's team.
// Note: Retrieve Members on the client before proceeding, such as by using prefetch option in datasource - datasources Team -> Members)
var engineerRecord = app.datasources.TeamMember.item;
teamRecord.Members.push(engineerRecord);

要通过server script管理关系:

// Get the record for the Team to modify.
var teamRecord = app.models.Teams.getRecord("team1");

// Assign a manager to the Team.
var managerRecord = app.models.EmployeeDB.getRecord("manager1");
teamRecord.Manager = managerRecord;

// Note: The new association is not saved yet

// Assign a team member to the Team.
var engineerRecord = app.models.EmployeeDB.getRecord("engineer1");
teamRecord.Members.push(engineerRecord);

// Save both changes to the database.
app.saveRecords([teamRecord]);

以上信息直接取自官方文件,就像我说的,我在您的问题下发表的评论中提到了

答案 1 :(得分:0)

我发现针对诸如您这样的情况创建相关项目的最简单方法是,实际上是导入一个数据源设置为Parent: Child (relation)Parent: Child (relation) (create)的表单。因此,在您的情况下,数据源需要设置为Order: Order_Items (relation)

您可以使用表单小部件向导以两种不同的方式来完成此任务:

选项1:

  1. 如果您的页面数据源设置为Order_Items,请将表单拖到页面上。
  2. 在“数据源选择”部分中,表单小部件中的数据源应默认为“继承:Order_Items”。单击左下角的“高级”按钮,然后从“数据源”类别中找到“订单”作为数据源,然后在下一个字段中选择关系,然后在下一个字段中选择“ Order_Items”,选择“仅插入”或“编辑”表单,然后在表格中添加所需的字段。
  3. 现在,以该表单创建的每个项目都将自动成为“订单”数据源中当前选定记录的子记录。

选项2:

  1. 如果页面数据源设置为“订购”,则将表单拖到页面上。
  2. 在“数据源选择”部分中,表单小部件中的数据源应默认为Inherited: Order。在数据源选择部分中向下滚动,直到找到Order: Order_Items (relation),然后选择“仅插入”或“编辑”表单,然后选择所需的表单域。
  3. 现在,以该表单创建的每个项目都将自动成为“订单”数据源中当前选定记录的子记录。

在您的Order模型中,确保正确设置了安全设置,以允许用户在Order中创建Order_Items的关系。我认为这是最简单的方法,因为您不必将父代硬编码到表单或客户端/服务器脚本中。它自动基于当前选择的父级,并且基本上执行@Morfinismo在客户端脚本部分中说明的相同操作。