2

変数とメソッドで public、static、および global キーワードを使用するのがよくわかりません。

以下は私のコードのスニペットです。私がやろうとしているのは、ページの読み込み時です。コンストラクターで、ユーザーがアクセスできるアカウント ID のセットを作成します (8-33 これは機能しています)。このセットは、後のメソッドで使用されるクエリをフィルタリングするために使用されます。

私が見つけたのは、public pageReference runSearch() は「terrAccSet」にアクセスできますが、public static List getsearchAccounts にはアクセスできないということです。

public static Set terrAccSet に変更すると、どちらの system.debug でもデータを取得できません。どうすればよいですか?

global with sharing class MyClass {

    public static List<FRM_Metrics_gne__c> accountSearchGmap {get; set;}
    public Set<Id> terrAccSet;
    public List<String> terrIdList;

//Constructor
public MyClass() {

    terrAccSet = new Set<Id>();
    terrIdList = new List<String>();
    Set<Id> grpIdSet = new Set<Id>();

    Id uid = '00570000001R95e'; //member of TWO territories
    //UserTerritory Utid =  [SELECT TerritoryId FROM UserTerritory where UserId = :userInfo.getUserId()];

    List<UserTerritory> Utid =  [SELECT TerritoryId FROM UserTerritory where UserId =: uid ];
    for(UserTerritory usrTerr: Utid){
        terrIdList.add(usrTerr.TerritoryId);
    }

    List<Group> grp = [Select Id from Group where RelatedID IN :terrIdList];
    for (Group eachgroupd : grp ){
        grpIdset.add(eachgroupd.Id);
    }

    List<AccountShare> accountidList = [SELECT AccountId,UserOrGroupId FROM AccountShare where UserOrGroupId in :grpIdset];
    //all accounst that the user has access according to territory hiearchy
    for(AccountShare eachas:accountidList ){
        terrAccSet.add(eachas.AccountId);
    }

}

public PageReference runSearch() {
    //Has Data
    system.debug('**terrAccSet runSearch**   '+terrAccSet);
}  

public static List<Custom_Object__c> getsearchAccounts(String multiSearchString) {
    //terrAccSet variable is missing
    system.debug('**terrAccSet getSearchAccounts**   '+terrAccSet);
        //logic
        return accountSearchGmap;
}

}

4

1 に答える 1

2

以下は私のコードのスニペットです。私がやろうとしているのは、ページの読み込み時です。コンストラクターで、ユーザーがアクセスできるアカウント ID のセットを作成します (8-33 これは機能しています)。このセットは、後のメソッドで使用されるクエリをフィルタリングするために使用されます。

このセットは、静的ではなく、インスタンス プロパティである必要があります。コントローラーまたはクラスの状態に影響を与えないメソッドを作成する場合は、 static を使用します。テキスト パーサー - テキスト イン テキスト アウト。

パッケージを作成し、クラスをパッケージの外部で使用できるようにして他の Apex コードでクラスを呼び出せるようにする場合、または公開する webService または REST メソッドをクラスで作成する場合は、クラスを Global にする必要があります。

プロパティを使用する VisualForce ページにプロパティを公開するには、Public を使用する必要があります。それ以外の場合は、コントローラー側のみの処理にプライベート メソッドとプロパティを使用します。

public static List getsearchAccounts(String multiSearchString) { //terrAccSet 変数がありません system.debug(' terrAccSet getSearchAccounts '+terrAccSet); // ロジックが accountSearchGmap を返します。}

このメソッドはインスタンス プロパティにアクセスする (状態を読み取る) ため、静的であってはなりません。

簡単な経験則として、それが visualforce ページ + コントローラである場合、データベースをクエリしてページにデータを返す通常の作業を行うために静的なものは必要ありません。

于 2012-10-23T02:47:57.613 に答える