在Salesforce中,每个Case都有一个唯一的CaseNumber,在创建Case时由系统设置。内容是具有显示格式的自动编号,例如{00000000}。该显示格式可由系统管理员修改。
例如,案例#144将具有CaseNumber = 00000144。 案例#12345678将拥有CaseNumber = 12345678。
用户按编号参考案例;没有前导零。所以,我需要通过搜索案例编号找到案例。
假设用户想要案例#145?此搜索将找不到任何结果:
Case matchingCase = [Select Id, CaseNumber, Subject, Description from Case where CaseNumber = '145'];
假设我可以假设CaseNumber的displayFormat永远不会改变。在这种情况下,我可以在前导零之前添加一个有效的查询。例如,如果CaseNumber的显示格式为{00000000},则此查询有效:
Case matchingCase = [Select Id, CaseNumber, Subject, Description from Case where CaseNumber = '00000145'];
但显示格式可以改变,所以我们不能假设任何东西。
问题1.使用一些API查询我们如何查询获取displayFormat以确定前导零的数量?
另一种方法是使用LIKE。例如,这“工作”
Case[] matchingCases = [Select Id, CaseNumber, Subject, Description from Case where CaseNumber LIKE '%145'];
但是查询将返回以145结尾的所有案例,包括'00009145'等案例。
问题(2)如何形成一个查询以准确返回案例编号145?
答案 0 :(得分:2)
发布此问题后,我想知道是否可以构建将CaseNumber字符串转换为整数的SOQL查询?
Case[] matchingCases = [Select Id, CaseNumber, Subject, Description from Case where Integer.valueOf(CaseNumber) = 144];
但SOQL中没有对此的支持。
然而这段代码可行,因为它基于整数比较进行测试。
Integer target = 144;
String caseNumber = '%' + String.valueOf(target);
Case[] matchingCases = [Select Id, CaseNumber, Subject, Description from Case where CaseNumber like :caseNumber];
for(Case aCase: matchingCases)
{
Integer cnum = Integer.valueOf(aCase.CaseNumber);
if(cnum == target) {
system.debug('FOUND IT');
break;
}
}
答案 1 :(得分:1)
另一种方法是使用SOSL而不是SOQL。例如,以下工作。
Integer iCaseNumber = 28;
String sCaseNumber = (iCaseNumber!=null?'*'+String.valueOf(iCaseNumber):'');
List<List<Case>> matchingCases =
[FIND :sCaseNumber RETURNING Case (Id, CaseNumber, Subject Order By CaseNumber)];
system.debug(matchingCases);
但是,SOSL有不同的execution governor limits。截至目前,每个Apex呼叫只能执行20个。
答案 2 :(得分:0)
拥有那些领先的零没有意义。这是真正旧系统的回归,它们太愚蠢而不能打印零。我建议你从格式中删除零。
答案 3 :(得分:0)
在进行查询之前,为CaseNumber创建一个变量并用零填充它。
Case LargestCaseNumber = [SELECT Id, CaseNumber, Subject, Description FROM Case ORDER BY CaseNumber DESC LIMIT 1];
Integer MaxCaseNumber = (LargestCaseNumber!=null?LargestCaseNumber.CaseNumber.length():8);
Integer iCaseNumber = 145;
String sCaseNumber = (iCaseNumber!=null?String.valueOf(iCaseNumber):'');
for(Integer i=sCaseNumber.length(); i<MaxCaseNumber; i++) { sCaseNumber='0'+sCaseNumber; }
Case[] matchingCases = [Select Id, CaseNumber, Subject, Description from Case where CaseNumber = :sCaseNumber];
system.debug(matchingCases);
希望有所帮助!