Salesforce 触发器
Salesforce Trigger
我想创建一个触发器来在提交之前检查一个帐户是否存在于另一个对象中。
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
对象的名称字段包含帐户 ID,否则此查询将 return 没有数据。
{
if(Mapnewmemberstoaccounts.containsKey(objNewMember.Name)!= null)
您永远不会填充变量 Mapnewmemberstoaccounts
,因此在此处检查它不会有任何效果。 containsKey()
return 方法是一个布尔值。它永远不会 return 一个 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
我想创建一个触发器来在提交之前检查一个帐户是否存在于另一个对象中。 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
对象的名称字段包含帐户 ID,否则此查询将 return 没有数据。
{
if(Mapnewmemberstoaccounts.containsKey(objNewMember.Name)!= null)
您永远不会填充变量 Mapnewmemberstoaccounts
,因此在此处检查它不会有任何效果。 containsKey()
return 方法是一个布尔值。它永远不会 return 一个 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