首页 > 解决方案 > 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;


    } 
}

非常感谢您的帮助。

标签: salesforceapexvisualforcesalesforce-lightning

解决方案


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

推荐阅读