2

我正处于 Salesforce Apex 的学习阶段。我已阅读 Dynamic Apex 的主题,但无法理解该概念。有人可以解释一下如何处理它以及最好在哪些情况下使用?提前致谢。

4

1 回答 1

5

用例 1:

您正在开发一个页面,该页面读取 salesforce 对象元数据以向用户显示对象记录。您想使用 describe 全局方法,但不知道如何将标准 SOQL 与泛型SObject类型结合起来。

标准 SOQL 例如

Person__c [] persons = [SELECT Id, Name, Age__c, Height__c FROM Person__c];

但是 describe 全局元数据方法返回一个 SObject 类型。

解决方案:

使用 describe 全局方法获取对象列表,然后进一步获取该对象上的所有字段。在包含所有字段的本地字符串变量中构建一个 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

您希望将代码与 beta 托管打包中的自定义对象松散耦合,以便可以卸载和升级托管打包。

解决方案

当您使用该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 回答