Я работаю над приложением, которое извлекает данные из приложений с пользовательскими объектами и промежуточной таблицы, называемой промежуточными данными UCRBoard, и сравнивает два поля формулы, называемые 'identifier_mesh__c', которые объединяют два ключевых идентификатора, чтобы указать, представляют ли эти записи одни и те же данные. Однако, когда я добавляю все поля промежуточной сетки в список, а затем проверяю, содержит ли этот список те же идентификаторы, что и приложения, я обнаруживаю, что он никогда не возвращает значение true.

Это чертовски сбивает меня с толку, поскольку я подтвердил в анонимном апексе, что если я запрашиваю обе таблицы для записи с одним и тем же идентификатором, а затем проверяю равенство этих полей, он возвращает true. Однако, как только я начинаю включать много записей и сравнивать со списком, он не находит ни одной, хотя я знаю, что они там есть.

Соответствующий код ниже

    Id devRecordTypeId = Schema.SObjectType.Application__c.getRecordTypeInfosByName().get('UCR').getRecordTypeId();
    // TODO: Change desc back to asc, changing them only to avoid large amounts of fee free data
    List<Staging_UCRBoard_Data__c> pendingMods = [SELECT Id, name, Registration_Status__c, CreatedDate, IsMotorCarrier__c, IsBroker__c, Identifier_Mesh__c, IsFreightForwarder__c, IsLeasingCompany__c, IsMotorPrivateCarrier__c, FeeAmountPaid__c, Number_TruckTractors__c, Registration_Record_Time__c, Registered_Vehicle__c, Number_AdditionalVehicle__c, Number_PassengerVehicle__c, Registration_Year__c, status__c, Physical_Address__c, Physical_City__c, Physical_Country__c, Physical_State__c, Physical_Zip__c, Legal_name__c, usdot_number__c FROM Staging_UCRBoard_Data__c WHERE status__c = 'Pending' AND modification__c = 'Yes' ORDER BY Registration_Record_Time__c];
    System.debug('Pending Mods =' + pendingMods);
    List<Application__c> toModPos = [SELECT id, Filing_Year__c, Num_of_Additional_Vehicles__c, Num_of_Straight_Trucks_and_Tractors__c, Num_of_Motor_Coaches_School_Buses_Vans__c, Account__c, Account_USDOT__c, Amount_Due__c, Total_Number_of_Vehicles__c,Identifier_Mesh__c FROM Application__c WHERE RecordTypeId = :devRecordTypeId];
    System.debug('toMod Pos= ' + toModPos);
    List<Application__c> toMod = new List<Application__c>();
    Map<String, List<String>> usdotAndRegYears = new Map<String, List<String>>();
    // Creates and holds the equivalent of the identifier mesh field on staging to match staging records to applications
    List<String> applicationMeshFields = new List<String>();
    for(Staging_UCRBoard_Data__c pendInst : pendingMods){
        applicationMeshFields.add(pendInst.Identifier_Mesh__c);
    }
    for(Application__c meshCheck : toModPos){
        String mesh = meshCheck.Identifier_Mesh__c;
        if(applicationMeshFields.contains(mesh)){
            System.debug('HIT');
            toMod.add(meshCheck);
        }
    }

PendingMods представляет промежуточные данные, и каждый идентификатор сетки помещается в список applicationMeshFields в виде строки. Затем я просматриваю каждую запись приложения и проверяю, присутствует ли это поле сетки приложений в списке. Это должно быть верно для большинства записей, но, опять же, каждый раз возвращается пустым.

Я также пытался сделать это в операторе SOQL в приложении WHERE ID_mesh__c IN :applicationMeshFields, но это также не увенчалось успехом.

Я не уверен, что я чего-то не понимаю в том, как отдел продаж сравнивает эти данные, или я просто упускаю из виду простую ошибку в моем коде, но после того, как мне не удалось разобраться в этом большую часть дня, я надеюсь, что кто-то здесь может знать, что происходит.

1
Frank Evers 10 Янв 2019 в 00:58

1 ответ

Ваш код в порядке и делает то, что, по вашему мнению, он должен делать. Возможно, у вас есть проблема с данными (чувствительность к регистру?) или несоответствие типа поля для Identifier_Mesh__c в обоих объектах.

Действия, предпринятые для подтверждения вашего кода:
1) Создал два указанных выше настраиваемых объекта (application__c, staging_ucrboard_data__c) с текстовым (255) полем с аналогичным названием (identifier_mesh__c).
2) Я упростил ваш SOQL, чтобы сосредоточиться только на поле идентификатора сетки, и запустил его. Я заметил попадание.

Рассмотрим этот код:

public class betaFish {

public static List<Application__c> getApplicationsToMod() {
    Id devRecordTypeId = Schema.SObjectType.Application__c.getRecordTypeInfosByName().get('UCR').getRecordTypeId();
    List<Staging_UCRBoard_Data__c> pendingMods = [SELECT Id, name, Identifier_Mesh__c FROM Staging_UCRBoard_Data__c];
    System.debug('===== pendingMods: ' + pendingMods.size());
    List<Application__c> toModPos = [SELECT id, Identifier_Mesh__c FROM Application__c WHERE RecordTypeId = :devRecordTypeId];
    System.debug('===== toModPos: ' + toModPos.size());
    List<Application__c> toMod = new List<Application__c>();
    Map<String, List<String>> usdotAndRegYears = new Map<String, List<String>>();

    // Creates and holds the equivalent of the identifier mesh field on staging to match staging records to applications
    List<String> applicationMeshFields = new List<String>();

    for(Staging_UCRBoard_Data__c pendInst : pendingMods){
        applicationMeshFields.add(pendInst.Identifier_Mesh__c);
    }

    System.debug('===== applicationMeshFields: ' + applicationMeshFields.size());

    for(Application__c meshCheck : toModPos){
        String mesh = meshCheck.Identifier_Mesh__c;
        if(applicationMeshFields.contains(mesh)){
            System.debug('HIT');
            toMod.add(meshCheck);
        }        
    }
    return toMod;
}

}

Просто вызовите этот код в анонимном выполнении, чтобы подтвердить совпадение:
System.debug(betaFish.getApplicationsToMod());

1
krigi 10 Янв 2019 в 01:46
Похоже, это был мой SOQL, так как я не получал правильное подмножество записей для сравнения. Упс! Спасибо, что посмотрели и подтвердили, мне стало намного легче отследить проблему, когда я знал, где не искать.
 – 
Frank Evers
10 Янв 2019 в 17:10