如何在Google App Maker中将记录从一个模型移动到另一个模型

时间:2018-05-31 16:39:05

标签: sql google-app-maker

我在Google App Maker中创建了2个SQL模型。为简单起见,我们可以说模型1具有可以为每个记录添加和编辑的所有信息。模型2用作存储模型,一旦模型1中的记录被移除,它就会移动到模型2.想法是个人可以单击“已移除”布尔值,这将打开一个对话框页面以添加注释以便删除一旦完成,记录将被移至模型2进行存储,并且在模型1中将不再可见。

有没有办法做到这一点?如果您需要更多信息,请告诉我,我会尝试提供,但我无法发布现有应用程序的原因是因为信息是保密的。

谢谢你的帮助!

Models

2 个答案:

答案 0 :(得分:0)

更新回答:转到其他模式

如果要强制用户输入消息,则需要禁止他们通过数据源删除记录:

// onBeforeDelete model event
throw new Error('You should provide message prior deleting a record');

然后你需要实现审计本身:

// server script
function archive(itemKey, message) {
  if (!message) {
    throw new Error('Message is required');
  }

  var record = app.models.MyModel.getRecord(itemKey);

  if (!record) {
    throw new Error('Record was not found');
  }

  var archive = app.models.Removed.newRecord();
  archive.Field1 = record.Field1;
  archive.Field2 = record.Field2;
  ...
  archive.Message = message;

  app.saveRecords([archive]);
  app.deleteRecords([record]);

}

// client script
google.script.run
  .withSuccessHandler(function() {
    // TODO
  })
  .withFailureHandler(function() {
    // TODO
  })
  .archive(itemKey, message);

如果您需要为多个/所有模型实施审核,那么您可以通过传递模型的名称并使用Model Metadata来概括代码段:funciton archive(modelName, itemKey, message) {}

原始答案:转到其他数据库

通常我建议只为模型添加并设置一个布尔字段Deleted,并确保标记为已删除的记录不会发送到客户端。由于multiple databases不支持事务,因此在数据库之间移动数据的实现可能很棘手。

如果您迫切希望使您的应用更复杂,更不可靠,您可以使用model event服务JDBC Apps ScriptonBeforeDelete External Database Sample创建记录备份成为你的朋友开始):

// onBeforeDelete model event
var connection = Jdbc.getConnection(dbUrl, user, userPassword);

var statement = connection.prepareStatement('INSERT INTO ' + TABLE_NAME +
              ' (Field1, Field2, ...) values (?, ?, ...)');
statement.setString(1, record.Field1);
statement.setString(2, record.Field2);
...
statement.execute();

为什么需要JDBC?因为App Maker本身并不支持附加到不同数据库的模型。

答案 1 :(得分:0)

我能够使用查询过滤器作为客户端脚本来执行我需要的操作当我导出时,这会将数据保留在后端,并且只显示活动用户未删除的内容。

  1. var datasource1 = app.datasources.WatchList_Data;
  2. datasource1.query.filters.Remove_from_WatchList._equals ='不';
  3. datasource1.load();