как удалить все записи, кроме 0-й записи в индексе массива - PullRequest
0 голосов
/ 22 апреля 2020

Согласно коду, я не хочу удалять 0-ую запись и удалять остальную часть записи. Но это удаляет все записи!

Пожалуйста, помогите, где я делаю ошибку.

Вот код:

list<account> scope = [Select Id,(Select id,CreatedDate,ebMobile__FileType__c,ebMobile__Account__c from Files__r order by CreatedDate DESC) from account where id in ('0016D00000444','0016D000000ugO')]; 
        Set<Id>OldIds = new Set<Id>();
        Set<Id>newIds = new Set<Id>();
        Set<Id> rIds = new Set<Id>();
        Set<Id> rrIds = new Set<Id>();
        list<File__c> listmemb = new list<File__c>();
        List<File__c> listmemb3 = new List<File__c>();
        List<File__c> listmemb4 = new List<File__c>();
        for(Account Acc : scope)
        {
            for(File__c fi : Acc.ebMobile__Files__r)
            {
                listmemb = [select id,CreatedDate,ebMobile__FileType__c from File__c where id =: fi.id];
                if(fi.ebMobile__Account__c != Null)
                {
                    for(Integer i=0; i<listmemb.size(); i++)
                    {
                        if(fi.ebMobile__FileType__c == 'Signature' && i==0)
                        {
                            rIds.add(listmemb[0].id); // Exclude 0th record 
                        }
                        if(i>0 && listmemb[i].ebMobile__FileType__c == 'Signature' || i > 0 && listmemb[i].ebMobile__FileType__c != 'signature')
                        {
                            rrIds.add(listmemb[i].id); // Delete all record excluding 0th record
                        }
                        if(fi.ebMobile__FileType__c != 'Signature')
                        {
                            OldIds.add(fi.id);  
                        }
                    }
                }
            }
        }
        listmemb3 = [Select id,CreatedDate,ebMobile__FileType__c from File__c where id in : OldIds];
        listmemb4 = [Select id,CreatedDate,ebMobile__FileType__c from ebMobile__File__c where id in : rrIds];
        if(listmemb3.size() > 0 && listmemb4.size()>0)
        {
            delete listmemb3;
            delete listmemb4;
        }
    }

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

@ Вишал, есть пара вещей, в которых я не совсем уверен, основываясь на вашем коде и контексте:

  1. Что определяет «первый файл»? Во втором (дублирующем) запросе вы, кажется, не применяете никакого порядка, поэтому Salesforce может вернуть вам одни и те же записи в другом порядке в зависимости от их структуры базы данных. В вашем первом запросе дополнительного выбора есть.
  2. Есть ли конкретная c причина, по которой вы используете if, if, if, вместо if, else if, else if? При таком подходе вы предотвращаете запуск второго и третьего элемента, даже если применен первый. Это упростит ваш код, так как вам не нужна вся проверка дубликатов (i == 0, i> 0 и т. Д.)
  3. Как возможно, что другая запись Salesforce (File против ebMobile__File __ c) может иметь одинаковый идентификатор Salesforce? (в вашем запросе для listMembers)

Пара предложений:

  1. Запросите только те записи, которые вы действительно хотите удалить, используя Offset (начальная запись смещения)
  2. Пожалуйста, старайтесь избегать выполнения запросов и действий DML в циклах, так как это отрицательно сказывается на производительности, но также может привести к ограничению регулятора
  3. Применить использование variableBinding, это обеспечит невозможность применения инъекции SOQL (когда например, идентификаторы учетных записей извлекаются из внешнего интерфейса)
  4. Упростите свои логики 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

0 голосов
/ 22 апреля 2020

В коде есть много ненужных проверок и списков

Давайте упростим вещи:

list scope = [Select Id,(Select id,CreatedDate,ebMobile__FileType__c,ebMobile__Account__c from Files__r order by CreatedDate DESC) from account where id in ('XXXXXXXXXXXXXXXX','XXXXXXXXXXXXXXXX')];//Always keep Ids encrypted while posting on public platform
SetOldIds = new Set();
SetnewIds = new Set();
Set rIds = new Set();
Set rrIds = new Set();
list listmemb = new list();
List listmemb3 = new List();
List listmemb4 = new List();
for(Account Acc : scope)
{
    Integer i= 0; //This will be used to exclue the first element
    for(File__c fi : Acc.ebMobile__Files__r)
    {
        //listmemb = [select id,CreatedDate,ebMobile__FileType__c from File__c where id =: fi.id];//You don't need this as you already have fi
        //if(fi.ebMobile__Account__c != Null)We are getting fi from Acc so it won't be having ebMobile__Account__c as null, assuming it as lookup
        //{
            //for(Integer i=0; i {This is syntactically wrong
                /* This whole section is not needed as rIds is not being used anywhere
                if(fi.ebMobile__FileType__c == 'Signature' && i==0)
                {
                    rIds.add(listmemb[0].id); // Exclude 0th record
                }
                */
                //if(i>0 && listmemb[i].ebMobile__FileType__c == 'Signature' || i > 0 && listmemb[i].ebMobile__FileType__c != 'signature')
                if( i > 0 ) //Just put the check you need
                {
                    rrIds.add(listmemb[i].id); // Delete all record excluding 0th record
                }
                if(fi.ebMobile__FileType__c != 'Signature')
                {
                    OldIds.add(fi.id);
                }
                i++;
            //}
        //}
    }
}
listmemb3 = [Select id,CreatedDate,ebMobile__FileType__c from File__c where id in : OldIds];
listmemb4 = [Select id,CreatedDate,ebMobile__FileType__c from ebMobile__File__c where id in : rrIds];
if(listmemb3.size() > 0 && listmemb4.size()>0)
{
    delete listmemb3;
    delete listmemb4;
}
}

Надеюсь, это поможет.

...