@ Вишал, есть пара вещей, в которых я не совсем уверен, основываясь на вашем коде и контексте:
- Что определяет «первый файл»? Во втором (дублирующем) запросе вы, кажется, не применяете никакого порядка, поэтому Salesforce может вернуть вам одни и те же записи в другом порядке в зависимости от их структуры базы данных. В вашем первом запросе дополнительного выбора есть.
- Есть ли конкретная c причина, по которой вы используете if, if, if, вместо if, else if, else if? При таком подходе вы предотвращаете запуск второго и третьего элемента, даже если применен первый. Это упростит ваш код, так как вам не нужна вся проверка дубликатов (i == 0, i> 0 и т. Д.)
- Как возможно, что другая запись Salesforce (File против ebMobile__File __ c) может иметь одинаковый идентификатор Salesforce? (в вашем запросе для listMembers)
Пара предложений:
- Запросите только те записи, которые вы действительно хотите удалить, используя Offset (начальная запись смещения)
- Пожалуйста, старайтесь избегать выполнения запросов и действий DML в циклах, так как это отрицательно сказывается на производительности, но также может привести к ограничению регулятора
- Применить использование variableBinding, это обеспечит невозможность применения инъекции SOQL (когда например, идентификаторы учетных записей извлекаются из внешнего интерфейса)
- Упростите свои логики c, чтобы делать то, что вы действительно хотите; если вы запрашиваете только те, которые хотите удалить (см. 1.), то вы можете просто l oop, чтобы определить условие подписи, а затем просто удалить список файлов для каждой учетной записи. С моей точки зрения, нет необходимости снова запрашивать файлы, так как у вас уже есть их идентификаторы и записи, так что вы можете просто указать, удалять ли извлеченные записи, верно?
Set<Id> accountIds = new Set<Id>{ 'xxxx', 'xxxx' };
List<Account> scope = [SELECT Id,
( SELECT Id, ...
FROM Files__r
ORDER BY CreatedDate DESC
OFFSET 1 )
FROM Account
WHERE Id IN :accountIds];
List<File> filesToDelete = new List<File>();
List<ebMobile__File__c> ebMobileFileToDelete = new List<File>();
for( Integer i = 0, j = scope.size(); i < j; i++ ){
Account acc = scope[ i ];
if( acc.Files__r != null & !acc.Files__r.isEmpty() ){
for( Integer k = 0, l = acc.Files__r.size(); k < l; k++ ){
File f = acc.Files__r[ k ];
if( f.ebMobile__FileType__c != 'Signature' ){
// When not signature, delete the original file
filesToDelete.add( f );
} else{
// Don't delete the File, but delete the EB MobileFile
ebMobileFileToDelete.add( new ebMobile__File__c( Id = f.Id ) );
}
}
}
}
if( !filesToDelete.isEmpty() ){ delete filesToDelete; }
if( !ebMobileFileToDelete.isEmpty() ){ delete ebMobileFileToDelete; }
Обратите внимание Я не запускал этот код, поэтому он может потребовать некоторых настроек, но я надеюсь, что вы сможете заставить все это работать.
Удачи и приятного просмотра! Reinier