我很难理解使用公共,静态和全局关键字和我的变量和方法。
以下是我的代码片段。我正在尝试做的是页面加载,在我的构造函数中创建一组用户有权访问的accountID(8-33这是有效的)。此集将用于过滤后续方法中使用的查询。
我发现公共pageReference runSearch()可以访问'terrAccSet',但公共静态List getsearchAccounts无法访问它。
如果我将其更改为public static 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;
}
}
答案 0 :(得分:2)
以下是我的代码片段。我正在尝试做的是页面加载,在我的构造函数中创建一组用户有权访问的accountID(8-33这是有效的)。此集将用于过滤后续方法中使用的查询。
此集应该是实例属性,而不是静态。 如果要创建不影响控制器或类状态的方法,请使用static,例如。文本解析器 - 文本输出中的文本。
如果你想创建一个包并让你的类在你的包之外可用,那么你应该创建Global类,以便其他Apex代码可以调用它,或者你的类将创建要暴露的webService或REST方法。
Public应该用于向将使用属性的VisualForce页面公开属性。否则,使用私有方法和属性进行控制器端处理。
public static List getsearchAccounts(String multiSearchString){ //缺少terrAccSet变量 system.debug(' terrAccSet getSearchAccounts '+ terrAccSet); //逻辑 return accountSearchGmap; }
此方法不应该是静态的,因为它访问实例属性(它读取状态)。
简单的经验法则,如果它是一个visualforce页面+控制器,你不需要任何静态来执行查询数据库和将数据返回页面的正常工作。