Я пытаюсь обновить только недавно добавленных участников из событий в отношения событий. Инициалы участников мероприятия привязаны к профилю пользователя.

Я получаю сообщение об ошибке в этой строке: e.RelationId = visiteId; Имя ошибки: AfterUpdate, вызванное: System.SObjectException: поле недоступно для записи EventRelation.RelationId

Это дополнительный вопрос по Как обновлять только новые значения списка множественного выбора после триггера обновления?

Заранее спасибо.

trigger cloneEventTrigger on Event (after insert, after update) {

if(trigger.isUpdate) {        
   cloneEventHelperClass.onAfterUpdate(trigger.new, trigger.oldmap);
    }  

 } 
}

Класс

   public static void onAfterUpdate(List<Event> newEvnt, Map<Id, Event>oldMap){  
    // get all fields from Events
    List<Id>eventIds = new List<Id>();
    for(Event evnt : [SELECT Id From Event WHERE id=:newEvnt AND Attendees__c != NULL])
        { 
            if (evnt.Id != null)
            {
                eventIds.add(evnt.Id);
                System.debug('EventIDs' + eventIds);
            }          
        }

    Set<String> oldInitials = new Set<String>();
    List<String>splitList;
    for (Event e : newEvnt)
    {
        if (e.Attendees__c != null)
        {

            system.debug('oldEven: ' + oldMap.get(e.Id).Attendees__c);
            String multiValues = oldMap.get(e.Id).Attendees__c;
            If(!String.isEmpty(multiValues)){
            splitList= multiValues.split(';');
            }
        }
    }
    Event[] queryEvent = [SELECT Id, Attendees__c From Event WHERE id=:eventIds];


    Map<String, Id> initialsToUserId = new Map<String, Id>();
    Set<String> newInitials = new Set<String>();

    Set<String> initials = new Set<String>(); //created to hold only new initials
    Map<id,User> updateAll= new Map<id, User>();

   for(Event record: queryEvent) {
        newInitials.addAll(record.Attendees__c.split(';'));
    }  

   // Find only newly added Initials
    If(!splitList.isempty()){
    for(String init: newInitials){
        if(!splitList.contains(init)){ 
               initials.add(init);
        }      
      } 
    }
    List<String>newInitialstoAdd = new List<String>();

// query for user and their initials and add them to Map. 
    for(User record: [SELECT Initials__c FROM User WHERE Initials__c = :initials AND IsActive = TRUE]) {
      initialsToUserId.put(record.Initials__c, record.Id);
    }

     //loop through existing Eventrelation ID and Insert only new ID
    list <EventRelation> upRelations =[select id, EventId,RelationId, Event.OwnerId from EventRelation where EventId IN: eventIds];
    list <EventRelation> upRelationsIns = new list <EventRelation>();
    System.debug('upRelations' + upRelations);
    for(EventRelation record: upRelations) {
        for(String initial: initials) {
                Id attendeeId = initialsToUserId.get(initial);                
                if(attendeeId != null) {
                     EventRelation e = new EventRelation();
                     e.id= record.Id;
                     e.RelationId = attendeeId;

                     upRelationsIns.add(e);  

             }

        }
      }

       insert upRelationsIns; 
       System.debug('Only NEW ID was inserted');

    } //End of onAfterInsert Trigger
1
mike 20 Апр 2020 в 16:56

1 ответ

Лучший ответ

Обратите внимание, что поле RelationId в EventRelation не обновляется, и поэтому вы получаете ошибки.

Что вы можете сделать, так это вместо того, чтобы обновлять его, создавать для новых, а для старых записей удалять и воссоздавать его.

Кроме того, из вашего кода триггера похоже, что вы все еще учитесь. Рекомендуйте перенести логику в класс вершины и вызвать свой класс вершины из триггеров.

3
Mohith Shrivastava 20 Апр 2020 в 16:43
1
Спасибо, Мохит. Я попытаюсь удалить старые отношения событий и снова вставить новые идентификаторы для отношений событий.
 – 
mike
20 Апр 2020 в 18:12