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
Dev 長尾拓磨Dev 長尾拓磨 

カスタム項目、カスタムオブジェクトの名前空間プレフィックスを取得したい

管理パッケージをテスト環境にインストールした際に、項目レベルセキュリティチェックのメソッドにて、
項目名を取得できなくなってしまいました。
        ​Schema.DescribeSObjectResult result = new CustomObject__c().getSObjectType().getDescribe();
        Map<String, Schema.SObjectField> fieldMap = result.fields.getMap();
        Boolean isCreate = fieldMap.get('FieldName').getDescribe().isCreateable();

オブジェクトの設定画面などを見ると、各カスタム項目やカスタムオブジェクトに
「インストール済みパッケージ名」として名前空間プレフィックスが表示されているので、
項目として持っていると判断したのですが、どう取得すれば良いのかわかりません。
 
        //理想
        XXXXX namespace = [select namespacePrefix from XXXXX ];
        ​Schema.DescribeSObjectResult result = new CustomObject__c().getSObjectType().getDescribe();
        Map<String, Schema.SObjectField> fieldMap = result.fields.getMap();
        Boolean isCreate = fieldMap.get(namespace + 'FieldName').getDescribe().isCreateable();

知っている方がいましたら教えていただけると助かります。
よろしくお願いします。
Takahiro NiheiTakahiro Nihei
かなり前の質問ですが、今後この質問にたどり着いた人のために記載します。

下記コードで名前空間を取得できます。[]内のSOQLはsObjecですが、.(ドット)でつなぎString型で定数に格納します。
static final String NAMESPACE_PREFIX = [SELECT NamespacePrefix FROM Organization].NamespacePrefix;

使い方ですが、名前空間は、__(アンスコ*2)を付与します。
Map<String, Schema.SObjectField> fieldMap = Schema.getGlobalDescribe().get(NAMESPACE_PREFIX + '__' + 'customObject__c').getDescribe().fields.getMap();
Boolean isCreate = fieldMap.get(NAMESPACE_PREFIX + '__' + 'customField__c').getDescribe().isCreateable();
System.debug(isCreate); // true
ハードコードですが上記コードで、私の環境では確認できました。
ご確認ください。

また、
補足ですが、名前空間がない場合(管理パッケージではない)場合も兼ねて、条件判定を入れると良いかもしれないです。
例)
String sObjectName = 'customObject__c'
if (!(String.isEmpty(NAMESPACE_PREFIX)) sObjectName = NAMESPACE_PREFIX + '__' + sObjectName;

このsObjectName変数を上記コードのgetの引数に渡す。
・・・など。

もし、よかったらベストアンサーをマークしてくれると励みになります。
よろしくお願いいたします。