Как искать Case по CaseNumber в Salesforce - PullRequest
3 голосов
/ 28 декабря 2011

В Salesforce каждый Case имеет уникальный CaseNumber, который устанавливается системой при создании Case.Контент представляет собой автономное число с форматом отображения, например {00000000}.Этот формат отображения может быть изменен системным администратором.

Например, для Case # 144 будет CaseNumber = 00000144. Case # 12345678 будет иметь CaseNumber = 12345678.

Пользователи ссылаются на случаи по номеру;без ведущих нулей.Итак, мне нужно найти дело путем поиска номера дела.

Предположим, пользователь хочет дело № 145?Этот поиск не даст никаких результатов:

Case matchingCase = [Select Id, CaseNumber, Subject, Description from Case where CaseNumber = '145'];

Предположим, я могу предположить, что displayFormat для CaseNumber никогда не меняется.В этом случае я мог бы добавить начальные нули, чтобы сделать запрос, который работает.Например, если формат отображения 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 ]

2 голосов
/ 30 декабря 2011

После публикации этого вопроса мне стало интересно, смогу ли я создать запрос SOQL, который бы преобразовал строку CaseNumber в целое число?

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 голос
/ 05 января 2012

Другой способ сделать это - использовать 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 имеет иные ограничения регулятора исполнения . На данный момент, только 20 могут быть выполнены за вызов Apex.

0 голосов
/ 28 декабря 2011

Перед выполнением запроса создайте переменную для 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);

Надеюсь, это поможет!

0 голосов
/ 28 декабря 2011

Нет смысла иметь эти ведущие нули. Это возврат к действительно старым системам, которые были слишком глупы, чтобы не печатать нули. Я предлагаю вам удалить нули из формата.

...