课程章节介绍
让我们来聊聊在Salesforce的触发器(Trigger)中,如何有效地处理`Trigger.new`中的记录。特别是当我们想要查询和过滤认证尝试记录时,应该注意哪些关键点。
首先,`Trigger.new`包含了触发器触发时所有被插入或更新的记录。在这个场景中,我们关注的是认证尝试记录。我们的目标是构建一个查询,只检索那些对我们有用的记录,这样可以减少处理的数据量,提高效率。
### 1. 过滤记录
我们首先可以排除那些状态不是“通过”的认证尝试记录。因为这些记录不会对持有认证的人产生贡献。所以,我们的查询应该只包含那些状态为“通过”的记录。
### 2. 检查记录是否刚刚获得“完整/通过”状态
如果触发器是在记录更新时触发的,我们需要确定哪些记录是刚刚获得“完整/通过”状态的。为了做到这一点,我们可以使用`Trigger.old`来查看更新前的记录状态。如果`Trigger.old`中的状态不是“完整/通过”,而`Trigger.new`中的状态是“完整/通过”,那么这条记录就是刚刚获得这个状态的。
### 示例
假设我们有以下字段:
- ,记录ID,:在`Trigger.new`中,这些记录已经有ID,因为触发器是在记录已经插入或更新后触发的(后触发状态)。
- ,候选人ID,:标识尝试认证的候选人。
- ,认证ID,:标识具体的认证。
- ,与认证相关的元素数量,:可能与认证相关的其他元素数量。
- ,尝试状态,:标识认证尝试的当前状态。
### 查询构建
我们可以构建一个查询,只选择那些状态为“通过”的记录,并且检查这些记录是否刚刚从其他状态变为“通过”。这可以通过比较`Trigger.old`和`Trigger.new`中的状态来实现。
### 代码示例
```apex
for (Certification_Attempt__c attempt : Trigger.new) {
// 检查状态是否为“通过”
if (attempt.Status__c == 'Passed') {
// 检查是否刚刚获得“通过”状态
Certification_Attempt__c oldAttempt = Trigger.oldMap.get(attempt.Id);
if (oldAttempt.Status__c != 'Passed') {
// 这条记录刚刚获得“通过”状态
// 在这里添加你的处理逻辑
}
}
}
```
通过这种方式,我们可以确保只处理那些真正需要关注的记录,从而提高触发器的效率和性能。希望这个解释对你有帮助!如果有任何问题,随时问我。