2

私は Salesforce Apex の学習段階にあります。Dynamic Apex のトピックを読みましたが、概念を理解できませんでした。誰かがそれを処理する方法と、どのシナリオで使用するのが最適かを説明できますか? 前もって感謝します。

4

1 に答える 1

5

ユースケース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(挿入、更新)ステートメントをループに入れないようにしてください。

于 2012-12-24T03:22:16.727 に答える