Salesforce触发器无法理解



下面是我的同事写的代码,他已经不在公司工作了。我正在用数据加载器在对象中插入记录,我可以看到成功消息,但在我的对象中没有看到任何记录。我不明白下面的触发器在做什么。请有人帮我理解,因为我是销售人员的新手。

trigger DataLoggingTrigger on QMBDataLogging__c (after insert) {

Map<string,Schema.RecordTypeInfo> recordTypeInfo = Schema.SObjectType.QMB_Initial_Letter__c.getRecordTypeInfosByName();    
List<QMBDataLogging__c> logList = (List<QMBDataLogging__c>)Trigger.new;
List<Sobject> sobjList  =  (List<Sobject>)Type.forName('List<'+'QMB_Initial_Letter__c'+'>').newInstance();
Map<string, QMBLetteTypeToVfPage__c> QMBLetteTypeToVfPage  = QMBLetteTypeToVfPage__c.getAll();
Map<String,QMBLetteTypeToVfPage__c> mapofLetterTypeRec = new Map<String,QMBLetteTypeToVfPage__c>();
set<Id>processdIds = new set<Id>();
for(string key : QMBLetteTypeToVfPage.keyset())
{
if(!mapofLetterTypeRec.containsKey(key)) mapofLetterTypeRec.put(QMBLetteTypeToVfPage.get(Key).Letter_Type__c, QMBLetteTypeToVfPage.get(Key)); 
}
for(QMBDataLogging__c log : logList)
{
Sobject logRecord = (sobject)log;
Sobject QMBLetterRecord = new QMB_Initial_Letter__c();
if(mapofLetterTypeRec.containskey(log.Field1__c))
{
string recordTypeId = recordTypeInfo.get(mapofLetterTypeRec.get(log.Field1__c).RecordType__c).isAvailable() ? recordTypeInfo.get(mapofLetterTypeRec.get(log.Field1__c).RecordType__c).getRecordTypeId() :  recordTypeInfo.get('Master').getRecordTypeId();  
string  fieldApiNames = mapofLetterTypeRec.containskey(log.Field1__c)  ?  mapofLetterTypeRec.get(log.Field1__c).FieldAPINames__c : '';
//QMBLetterRecord.put('Letter_Type__c',log.Name);
QMBLetterRecord.put('RecordTypeId',tgh); 
processdIds.add(log.Id);
if(string.isNotBlank(fieldApiNames) && fieldApiNames.contains(','))
{
Integer i = 1;


for(string fieldApiName : fieldApiNames.split(','))
{
string logFieldApiName = 'Field'+i+'__c';
fieldApiName = fieldApiName.trim();
system.debug('fieldApiName=='+fieldApiName);
Schema.DisplayType fielddataType =   getFieldType('QMB_Initial_Letter__c',fieldApiName);
if(fielddataType == Schema.DisplayType.Date)
{
Date dateValue = Date.parse(string.valueof(logRecord.get(logFieldApiName)));
QMBLetterRecord.put(fieldApiName,dateValue);
}
else if(fielddataType  == Schema.DisplayType.DOUBLE)
{
string value = (string)logRecord.get(logFieldApiName);
Double  dec  = Double.valueOf(value.replace(',',''));
QMBLetterRecord.put(fieldApiName,dec);
}
else if(fielddataType == Schema.DisplayType.CURRENCY)
{
Decimal  decimalValue  = Decimal.valueOf((string)logRecord.get(logFieldApiName));
QMBLetterRecord.put(fieldApiName,decimalValue);   
}
else if(fielddataType == Schema.DisplayType.INTEGER)
{
string value = (string)logRecord.get(logFieldApiName);
Integer  integerValue  = Integer.valueOf(value.replace(',',''));
QMBLetterRecord.put(fieldApiName,integerValue);   
}
else if(fielddataType == Schema.DisplayType.DATETIME)
{
DateTime  dateTimeValue  = DateTime.valueOf(logRecord.get(logFieldApiName));
QMBLetterRecord.put(fieldApiName,dateTimeValue);   
}

else
{
QMBLetterRecord.put(fieldApiName,logRecord.get(logFieldApiName));
}
i++;
}
}  
}

sobjList.add(QMBLetterRecord);

}

if(!sobjList.isEmpty())
{
insert sobjList;
if(!processdIds.isEmpty()) DeleteDoAsLoggingRecords.deleteTheProcessRecords(processdIds);
}

Public static Schema.DisplayType  getFieldType(string objectName,string fieldName)
{
SObjectType r = ((SObject)(Type.forName('Schema.'+objectName).newInstance())).getSObjectType();
DescribeSObjectResult d = r.getDescribe();
return(d.fields.getMap().get(fieldName).getDescribe().getType());
}

}

您可能找错地方了。检查是否有为这个东西编写的单元测试(应该有,特别是如果它被部署到生产环境中(,它应该帮助您了解应该如何使用它。


您正在插入QMBDataLogging__c的记录,但它们似乎会立即在DeleteDoAsLoggingRecords.deleteTheProcessRecords(processdIds)中删除。无论这件事本该做的事情是否成功。

这似乎是一些穷人的CSV解析器或通用的"CSV"解析器;上传任何";。。。其获取存储在CCD_ 3中的数据并从中创建CCD_

QMBLetteTypeToVfPage__c.getAll()建议您可以转到安装程序->自定义设置,试着找到这个东西并检查。也许它在生产中有一些价值,但在你的沙盒中它是空的,这就是为什么基本上什么都不起作用?或者可能有些价值观已经过时了?

如果您上传到Field1__c中的内容可以与该自定义设置中的内容相匹配,则会有一些比较。我想你在那里加载了某种类型的QMB_Initial_Letter__c子类型。记录类型名称和要从日志记录中读取的字段列表也是基于该匹配从自定义设置中提取的。

然后,这个东西拿走你粘贴的东西,查看自定义设置中的字段列表并对其进行解析

假设自定义设置包含类似的内容

Name = XYZ, FieldAPINames__c = 'Name,SomePicklist__c,SomeDate__c,IsActive__c'

这个东西会看到你插入的第一个记录,假设你有像一样的CSV

Field1__c,Field2__c,Field3__c,Field4__c
XYZ,Closed,2022-09-15,true

这个东西会试图解析和映射它,所以最终你会创建一个";正常的";顶点代码表示为

new QMB_Initial_Letter__c(
Name = 'XYZ',
SomePicklist__c = 'Closed',
SomeDate__c = Date.parse('2022-09-15'),
IsActive__c = true
);

你可能已经知道,它非常脆弱。因为解析CSV是一门艺术——我预计当其中包含逗号的文本出现时(some text,"text, with commas in it, should be quoted",more text(,它会崩溃并燃烧。

理论上,管理员可以在设置中更改映射,但他们无论如何都需要在加载的文件中添加新字段。克服了。我想有人这样做是为了解决记录类型ID的问题,但有更好的方法可以实现这一点,并且仍然有具有正常列和强类型匹配的普通CSV文件,而不仅仅是将所有内容都作为字符串丢弃。

理论上,这让你有";锯齿状";csv文件(第1行有5个字段,第2行有不同的记录类型和17个字段?没有问题(

您的呼叫是否可以挽救,或者您宁愿放弃它,尝试正常加载QMB_Initial_Letter__c记录。(回到你的业务人员那里询问需求?(如果你在源代码中有可变数量的列,你需要对其进行标准化或对数据进行分组,这样只有1";类型";记录(好吧,"Field1_c"中的任何内容(进入每个文件。

相关内容

  • 没有找到相关文章

最新更新