public without sharing class SSOpportunityBatch implements Database.Batchable, Database.Stateful { public static Integer FIELDMAX = 30; private final List TEST_ID = null; private BatchIF_Log__c iflog; /** * コンスタント、パラメータを受け取る */ public SSOpportunityBatch(List testId) { TEST_ID = testId; System.debug('TEST_ID=' + TEST_ID); iflog = new BatchIF_Log__c(); iflog.Type__c = 'PushNotification'; iflog.Log__c = 'SSOpportunityBatch start\n'; iflog.ErrorLog__c = ''; insert iflog; } public static String makeSql(SS_Batch_Column_Mapping__c setting, Set apiTempSet) { apiTempSet.add('Id'); for (Integer i = 1; i <= FIELDMAX; i++) { String fromColumn = 'From_Column_' + ('00' + i).right(3) + '__c'; String apiStr = String.valueOf(setting.get(fromColumn)); if (String.isBlank(apiStr) == false && apiTempSet.contains(apiStr) == false) { apiTempSet.add(apiStr); } } String soql = 'Select ' + String.join(new List(apiTempSet), ',') + ' from ' + setting.Name; return soql; } public static Object getValue(SObject sobj, String field) { List fieldPathList = field.split('\\.'); Object rtn = null; for (Integer i = 0; i < fieldPathList.size(); i++) { String fieldPath = fieldPathList[i]; if (i == fieldPathList.size() - 1) { rtn = sobj.get(fieldPath); System.debug(rtn + '=*** sobj.get(' + fieldPath + ')'); } else { sobj = sobj.getSObject(fieldPath); if (sobj == null) { break; } System.debug(sobj + '=### sobj.getSObject(' + fieldPath + ')'); } } return rtn; } /** * startには、queryを実行、引合全件 */ public Database.QueryLocator start(Database.BatchableContext BC) { // select項目を oppMapping より生成 SS_Batch_Column_Mapping__c oppMapping = SS_Batch_Column_Mapping__c.getValues('Opportunity'); Set apiTempSet = new Set(); apiTempSet.add('StageName'); for (Integer i = 1; i <= FIELDMAX; i++) { String lpadI = ('00' + i).right(3); String fromColumn = 'From_Column_' + lpadI + '__c'; String apiStr = String.valueOf(oppMapping.get(fromColumn)); if (String.isBlank(apiStr) == false) { String ssColumn = 'SS_Column_' + lpadI + '__c'; String ssApiStr = String.valueOf(oppMapping.get(ssColumn)); if (ssApiStr.toLowerCase().startsWith('opportunity.')) { // 商談の項目を更新、変更があるかどうか判断するため、元データも取得 System.debug('ssApiStr=' + ssApiStr + ', substring(12)=' + ssApiStr.substring(12)); apiTempSet.add(ssApiStr.substring(12)); } } } String soql = makeSql(oppMapping, apiTempSet); if (TEST_ID <> null) { soql += ' where Id IN: TEST_ID'; } else { // SS_Prospect_5days_list__c の対象かどうか、loopの中単独判断 // soql += ' where StageName = \'引合\''; } System.debug('soql=' + soql); return Database.getQueryLocator(soql); } public void execute(Database.BatchableContext BC, List oppList) { List updSelfList = new List(); List insSSOppList = new List(); List insSSOppId = new List(); List insSSOliList = new List(); //20161205Add Map SSBDreportToSSodp = new Map(); // 商談 system.debug('===================111111111'); SS_Batch_Column_Mapping__c oppMapping = SS_Batch_Column_Mapping__c.getValues('Opportunity'); Schema.SObjectType ssOppType = Schema.getGlobalDescribe().get(String.valueOf(oppMapping.get('SS_TableName__c'))); for (Opportunity opp : oppList) { Boolean updSelfFlg = false; SObject insSSOpp = ssOppType.newSObject(); for (Integer i = 1; i <= FIELDMAX; i++) { String lpadI = ('00' + i).right(3); String fromColumn = 'From_Column_' + lpadI + '__c'; String apiStr = String.valueOf(oppMapping.get(fromColumn)); system.debug('======8888'+String.isBlank(apiStr)); if (String.isBlank(apiStr) == false) { String ssColumn = 'SS_Column_' + lpadI + '__c'; String ssApiStr = String.valueOf(oppMapping.get(ssColumn)); system.debug('===================77777'+ssApiStr.toLowerCase().startsWith('opportunity.')+ssApiStr.toLowerCase()); if (ssApiStr.toLowerCase().startsWith('opportunity.')) { // 商談の項目を更新、変更があるかどうか判断する system.debug('===================5555'+opp.get(ssApiStr.substring(12)) +'^^^^^^'+ opp.get(apiStr)); if (opp.get(ssApiStr.substring(12)) != opp.get(apiStr)) { try { opp.put(ssApiStr.substring(12), opp.get(apiStr)); updSelfFlg = true; } catch (Exception e) { iflog.ErrorLog__c = 'ERROR [' + apiStr + '] => [' + ssApiStr + ']' + e.getMessage() + '\n'; } } } else { try { insSSOpp.put(ssApiStr, getValue(opp, apiStr)); } catch (Exception e) { iflog.ErrorLog__c = 'ERROR ' + String.valueOf(oppMapping.get('SS_TableName__c')) + ' [' + apiStr + '] => [' + ssApiStr + ']' + e.getMessage() + '\n'; } } } } system.debug('===================222222222'+insSSOpp); if (updSelfFlg) { updSelfList.add(opp); } system.debug(updSelfList); // SS_Prospect_5days_list__c の対象かどうか、loopの中単独判断 //if (opp.StageName == '引合') { insSSOppList.add(insSSOpp); insSSOppId.add(opp.Id); //} } insert insSSOppList; system.debug('===================888888888'+insSSOppList[0].id); for(integer i = 0; i< insSSOppList.size();i++){ SSBDreportToSSodp.put(insSSOppId[i],insSSOppList[i].id); } // 商談商品 SS_Batch_Column_Mapping__c oliMapping = SS_Batch_Column_Mapping__c.getValues('OpportunityLineItem'); // select項目を oliMapping より生成 Set apiTempSet = new Set(); String oliSql = makeSql(oliMapping, apiTempSet); oliSql += ' where OpportunityId IN :insSSOppId'; Schema.SObjectType ssOliType = Schema.getGlobalDescribe().get(String.valueOf(oliMapping.get('SS_TableName__c'))); for (OpportunityLineItem oli : Database.query(oliSql)) { SObject insSSOli = ssOliType.newSObject(); insSSOliList.add(insSSOli); for (Integer i = 1; i <= FIELDMAX; i++) { String lpadI = ('00' + i).right(3); String fromColumn = 'From_Column_' + lpadI + '__c'; String apiStr = String.valueOf(oliMapping.get(fromColumn)); if (String.isBlank(apiStr) == false) { String ssColumn = 'SS_Column_' + lpadI + '__c'; String ssApiStr = String.valueOf(oliMapping.get(ssColumn)); try { insSSOli.put(ssApiStr, getValue(oli, apiStr)); } catch (Exception e) { iflog.ErrorLog__c = 'ERROR ' + String.valueOf(oppMapping.get('SS_TableName__c')) + ' [' + apiStr + '] => [' + ssApiStr + ']' + e.getMessage() + '\n'; } } } insSSOli.put('SSBD_All_Report_ID__c', SSBDreportToSSodp.get(oli.ID_test1__c)); System.debug('insSSOli:' + insSSOli); } // エラーをlogに書き出す if (updSelfList.size() > 0) { System.debug('updSelfList:' + updSelfList); Database.SaveResult[] lsr = Database.update(updSelfList, false); for (Integer tIdx = 0; tIdx < lsr.size(); tIdx++) { Database.SaveResult sr = lsr[tIdx]; System.debug('sr.isSuccess:' + sr.isSuccess()); if (!sr.isSuccess()) { Database.Error emsg = sr.getErrors()[0]; iflog.ErrorLog__c += 'ERROR Opportunity:' + emsg + '\n'; } } } insert insSSOliList; //SSBD_ALL_Report to //************************************************************************************************************** // //************************************************************************************************************** //************************************************************************************************************** // //************************************************************************************************************** } public void finish(Database.BatchableContext BC) { if (Test.isRunningTest() == false && TEST_ID == null) { // Database.executeBatch(new SSOpporToSSBDallRepBatch(), 100); } iflog.Log__c += '\nSSOpportunityBatch end'; String tmp = iflog.ErrorLog__c; if (tmp.length() > 65000) { tmp = tmp.substring(0, 65000); tmp += ' ...have more lines...'; iflog.ErrorLog__c = tmp; } update iflog; } }