salesforce中的动态顶点是什么?

use*_*497 2 salesforce apex-code

我正处于Salesforce Apex的学习阶段.我已经阅读了Dynamic Apex的主题,并且无法理解这个概念.有人可以解释它如何处理它以及在哪种情况下最好使用它?提前致谢.

Ger*_*ton 5

用例1:

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

标准SOQL,例如

Person__c [] persons = [SELECT Id, Name, Age__c, Height__c FROM Person__c];
Run Code Online (Sandbox Code Playgroud)

但描述全局元数据方法返回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);
Run Code Online (Sandbox Code Playgroud)

用例2

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

当您使用该Database.query()方法时,您的代码不会针对自定义对象进行编译,因此可以重新安装它,而无需注释掉代码以删除依赖项.

用例3

根据动态字段映射架构,您有一个触发器在插入后将记录复制到另一个自定义对象.您无法以标准方式对其进行编码,[SELECT ...]因为您只知道在运行时插入的对象.

再次,使用describe global methods&Database.query来获取记录和类型信息,然后就可以像普通DML一样插入到目标对象中.

sobject newRecord = ...
for (integer i = 0; i < fieldCount; i++) {
    newRecord.put(fields[i],values[i]);
}
insert newRecord;
Run Code Online (Sandbox Code Playgroud)

如果您像往常一样进行批量插入,请确保不要将DML(插入,更新)语句放在循环中.