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

Я добавляю в каждый список ручное поле как oName, которое должно содержать имя объекта. Пока это работает, но я не могу отобразить oName в своем списке при визуальной силе, потому что я получил ошибку --> Переменная не существует: oName , я не знаю, почему? Как я могу отсортировать список оберток в контроллере по дате создания? есть ли простой способ сортировки прямо в таблице?

public class DokuBox_5 {
    
    public List<wrapper> wrapperList {get; set;}
    public String currentRecordId {get; set;}
    
    public DokuBox_5() {
        currentRecordId = ApexPages.currentPage().getParameters().get('id');
      
        if(wrapperList == null) {
            wrapperList = new List <wrapper>();
            
            for(Task a: [select Id, Subject, CreatedDate from Task where WhoId =: currentRecordId limit 10]) {
                wrapperList.add(new wrapper(a, 'Task'));
            }
            for(Event b: [select Id, Subject, CreatedDate from Event where WhoId =: currentRecordId limit 10]) {
                wrapperList.add(new wrapper(b, 'Event'));
            }
            for(ContentDocumentLink d: [SELECT Id, ContentDocumentId, ContentDocument.Title, ContentDocument.createdDate FROM ContentDocumentLink WHERE LinkedEntityId =: currentRecordId limit 10]) {
                wrapperList.add(new wrapper(d, 'Note/File'));
            }
        }
    }
    
    public class Wrapper implements Comparable {
        
        public Task at {get; set;}
        public Event be {get; set;}
        public ContentDocumentLink dc {get; set;}
        
        public wrapper(Task a, String oName) { 
            at = a;
        }      
        public wrapper(Event b, String oName) {
            be = b;
        }
        public wrapper(ContentDocumentLink d, String oName) {
            dc = d;
        }
        
        public String getSubject() {
            if (at != null) return at.Subject;
            else if (be != null) return be.Subject;
            else if (dc != null) return dc.ContentDocument.Title;
            else if (dc != null) return null;
            else return '';
        }      
        public Datetime getCreatedDate() {
            if (at != null) return at.CreatedDate;
            else if (be != null) return be.CreatedDate;
            else if (dc != null) return dc.ContentDocument.CreatedDate;            
            else if (dc != null) return null;            
            else return null;
        }     
        public String getId() {
            if (at != null) return at.Id;
            else if (be != null) return be.Id;
            else if (dc != null) return dc.ContentDocumentId;            
            else return '';
        }               
        public String getoName() {
            if (at != null) return at.oName;
            else if (be != null) return be.oName;
            else if (dc != null) return dc.oName;            
            else return '';
        }            
      
        public Integer compareTo(Object o) {
            Wrapper that = (Wrapper) o;
            Integer result = this.getSubject().compareTo(that.getSubject());          
            if (result != 0) {
                return result;
            } else {
                if (this.getCreatedDate() > that.getCreatedDate()) return -1;
                else if (this.getCreatedDate() < that.getCreatedDate()) return 1;
                else return 0;

            }
        }
    }   
}
    <apex:form >
        <apex:pageBlock >             
                <apex:pageBlockTable value="{!wrapperList}" var="wl" title="all activities" styleClass="dataTable">
                    <apex:column headerValue="Date">
                        <apex:outputText value="{0,date,dd'.'MM'.'yyyy HH:mm:ss}"> <apex:param value="{!wl.createdDate}"/> </apex:outputText>                       
                    </apex:column>
                    <apex:column headerValue="Title" value="{!wl.subject}" />
                    <apex:column headervalue="LINK"> 
                        <apex:outputLink target="_blank" value="/{!wl.Id}">Details</apex:outputLink> 
                    </apex:column>
                </apex:pageBlockTable>                                            
        </apex:pageBlock>
    </apex:form> 
0
Mariia Illarionova 20 Июл 2021 в 11:08

1 ответ

Лучший ответ

Вы передаете oName конструктору оболочки, но не сохраняете его, поэтому он будет потерян.
Кроме того, в Task, Event и ContentDocumentLink нет поля oName, поэтому оно не компилируется из-за ошибки «Переменная не существует».

Если вы определяете нужные вам свойства в своем классе-оболочке, вместо того, чтобы полагаться на SObjects, вы можете удалить все эти if-else в своих методах get.

В вашем методе compareTo вы также проверяете поле subject, но, поскольку вы попросили сортировать по CreatedDate, я удалил его.

Класс Оболочка.

public class Wrapper implements Comparable {

    private final String objectLabel;
    private final Id id;
    private final String subject;
    private final DateTime createDate;

    public wrapper(Task t, String oName) { 
        objectLabel = oName;
        id = t.Id;
        subject = t.Subject;
        createDate = t.CreatedDate;
    }
    
    public wrapper(Event e, String oName) {
        objectLabel = oName;
        id = e.Id;
        subject = e.Subject;
        createDate = e.CreatedDate;
    }

    public wrapper(ContentDocumentLink f, String oName) {
        objectLabel = oName;
        id = f.ContentDocumentId;
        subject = f.ContentDocument.Title;
        createDate = f.ContentDocument.CreatedDate;
    }

    public Id getId() {
        return id;
    }

    public String getSubject() {
        return subject;
    }

    public DateTime getCreatedDate() {
        return createDate;
    }

    public String getObjectLabel() {
        return objectLabel;
    }            

    // Sort in ascending order
    public Integer compareTo(Object compareTo) {
        Wrapper compareToActivity = (Wrapper) compareTo;
        DateTime compareToCreateDate = compareToActivity.getCreatedDate();
        if (createDate > compareToCreateDate) {
            return 1;
        }
        if (createDate < compareToCreateDate) {
            return -1;
        }
        return 0;
    }
}

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

if (createDate > compareToCreateDate) {
    return -1;
}
if (createDate < compareToCreateDate) {
    return 1;
}

После того, как список обертки заполнен, вы должны вызвать метод .sort().

public class DokuBox_5 {
    
    public List<Wrapper> wrapperList {get; set;}
    public String currentRecordId {get; set;}
    
    public DokuBox_5() {
        currentRecordId = ApexPages.currentPage().getParameters().get('id');
      
        if(wrapperList == null) {
            wrapperList = new List<Wrapper>();
            
            for(Task a: [select Id, Subject, CreatedDate from Task where WhoId =: currentRecordId limit 10]) {
                wrapperList.add(new Wrapper(a, 'Task'));
            }
            for(Event b: [select Id, Subject, CreatedDate from Event where WhoId =: currentRecordId limit 10]) {
                wrapperList.add(new Wrapper(b, 'Event'));
            }
            for(ContentDocumentLink d: [SELECT Id, ContentDocumentId, ContentDocument.Title, ContentDocument.createdDate FROM ContentDocumentLink WHERE LinkedEntityId =: currentRecordId limit 10]) {
                wrapperList.add(new Wrapper(d, 'Note/File'));
            }
            
            // records will be sorted in ascending order
            wrapperList.sort();
        }
    }
}
2
RubenDG 20 Июл 2021 в 14:10
Большое спасибо RubenDG за ваши усилия и ваши объяснения
 – 
peXeq
20 Июл 2021 в 14:42