0

私は2つのグローバルクラスを持っています。CreateAndModify クラスには、他のクラス、つまり CreateAndModifyProcessor の processRecord メソッドを呼び出す for ループを持つ実行関数があります。問題は、最初のクラスで宣言されたリストのコレクションがあり、2 番目のクラスではアクセスできないことです。それを行う方法はありますか?また、この方法で行うのは良いアイデアですか?..

global class CreateAndModify implements
Database.Batchable<sObject>, Database.Stateful{

global void execute(
Database.BatchableContext BC,

List<sObject> listObj){

list <Account__c> inAcc = new list<Account__c>();

for (sObject lo : listObj){
      processor.processRecord(lo);
}

insert inAcc; // The list object which i 
              // am modifying in the processRecord function has to be added to       
              // the database. So, is it a good idea to add/populate the            
              // in other function of other class
}


global class CreateAndModifyProcessor {
global void processRecord(sObject listObj){
Unprocessed_Agreement__c temp = (Unprocessed_Agreement__c)listObj;

Account__c tempAcc = new Account__c();

inAcc.add(tempAcc); // This line throws an error
}
}
4

3 に答える 3

3

リストinAccはexecuteメソッド内で定義されているため、そのスコープはそのメソッドに制限されており、そのメソッドまたはメソッドが属するクラスの外部では使用できません。レイアウトした構造をどうしても維持する必要がある場合は、以下のように、アカウントのリストをパラメーターとして処理メソッドに渡すだけではどうでしょうか。

global class CreateAndModify implements
    Database.Batchable<sObject>, Database.Stateful {

    global void execute(Database.BatchableContext BC, List<sObject> listObj) {

        list <Account__c> inAcc = new list<Account__c>();

        for (sObject lo : listObj) {
            processor.processRecord(lo, inAcc);
        }

        insert inAcc;
    }
}

global class CreateAndModifyProcessor {

    global void processRecord(sObject listObj, list<Account> listAcc) {
        Unprocessed_Agreement__c temp = (Unprocessed_Agreement__c)listObj;
        Account__c tempAcc = new Account__c();
        listAcc.add(tempAcc);
    }
}
于 2012-05-31T23:30:38.927 に答える
0

list <Account__c> inAcc = new list<Account__c>();はグローバル リストではありません。

実行メソッドの外に移動する必要があります。次のようにします

global class CreateAndModify implements Database.Batchable<sObject>, Database.Stateful{ 

   global  list <Account__c> inAcc = new list<Account__c>();

  global void execute(Database.BatchableContext BC, List<sObject> listObj){

      for (sObject lo : listObj){
      processor.processRecord(lo);
       }

   insert inAcc; 
 }
}
于 2012-05-31T18:06:29.663 に答える
0

アカウントまたはアカウントのリストを processRecord から返し、その方法で inAcc に追加するために、コードを少し再構築することを考えましたか? 次のようになります。

list <Account__c> inAcc = new list<Account__c>();

for (sObject lo : listObj){
    inAcc.addAll(processor.processRecord(lo));
}

insert inAcc;

global class CreateAndModifyProcessor {
    global list<Account> processRecord(sObject listObj){
        list<Account> accs = new list<Account>();
        Unprocessed_Agreement__c temp = (Unprocessed_Agreement__c)listObj;
        ... // some code that adds records to accs
        return accs;
    }
}
于 2012-05-31T18:38:25.427 に答える