1

最終的にバッチ APEX を使用してスケジュールに従ってレコードを更新するクラスを作成しています。内部クラスの記述に問題があり、考えられる構文のあらゆる組み合わせを試しました。

コード:

public with sharing class AddendumsExpired {

    public List<Id> opportunityIds{get;set;}
    public List<Id> addendumIds{get;set;}

    public List<Id> OppIds(){

        for(Opportunity thisOpp :[SELECT Id,StageName,Name,Addendum_Amount__c,Addendum_Amount_No_Discounts__c,Agreement_Balance__c FROM Opportunity WHERE (NOT StageName LIKE '%Proposed%') AND (NOT StageName LIKE '%Accepted%')]){
            opportunityIds.add(thisOpp.Id);
        }

        return opportunityIds;
    }

    public List<Id> AddIds(){

        for(Addendum__c thisAdd :[SELECT Id FROM Addendum__c WHERE Opportunity__c IN :opportunityIds AND Expiration__c < TODAY]){
            addendumIds.add(thisAdd.Id);
        }

        return addendumIds;
    }

    public class debugging {
        system.debug('opportunityIds :: '+opportunityIds);
        system.debug('addendumIds :: '+addendumIds);
        system.debug('OppIds() :: '+OppIds());
        system.debug('AddIds() :: '+AddIds());
    }
}

私はまだテスト段階にあり、debuggingクラスがエラーをスローしています。最終的な本番展開には、複数の内部クラスが必要になります。

上記の構文 ( public class classname {) を問題なく使用したことがあります。ただし、このコード ブロックを匿名で実行すると、次のエラーが表示されます。

Compile error at line 24 column 8
unexpected token: 'class'

誰かがこの状況に光を当てることができれば、本当に感謝しています! 私は困惑し、なぜその構文が他の多くのクラスでは機能するのに、このクラスでは機能しないのか疑問に思っています。

4

1 に答える 1

2

クラスのコード:

public class debugging {
        system.debug('opportunityIds :: '+opportunityIds);
        system.debug('addendumIds :: '+addendumIds);
        system.debug('OppIds() :: '+OppIds());
        system.debug('AddIds() :: '+AddIds());
    }

宣言セクションに誤って配置され、実際のコードがあるべき場所ではありません (静的、ゲッター、セッターを除く)。

内部クラス (おそらくコンストラクター) 内のメソッド内に system.debug コードを配置すると、正常にコンパイルおよび実行されます。もちろん、最初にデバッグ クラスをインスタンス化して、含まれているコードを実行するためのインスタンスを作成する必要があります。

このような:

public class Debugging 
{
   public Debugging(List<Id> opportunityIds)
   {
      system.debug('opportunityIds :: '+opportunityIds);
   }
}

次に、インスタンスを作成してこれらのデバッグ ステートメントを実行し、officeIds リストを内部クラスのコンストラクターに渡します。

Debugging d = new Debugging(opportunityIds);

編集:

ゲッターとセッターを次のように変更します。これらには、リストの適切な初期化コードが含まれています (retVal を使用して、それぞれで新しいリストを宣言します)。

public List<Id> opportunityIds
{
   get
   {
      List<Id> retVal = new List<Id>();
      for(Opportunity thisOpp :[SELECT Id,StageName,Name FROM Opportunity WHERE (NOT StageName LIKE '%Proposed%') AND (NOT StageName LIKE '%Accepted%')])
      {
         opportunityIds.add(thisOpp.Id);
      }
      return retVal;
   }
   private set;
}

public List<Id> addendumIds
{
   get
   {
      List<Id> retVal = new List<Id>();
      for(Addendum__c thisAdd :[SELECT Id FROM Addendum__c WHERE Opportunity__c IN :opportunityIds AND Expiration__c < TODAY])
      {
         addendumIds.add(thisAdd.Id);
      }
      return retVal;
   }
   private set;
}
于 2012-08-01T17:07:06.647 に答える