function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
ruparuparuparupa 

項目一覧を取得するときに出るエラーをなくしたい

お世話になっております。

リードの項目一覧を取得したく、下記のように実装したのですが、
「System.SObjectException: Field Lead.HasOptedOutOfEmail is inaccessible in this context」というエラーが出てしまいます。
エラー内容からして、「HasOptedOutOfEmail」の項目に(権限がなくて?)アクセスできないのかと考えているのですが、
アクセスできない項目を除いて項目一覧を取得する方法はございますでしょうか。
ご存知の方がいらっしゃいましたらご教授をよろしくお願いいたします。
public List<SelectOption> fields = new List<SelectOption>();
for (Schema.SObjectField field: getSObjectFields('Lead')) {
    Schema.DescribeFieldResult fr = field.getDescribe();
    fields.add(new SelectOption(fr.getName(), fr.getLabel()));
}

public List<Schema.SObjectField> getSObjectFields (String objectName) {
    Schema.DescribeSObjectResult sr = Schema.getGlobalDescribe().get(objectName).getDescribe();
    return sr.fields.getMap().values();
 }

 
Best Answer chosen by ruparupa
Taiki YoshikawaTaiki Yoshikawa
開発者コンソールからもExecute Anonymousを実行できたので確認してみたところ、同様のエラーが発生しました。
原因はわかりませんが、こちらが一番近そうに思えます。

Schema.getGlobalDescribe and “Invalid field LastReferencedDate for Account”
http://salesforce.stackexchange.com/questions/16914/schema-getglobaldescribe-and-invalid-field-lastreferenceddate-for-account

All Answers

ms-hase-q23eems-hase-q23ee
エラーが3行目や8行目で出ているのなら、"SObjectException"をcatchして何もせずに続行させればいいのではないでしょうか?
Taiki YoshikawaTaiki Yoshikawa
次のコードで自分のDeveloper環境で試してみたのですが、エラーを再現できませんでした。
<apex:page controller="GetLeadObjectFieldsController">
    <apex:form >
        <ul>
            <apex:repeat value="{!fields}" var="item">
                <li>
                    <apex:outputText value="{!item}" />
                </li>
            </apex:repeat>
        </ul>
    </apex:form>
</apex:page>
public with sharing class GetLeadObjectFieldsController {
    
    public List<String> fields {get; set;}
    
    public GetLeadObjectFieldsController () {
    
        this.fields = new List<String>();
    
        // Get Fields Info
        for (Schema.SObjectField field: getSObjectFields('Lead')) {
            Schema.DescribeFieldResult fr = field.getDescribe();
            // Add List
            this.fields.add(fr.getName() + ' : ' + fr.getLabel());
        }
    }
 
    private List<Schema.SObjectField> getSObjectFields (String objectName) {
        Schema.DescribeSObjectResult sr = Schema.getGlobalDescribe().get(objectName).getDescribe();
        return sr.fields.getMap().values();
    }
}

リードの参照権限を外したプロファイルのユーザでも特にエラーが発生しなかったので、項目レベルセキュリティなどでは無い気がします。
ちなみにApexからでなく標準の詳細ページから参照した場合は「HasOptedOutOfEmail」項目の値は参照できますでしょうか?


また、次の類似の投稿をみつけました。こちらのケースの場合はAPIバージョンが原因だったみたいです。
(自分の環境でAPIバージョンを下げるケースも確認してみたのですが、特にエラーになりませんでした。。)

System.SObjectException: Field Lead.LastViewedDate is inaccessible [ LastViewedDate ]
https://developer.salesforce.com/forums/ForumsMain?id=906F00000008olaIAA


 
ruparuparuparupa
ご回答ありがとうございました。

私の環境でも下記コードで確認が取れました。
<apex:page controller="GetLeadObjectFieldsController">
    <apex:form >
        <apex:selectList value="{!selects}" multiselect="false" >
            <apex:selectOptions value="{!fields}"/>
        </apex:selectList>
    </apex:form>
</apex:page>
public with sharing class GetLeadObjectFieldsController {
    
    public List<SelectOption> fields  {get; set;}
    public String[] selects {get; set;}
    
    public GetLeadObjectFieldsController () {

        fields = new List<SelectOption>();
        for (Schema.SObjectField field: getSObjectFields('Lead')) {
            Schema.DescribeFieldResult fr = field.getDescribe();
            fields.add(new SelectOption(fr.getName(), fr.getLabel()));
        }
    }
    
    public List<Schema.SObjectField> getSObjectFields (String objectName) {
        Schema.DescribeSObjectResult sr = Schema.getGlobalDescribe().get(objectName).getDescribe();
        return sr.fields.getMap().values();
    }
}

実は、「System.SObjectException: Field Lead.HasOptedOutOfEmail is inaccessible in this context」というエラーなのですが、
EclipseのExecute Anonymousで質問にあげたコードを実行すると出たエラーなのです。
User-added image
Execute Anonymous実行時だと何か違うのでしょうか。。
Taiki YoshikawaTaiki Yoshikawa
開発者コンソールからもExecute Anonymousを実行できたので確認してみたところ、同様のエラーが発生しました。
原因はわかりませんが、こちらが一番近そうに思えます。

Schema.getGlobalDescribe and “Invalid field LastReferencedDate for Account”
http://salesforce.stackexchange.com/questions/16914/schema-getglobaldescribe-and-invalid-field-lastreferenceddate-for-account
This was selected as the best answer
ruparuparuparupa
Taikiさん

ご回答ありがとうございました!
確認してみます!