使用Salesforce。我有Transaction-1和Transaction-2对象,它与Case对象具有主要的详细关系。动态查询正在创建,它在数据库上执行,结果如下所示。
这是案例的示例结果:
({Id = 500c000000B1LYCAA3,CaseNumber__c = RPQ-00001231,CreatedById = 005c000UUUU,LastModifiedDate = 2018-01-02 12:56:03,LastModifiedById = 005c000UUUU,OwnerId = 005c000UUUU,Category__c = Payment,SubCategory__c = Chase Paymentech,Origin = Email,CreatedDate = 2018-01-01 15:22:14,Status = Pending,ContactId = 003c000})
我需要根据登录用户区域设置格式化所有Date和DateTime字段。主要是dd-MM-yyyy。
List<Sobject> s = Database.query(queryStr);
s具有以上所有结果。如何识别所有日期和日期时间字段?我是否需要迭代它并使用RegEx来识别日期或日期/时间字段?
答案 0 :(得分:0)
我尝试从链接https://releasenotes.docs.salesforce.com/en-us/summer16/release-notes/rn_apex_sobject_getmap.htm
中引用,尝试了类似下面的内容Map<String, Object> finalMap = new Map<String, Object>();
List<Case> mylist = new List<Case>();
Map<String, Object> fieldsToValue = myCase.getPopulatedFieldsAsMap();
for(String fieldName : fieldsToValue.keySet()){
if(fieldsToValue.get(fieldName) instanceOf Date){
Date dateValue = Date.valueOf(fieldsToValue.get(fieldName));
finalMap.put(fieldName, DateTime.newInstance(dateValue.year(), dateValue.month(), dateValue.day()).format());
}else if(fieldsToValue.get(fieldName) instanceOf DateTime){
Date dateValue = Date.valueOf(fieldsToValue.get(fieldName));
finalMap.put(fieldName, DateTime.newInstance(dateValue.year(), dateValue.month(), dateValue.day()).format());
}else{
finalMap.put(fieldName, fieldsToValue.get(fieldName));
}
}
如何将Map finalMap转换回SObject?
答案 1 :(得分:0)
您是如何创建动态查询的?如果您正在使用“描述”调用来学习Case上所有字段的名称,那么您就不是很远了。
另外请记住,仅仅因为查询是动态的,并不意味着您必须将结果存储在List<sObject>
中。将它投射到Cases非常好,然后它们变得更容易使用(如果你将在VF页面上使用结果,它应该为你处理日期格式!)。 List<Case> records = Database.query('SELECT Subject FROM Case LIMIT 10');
应该没问题。
但是,如果你真的需要,让我们尝试手动完成。我将阅读Contact上的所有字段(我的开发版中的Case上没有任何日期字段)并检查我应该如何格式化它们。
Map<String, Schema.SObjectField> fieldMap = Schema.SObjectType.Contact.fields.getMap();
Set<String> dateFields = new Set<String>();
Set<String> dateTimeFields = new Set<String>();
List<String> allFields = new List<String>(fieldMap.keyset());
allFields.sort();
System.debug(allFields);
for(String key : fieldMap.keyset()){
Schema.DescribeFieldResult dfr = fieldMap.get(key).getDescribe();
Schema.DisplayType t = dfr.getType();
if(t == DisplayType.Date){
dateFields.add(key);
} else if(t == DisplayType.DateTime){
dateTimeFields.add(key);
}
}
System.debug('Date: ' + dateFields);
System.debug('DateTime: ' + dateTimeFields);
String query = String.join(new List<String>{
'SELECT ' + String.join(allFields, ','),
'FROM Contact',
'LIMIT 10'
}, '\n');
List<Contact> contacts = (List<Contact>) Database.query(query);
for(Contact c : contacts){
System.debug(c);
for(String field : dateFields){
String value = c.get(field) == null ? '(empty)' : ((Date) c.get(field)).format();
System.debug(field + ': ' + value);
}
for(String field : dateTimeFields){
String value = c.get(field) == null ? '(empty)' : ((DateTime) c.get(field)).format();
System.debug(field + ': ' + value);
}
}