salesforce - Salesforce 触发器
问题描述
我想创建一个触发器以在提交之前检查另一个对象中是否存在帐户。newmember 对象存储新成员请求,但一旦提交新成员请求以供批准,它就会验证是否有帐户。
trigger VerifyAcc on Account (after update) {
Id recordTypeId = [Select Id From RecordType Where DeveloperName = 'newmember'].Id;
if (recordTypeID =='newmember'){
MAP<Id,List<NewMember__c>>Mapnewmemberstoaccounts new MAP<Id,List<NewMember__c>>();
for(NewMember__c objNewMember:[select Id,name from NewMember__c where
Name IN:Trigger.newmap.keyset()])
{
if(Mapnewmemberstoaccounts.containsKey(objNewMember.Name)!= null)
{
CalloutException e = new CalloutException();
e.setMessage('There is no account for this member.');
throw e;
}
}
} else{
CalloutException e = new CalloutException();
e.setMessage('Couldnt Find anything.');
throw e;
}
}
非常感谢您的帮助。
解决方案
trigger VerifyAcc on Account (after update) {
Id recordTypeId = [Select Id From RecordType Where DeveloperName = 'newmember'].Id;
if (recordTypeID =='newmember'){
记录类型 ID 永远不会等于文本“newmember”。您可能的意思是迭代Trigger.new
并检查其记录类型 ID 与此匹配的记录。
MAP<Id,List<NewMember__c>>Mapnewmemberstoaccounts new MAP<Id,List<NewMember__c>>();
for(NewMember__c objNewMember:[select Id,name from NewMember__c where
Name IN:Trigger.newmap.keyset()])
Trigger.newMap.keySet()
是一个Set<Id>
。除非NewMember__c
对象的 Name 字段包含 Account Id,否则此查询将不返回任何数据。
{
if(Mapnewmemberstoaccounts.containsKey(objNewMember.Name)!= null)
你永远不会填充变量Mapnewmemberstoaccounts
,所以在这里检查它不会有任何效果。该方法containsKey()
返回一个布尔值。它永远不会返回null
值。
{
CalloutException e = new CalloutException();
e.setMessage('There is no account for this member.');
throw e;
您的代码不应抛出CalloutException
与标注无关的错误。如果您希望停止将特定记录提交到数据库,请addError()
单独对该记录使用该方法。抛出异常将导致回滚整个事务。
}
}
} else{
CalloutException e = new CalloutException();
e.setMessage('Couldnt Find anything.');
throw e;
该if
语句的两个分支都被编码为抛出异常。那没有意义; 结果将是(如果封闭for
循环曾经执行)您无法插入任何帐户,因为您的触发器总是抛出异常。
粗略地说,您的触发器应遵循如下逻辑路径:
Create a collection variable
for each Account in the trigger set:
if the Account's record type is "New Member":
Add the Account's identifier to the set.
Query New Member records matching the Account identifiers.
Build a Map between Identifiers and New Member records.
for each Account in the trigger set:
if the Account's record type is "New Member":
Check if the Account's Identifier is in the New Member collection
If it is, call addError() for this Account
推荐阅读
- javascript - React-admin:如何在使用
? - reactjs - 美居码头无法正确配置 CORS 问题
- coordinates - 如何从 st_coordinates 制作的坐标矩阵重建一个 sf 对象?
- reactjs - 如何在我定制的 React 网站中将产品目录集成到我的 Facebook Pixel?
- javascript - Discord JS:TypeError:无法读取未定义的属性“id”
- c# - Azure 管道生成的 NuGet 包不会安装“似乎是空的”
- r - 从具有不同列长度的列表中创建 R 中的向量
- c - 在 Intel 机器上构建 Apple Silicon 二进制文件
- vba - Word-VBA-如果只剩下一个部分,如何防止删除选定的重复部分内容控件?
- javascript - 在 render() 之前调用 handleClick