Заранее спасибо. У меня есть пакетный апекс-код. Я хочу вставить записи в свой пользовательский объект. какой код для вставки записей.

global class WeatherForecastBatch implements Database.Batchable<sObject>,Database.AllowsCallouts,Database.stateful{ 
   global Database.QueryLocator start(Database.BatchableContext BC) {
        String query='Select id,City__c from Weather_Forecast__c';
        return Database.getQueryLocator(query);
    }
    global void execute(Database.BatchableContext BC, List<Weather_Forecast__c> scope) {
        List <Weather_Forecast__c> collectionofcity =[SELECT Id,City__c FROM Weather_Forecast__c];
        for(Weather_Forecast__c w:collectionofcity) {
         try {
           Http http = new Http();
            HttpRequest request = new HttpRequest();
            PageReference endPoint = new PageReference('https://api.weatherbit.io/v2.0/current');
            endPoint.getParameters().put('city', w.City__c);
            endPoint.getParameters().put('key','d3730680f92f4b398eef44fe5e0b8661');
            request.setEndpoint(endPoint.getUrl());
            request.setMethod('GET');
            HttpResponse response = http.send(request);
              if (response.getStatusCode() == 200){
                 Map<String, Object> results = (Map<String, Object>) JSON.deserializeUntyped(response.getBody());
                List<Object> data = (List<Object>)results.get('data');
                for(Object temp: data) {
                Map<String, Object> item_data = (Map<String, Object>)temp;
                Weather_Forecast__c weath = new Weather_Forecast__c();
                weath.temperature__c = (decimal)item_data.get('app_temp');
                system.debug(weath.temperature__c);
                }
              }
            }catch(Exception e){
                    System.debug('Error:' + e.getMessage() + 'LN:' + e.getLineNumber() );
                }
        }
       }
 global void finish(Database.BatchableContext BC){
         }
    }
0
Aishwarya 6 Сен 2019 в 08:03

2 ответа

Если вы обратите внимание сюда, вы создали переменную экземпляра объекта Weather_Forecast__c, что абсолютно правильно. Затем вы пытаетесь присвоить значение поля Temperature__c в вашей переменной экземпляра объекта.

Weather_Forecast__c weath = new Weather_Forecast__c();
weath.temperature__c = (decimal)item_data.get('app_temp');
system.debug(weath.temperature__c);

Что вы пропустили?

Вы не написали никакого оператора dml для вставки записи. Вам нужно знать об операции DML в apex. Используя DML, вы можете вставлять новые записи и фиксировать их в базе данных. Точно так же вы можете обновить значения полей существующих записей.

Примером примера может быть: -

Account[] accts = new List<Account>();
for(Integer i=0;i<3;i++) {
    Account a = new Account(Name='Acme' + i, 
                            BillingCity='San Francisco');
    accts.add(a);
}
insert accts; 

Читайте больше о них, здесь:-

  1. Вставка и обновление записей
  2. Класс базы данных

Примечание. Поскольку вы имеете дело с циклами for, в Apex есть ограничения регулятора. Если вы их нажмете, вся ваша транзакция потерпит неудачу.

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

Ознакомьтесь со всеми передовыми методами работы с apex здесь: Рекомендации по коду Apex

0
sanket kumar 6 Сен 2019 в 13:36
For(Integer i=0;i<3;i++) { Weather_Forecast__c a = new Weather_Forecast__c(City__c='город' + i, Temperature__c =decimal.valueof('Температура')); действует.добавить(а); } вставить действия; приведенное выше заявление верно
 – 
Aishwarya
6 Сен 2019 в 08:56

Сначала инициализируйте список перед циклом for. Затем добавьте объект в список внутри цикла for. Используйте DML в списке вне цикла for, чтобы избежать ограничения DML.

Вы можете использовать код ниже

global void execute(Database.BatchableContext BC, List < Weather_Forecast__c > scope) {
List < Weather_Forecast__c > collectionofcity = [SELECT Id, City__c FROM Weather_Forecast__c];
List < Weather_Forecast__c > listWeather = new List < Weather_Forecast__c>();
for (Weather_Forecast__c w: collectionofcity) {
    try {
        Http http = new Http();
        HttpRequest request = new HttpRequest();
        PageReference endPoint = new PageReference('https://api.weatherbit.io/v2.0/current');
        endPoint.getParameters().put('city', w.City__c);
        endPoint.getParameters().put('key', 'd3730680f92f4b398eef44fe5e0b8661');
        request.setEndpoint(endPoint.getUrl());
        request.setMethod('GET');
        HttpResponse response = http.send(request);
        if (response.getStatusCode() == 200) {
            Map < String, Object > results = (Map < String, Object > ) JSON.deserializeUntyped(response.getBody());
            List < Object > data = (List < Object > ) results.get('data');
            for (Object temp: data) {
                Map < String, Object > item_data = (Map < String, Object > ) temp;
                Weather_Forecast__c weath = new Weather_Forecast__c();
                weath.temperature__c = (decimal) item_data.get('app_temp');
                listWeather.add(weath);
            }
        }
    } catch (Exception e) {
        System.debug('Error:' + e.getMessage() + 'LN:' + e.getLineNumber());
    }
}
insert listWeather;

}

0
Chetan Nandre 6 Сен 2019 в 08:15
Спасибо @ Четан Нандре. но я новичок в разработке кода. не могли бы вы объяснить с примером кода. Я не могу понять, что вы пытаетесь сказать.
 – 
Aishwarya
6 Сен 2019 в 08:19
Всякий раз, когда вы хотите вставить записи в список использования вершины для DML, иначе вы получите ограничение отдела продаж при вставке отдельных записей внутри цикла for.
 – 
Chetan Nandre
6 Сен 2019 в 08:23
Не могли бы вы выделить строку, где инициализировать список и добавить объект? и я получаю сообщение об ошибке [EXCEPTION_THROWN [12]|System.CalloutException: у вас есть незафиксированная работа в ожидании. Пожалуйста, зафиксируйте или откатитесь, прежде чем вызывать]
 – 
Aishwarya
6 Сен 2019 в 08:27
Вы не можете выполнить операцию DML до выноски. Все операции DML следует вызывать только после того, как вы закончите с выносками. Итак, сначала сделайте вызов веб-сервиса, а затем сохраните запрос.
 – 
Chetan Nandre
6 Сен 2019 в 08:45