如何删除数组索引中除第0条以外的所有记录?

问题描述 投票:0回答:1

根据代码,我不想删除第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;
        }
    }
salesforce apex salesforce-lightning
1个回答
0
投票

在代码中,有许多不必要的检查和列表。

让我们把东西简单化。

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;
}
}

希望能帮到你


0
投票

@Vishal 根据你的代码和上下文,有几件事我不是很确定。

  1. 什么是 "第一个文件 "的定义?在你的第二个(重复)查询中,你似乎没有应用任何排序,所以Salesforce可能会根据他们的数据库结构,以不同的顺序返回相同的记录。在你的第一个子选择查询中,有。
  2. 你使用if、if、if,而不是if、else if、else if,有什么特殊原因吗?通过这种方法,你防止了第二项和第三项的运行,即使在第一项应用的时候。这将简化你的代码,因为你不需要所有的重复检查(i == 0,i > 0等)。
  3. 为什么不同的Salesforce记录(File vs. ebMobile__File__c)可以有相同的Salesforce ID?(在你对listMembers的查询中)

几个建议。

  1. 只用Offset(移位开始记录)查询你真正想删除的记录。
  2. 请尽量避免在循环中进行查询和DML操作,因为这对性能不好,但也可能会导致运行到治理器限制。
  3. 应用variableBinding的用法,这将确保没有SOQL注入可以被应用(当账户ID被从前端获取时)。
  4. 简化你的逻辑来做你真正想要的事情,如果你只查询那些要删除的记录(见1.),那么你可以简单的循环那些来确定Signature条件,然后直接删除每个账户的Files列表。在我看来,没有必要再查询文件,因为你已经有了它们的ID和记录,所以你可以简单地指定删除检索到的记录,对吧?
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

© www.soinside.com 2019 - 2024. All rights reserved.