gpt4 book ai didi

ajax - 在 Visualforce 表中标记要更新的特定记录

转载 作者:行者123 更新时间:2023-12-02 03:38:21 25 4
gpt4 key购买 nike

我创建了一个搜索页面,该页面使用自定义 Controller 和 Visualforce 页面返回集合记录。用户可以更新个别记录的特定字段。

我希望能够一次保存所有更改的记录,但操作命令会更新整个返回集——而不仅仅是更改的记录。该应用程序要求仅更新修改的记录。

如果没有对记录中可能发生的每一个更改进行过滤或在每条记录上放置一个保存按钮,有没有人对如何识别被修改的特定记录有创意,以便应用程序可以只保存那些被修改的记录被编辑了?

最佳答案

非常有趣的问题:)

关于通过字段描述或 JSON 序列化跟踪“旧”和"new"之间的变化,SFSE 上有一个很酷的答案:Generically walk sObject fields .请注意,我已经链接到我认为最简洁的答案,请考虑阅读整页!

这个问题也很有趣,因为它会将您的逻辑放在更正确的位置 - 在触发器中。因为您应该问问自己,在您的搜索页面上进行不会真正改变任何内容的更新是否可行 - 是否也可以在其他页面上进行?


如果这对您不起作用,这是另一个有趣的技巧。

Sets 在内部使用对象的散列来确定唯一性(不仅仅是 Id,所有字段)。像这样设置是非常好的:

Set<User> users = new Set<User>();

User u1 = new User(Id = UserInfo.getUserId());
User u2 = new User(Id = UserInfo.getUserId(), LastName = 'Doe');

users.add(u1);
users.add(u2);

System.assert(users.contains(u2));

u2.FirstName = 'John';

System.assert(users.contains(u2), users); // boom, headshot. It was there a minute ago, I swear!

通常这是一个缺点,我们被告知使用 Map<Id, sObject>相反,因此 key /哈希/任何内容都不会改变。但在您的情况下 - 您可以将其用作预期功能。

试试这个(未经测试):

  1. 像现在一样获取搜索结果。
  2. 用户无/部分/全部更改并点击“提交”。
  3. 将该列表放入助手中 Set<sObject> (使用 addAll 方法)。
  4. 再次将搜索结果提取到另一个帮助列表。确保您查询的字段完全相同。
  5. 调用mySet.removeAll(originals); - 应该清除所有相同的项目。
  6. 将幸存者放入最终的帮助列表中并对其调用更新。

这有一些缺点,例如,如果有人在此期间修改了其中一条记录 - 来自 #4 的查询将产生不同的结果......您可以通过存储原始搜索结果的隐藏副本并比较这些结果来处理它(阅读 List.deepClone ) - 但这意味着你的 View 状态加倍!

(我们也可能会与正确的数据集发生哈希码冲突 - 也许只是放弃 removeAll 并在每个项目上使用 equals。我希望我给了你一些思考)

关于ajax - 在 Visualforce 表中标记要更新的特定记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21836337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com