2

我很难理解在变量和方法中使用公共、静态和全局关键字。

下面是我的代码片段。我要做的是在页面加载时,在我的构造函数中创建一组用户可以访问的 accountID(8-33 这是有效的)。该集合将用于过滤后面方法中使用的查询。

我发现公共 pageReference runSearch() 可以访问“terrAccSet”,但公共静态 List getsearchAccounts 无权访问它。

如果我将其更改为公共静态 Set terrAccSet,我不会在任一 system.debugs 中获取数据 - 我该怎么办?

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

下面是我的代码片段。我要做的是在页面加载时,在我的构造函数中创建一组用户可以访问的 accountID(8-33 这是有效的)。该集合将用于过滤后面方法中使用的查询。

这个集合应该是一个实例属性,而不是静态的。当你想创建一个不影响控制器或类状态的方法时使用静态,例如。文本解析器-文本输入文本输出。

如果您想创建一个包并使您的类在您的包外可用,以便其他 Apex 代码可以调用它,或者如果您的类将创建要公开的 webService 或 REST 方法,您应该将类​​设为 Global。

Public 应该用于向将使用这些属性的 VisualForce 页面公开属性。否则,使用 Private 方法和属性仅用于控制器端处理。

public static List getsearchAccounts(String multiSearchString) { //terrAccSet 变量丢失 system.debug(' terrAccSet getSearchAccounts '+terrAccSet); //逻辑返回 accountSearchGmap; }

这个方法不应该是静态的,因为它访问一个实例属性(它读取状态)。

简单的经验法则,如果它是一个visualforce页面+控制器,你不应该需要任何静态的东西来完成查询数据库并将数据返回到页面的正常工作。

于 2012-10-23T02:47:57.613 回答