私は Salesforce Apex の学習段階にあります。Dynamic Apex のトピックを読みましたが、概念を理解できませんでした。誰かがそれを処理する方法と、どのシナリオで使用するのが最適かを説明できますか? 前もって感謝します。
1 に答える
ユースケース1:
セールスフォースオブジェクトのメタデータを読み取り、オブジェクトレコードをユーザーに表示するページを開発しています。describeグローバルメソッドを使用したいのですが、標準のSOQLをジェネリックSObject
型と組み合わせる方法がわかりません。
標準SOQL例
Person__c [] persons = [SELECT Id, Name, Age__c, Height__c FROM Person__c];
ただし、describeグローバルメタデータメソッドはSObjectタイプを返します。
解決:
describe globalメソッドを使用してオブジェクトのリストを取得し、さらにそのオブジェクトのすべてのフィールドを取得します。すべてのフィールドを使用してローカル文字列変数にSELECTステートメントを作成し、を使用してクエリを実行しますDatabase.query()
。
string objectfullname = 'scenario__c';
Schema.SObjectType targetType = Schema.getGlobalDescribe().get('scenario__c');
if (targetType == null) {
system.debug('Type not found: '+objectFullname);
throw new TypeNotFoundException(objectFullName);
}
Schema.DescribeSObjectResult typedescription = targetType.getDescribe();
Map<String, schema.Sobjectfield> resultMap = typedescription.Fields.getMap();
string query = 'SELECT ' + string.join(new List<string>(resultMap.keySet()), ',') + ' FROM '+ objectfullname + ' LIMIT 100';
sobject [] records = Database.query(query);
ユースケース2
ベータマネージドパッケージのカスタムオブジェクトとコードを緩く結合して、マネージパッケージをアンインストールしてアップグレードできるようにします。
解決
このメソッドを使用する場合Database.query()
、コードはカスタムオブジェクトに対してコンパイルされないため、依存関係を削除するためにコードをコメントアウトする必要なしに再インストールできます。
ユースケース3
動的フィールドマッピングスキーマに従って挿入した後、レコードを別のカスタムオブジェクトにコピーするトリガーがあります。[SELECT ...]
実行時に挿入するオブジェクトしかわからないため、標準的な方法でコーディングすることはできません。
解決
ここでも、describeグローバルメソッドとDatabase.queryを使用してレコードとタイプ情報を取得し、通常のDMLのようにターゲットオブジェクトに挿入できます。
sobject newRecord = ...
for (integer i = 0; i < fieldCount; i++) {
newRecord.put(fields[i],values[i]);
}
insert newRecord;
いつものように一括挿入を行う場合は、DML(挿入、更新)ステートメントをループに入れないようにしてください。