У меня есть две даты (дата начала периода и дата окончания), которые пользователь вводит в форму, чтобы получить список данных. Мне нужно получить список этих данных из базы данных и проверять, есть ли запись каждый день. Мне нужно зафиксировать даты, на которые нет записей, чтобы потом с ними можно было произвести дальнейшие манипуляции.

//кмп

...
<aura:attribute name="dateFrom" type="Date"/>
<aura:attribute name="dateTo" type="Date"/>
...

// js

getDataForThePeriod : function(component, helper){
        let dateFrom = component.get("v.dateFrom");
        let dateTo = component.get("v.dateTo");
        if(dateFrom != '' && dateTo != '' && dateFrom < dateTo){
            let action = component.get('c.getListExchangeRatesForThePeriod');
                action.setParams({ "dateFrom" : dateFrom,
                                  "dateTo" : dateTo });
                action.setCallback(this, function(response) {
                    let state = response.getState();
                    if (state === "SUCCESS") {
                    ...
                    }
                });
        $A.enqueueAction(action);
        }
    }

//apxc

//здесь мне нужно определить недостающие даты

@AuraEnabled
    public static List<Exchange_Rate__c> getListExchangeRatesForThePeriod(Date dateFrom, Date dateTo){
        String listFields = convertToString(getFieldsNameForRequest());
        List<Exchange_Rate__c> listData = Database.query('SELECT Date__c, Base_Currency__c, ' + listFields + ' FROM Exchange_Rate__c WHERE Date__c >= :dateFrom and Date__c <= :dateTo');
        return listData;
    }
1
unique user 4 Июн 2021 в 15:48

1 ответ

Лучший ответ

Вам нужно знать существующие даты, вам нужно сверить возможные даты с существующими датами. Достаточно простой грубой силы. Вам также потребуется более одного возвращаемого значения, чтобы дать как список объектов, так и список отсутствующих дат, поэтому будет использоваться немного другая структура.


public class SomeClass {
    @AuraEnabled
    public List<Exchange_Rate__c> rates;
    @AuraEnabled
    public List<Date> missingDates;
    
    public SomeClass getExchangeRates(Date dateFrom, Date dateTo) {
        String listFields = convertToString(getFieldsNameForRequest());
        //Here's all of your list data.
        List<Exchange_Rate__c> listData = Database.query('SELECT Date__c, Base_Currency__c, ' + listFields + ' FROM Exchange_Rate__c WHERE Date__c >= :dateFrom and Date__c <= :dateTo');
        SomeClass returnVal = new SomeClass();
        //List data added to return value.
        returnVal.rates = listData;
        Set<Date> existingDates = new Set();
        Set<Date> missingDates = new Set();
        for (Exchange_Rate__c rate: listData) {
            existingDates.add(rate.Date__c);
        }
        Date nextDate = dateFrom;
        while (nextDate <= dateTo) {
            if (!existingDates.contains(nextDate)) {
                missingDates.add(nextDate);
            }
            nextDate = nextDate.addDays(1);
        }
        //missing dates added to return value
        returnVal.missingDates = missingDates;
        return returnVal;
    }
}
1
PapaChaos 5 Июн 2021 в 08:50
Спасибо за помощь, это то, что мне нужно!
 – 
unique user
5 Июн 2021 в 17:08