如何在Salesforce中搜索Case by CaseNumber

时间:2011-12-28 19:00:39

标签: salesforce apex-code

在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?

4 个答案:

答案 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);

希望有所帮助!