Апекс-код Salesforce создает дубликаты в пользовательском объекте - PullRequest
2 голосов
/ 26 января 2020

У меня есть этот класс пакета Apex: пользовательский объект MDU_Squad_Data_min __ c ниже содержит много повторяющихся значений в столбце city & провинция. С помощью приведенного ниже кода мне удалось в некоторой степени избавиться от дубликатов с помощью метода contains, но все же есть дублирующиеся значения:

global void execute(Database.BatchableContext BC, List<MDU_Squad_Data_min__c> cities) {                  
        List<sumchans__City_Master__c> cityList = new List<sumchans__City_Master__c>(); 
        List<String> cityProvinceList = new List<String>();
        for(MDU_Squad_Data_min__c c: cities) { 
            String cityprovince; 
            cityprovince = (c.CITY_NAME__c).trim() + (c.PROVINCE_CODE__c).trim();                                           
            if(!cityProvinceList.contains(cityprovince)) { 

                sumchans__City_Master__c city = new sumchans__City_Master__c();
                city.Name = c.CITY_NAME__c;
                city.sumchans__PROVINCE__c = c.PROVINCE_CODE__c; 
                cityList.add(city);
            }
            cityProvinceList.add(cityprovince);
        }        
        Database.SaveResult[] MySaveResult = Database.Insert(cityList, false);

Также прилагаются результаты: enter image description here

Ответы [ 5 ]

2 голосов
/ 27 января 2020

Я бы предложил ниже, поскольку List.contains в основном используется для поиска строк.
global void execute (Database.BatchableContext B C, список городов) {
List cityList = new List (); List cityProvinceList = new List ();
для (MDU_Squad_Data_min __ c c: города) {String cityprovince; cityprovince = TRIM (c .CITY_NAME __ c) + TRIM (c .PROVINCE_CODE __ c);

    if(!cityProvinceList.contains(cityprovince)) { 

        sumchans__City_Master__c city = new sumchans__City_Master__c();
        city.Name = c.CITY_NAME__c;
        city.sumchans__PROVINCE__c = c.PROVINCE_CODE__c; 
        cityList.add(city);
                                                  }
   cityProvinceList.add(cityprovince); 
}
Database.SaveResult[] MySaveResult = Database.Insert(cityList, false);

}

1 голос
/ 29 января 2020

Это все, что было нужно. Я получаю ожидаемые результаты сейчас. Мне просто нужно было указать второй аргумент с более высоким значением, чем общее количество записей.

cityMduMaster c = new cityMduMaster();
database.executeBatch(c,5000000);
0 голосов
/ 04 февраля 2020

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

0 голосов
/ 27 января 2020

Вы делаете list.contain, используя объект, и так как вы создаете новые объекты каждый раз, когда они не найдены как совпадение.

 global void execute(Database.BatchableContext BC, List<MDU_Squad_Data_min__c> cities) {  
List<sumchans__City_Master__c> cityList = new List<sumchans__City_Master__c>();  
Set<String> cityNames = new Set<String>();     
for(MDU_Squad_Data_min__c c: cities)
{
   if(!cityNames.contains(c.City_Name__c))
   {
     sumchans__City_Master__c city = new sumchans__City_Master__c();
     city.Name = c.CITY_NAME__c;
     city.sumchans__PROVINCE__c = c.PROVINCE_CODE__c; 
     cityList.add(city);
     cityNames.add(city.CITY_NAME__c); 
   }
}
Database.SaveResult[] MySaveResult = Database.Insert(cityList, false);

}

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

Попробуйте использовать набор вместо списка:

Set<sumchans__City_Master__c> cityList = new Set<sumchans__City_Master__c>();

Наборы используются для создания уникальных коллекций, поэтому у вас не будет дубликатов.

...