У меня отношение многие ко многим. Объект аккаунта, узел AccountAdress, объект Adres. Объект соединения имеет дату начала и дату окончания, чтобы сделать адрес активным для Пользователя.

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

Что было бы наиболее эффективным soql для достижения этой цели. Делаю ли я запрос от объекта соединения, чтобы получить учетные записи и адреса и передать их в карты, сопоставить их и обновить. Или сделайте запрос из учетной записи и обновите, если найден активный адрес.

List<Accounts> accList = [Select id from account];//Batch soql
List<Adress> updateAdresses = [SELECT Id, street 
    FROM Adress
    WHERE Id IN 
        (SELECT Adress 
        FROM AcountAdress 
        WHERE account__c IN : accList
        )
];

Или

[SELECT id, startdate, enddate, account__c,addres__c FROM AcountAdress where today>startdate AND today<startdate];
 create map for account and loop trough AccountAdress and update with Adress
1
Thomas 12 Дек 2019 в 10:46

2 ответа

Лучший ответ

Я бы сказал, что ваш запрос должен быть основан на объекте соединения. Поэтому вам не нужна карта, потому что сам объект перекрестка имеет характеристику Карта (ключ => значение)

List<Account> accountsToUpdate = new List<Account>();
for (AccountAdress addr : [SELECT id, startdate, enddate, account__c, addres__c 
        FROM AcountAdress 
        WHERE today>startdate  today<startdate
        ]) {
    Account acc = new Account(
        Id = addr.account__c,
        Field1 = Value,
        Field2 = Value
    );
    accountsToUpdate.add(acc);
}
update(accountsToUpdate);
1
Hengky Djapar 12 Дек 2019 в 11:33

Ваш первый подход не содержит startDate, поэтому он не соответствует вашим критериям. В любом случае второй подход представляется предпочтительным. Поскольку это кажется периодической задачей (диалировать?), я бы использовал запланированное задание, чтобы запускать его каждый день после полуночи...

0
TheShadow 12 Дек 2019 в 10:59