Как определить, хранятся ли в поле в Salesforce.com целые числа?

Я пишу интеграцию между Salesforce.com и другим сервисом и столкнулся с проблемой с целочисленными полями. В Salesforce.com я определил поле типа «Число» с «Десятичными знаками», установленным на «0». В другом сервисе он окончательно хранится как целое число. Эти два поля должны хранить одни и те же целые числовые значения.

Проблема возникает, когда я сохраняю значение в варианте Salesforce.com этого поля. Salesforce.com вернет одно и то же значение из своих операций Query() и QueryAll() с неправильно добавленной степенью точности.

Например, если я вставлю значение «827» для этого поля в Salesforce.com, когда я позже извлеку это число из Salesforce.com, будет указано значение «827,0».

Я не хочу жестко запрограммировать интеграцию, чтобы удалить эти десятичные значения из определенных полей. Это не ремонтопригодно. Я хочу, чтобы он был достаточно умным, чтобы удалить десятичные значения из всех целочисленных полей до того, как запустится остальная часть кода интеграции. Как это сделать с помощью API SOAP Salesforce.com?

Я предполагаю, что это будет иметь какое-то отношение к свойству DescribeSObject() «Поле», где я могу сканировать метаданные, но я не вижу способа извлечь количество знаков после запятой из DescribeSObjectResult.


person Technetium    schedule 21.03.2012    source источник


Ответы (2)


Ах ха! Количество знаков после запятой указано в свойстве Scale объекта Field. Вы знаете, что у вас есть целочисленное поле, если оно равно "0".

person noodles    schedule 21.03.2012
comment
Бле. Я связал страницу с ответом на свой вопрос. Спасибо. - person Technetium; 21.03.2012

Технически поля sObject не являются целыми числами, даже если для свойства «Десятичные разряды» установлено значение 0. Это всегда десятичные числа с различными свойствами масштаба. Это важно помнить в APEX, потому что доступные методы для десятичных чисел отличаются от методов для целых чисел, и у вас есть другие потенциальные проблемы с преобразованием типов (не всегда, но в некоторых контекстах).

person barelyknown    schedule 21.03.2012
comment
Просто краткое примечание к вашему последнему комментарию: Apex считает, что Integer N и Decimal N.0 равны. Я также помню по крайней мере одно устаревшее числовое поле (возможно, NumberOfEmployees? У меня где-то есть заметки об этом, если вам интересно), которое демонстрирует целочисленное поведение. - person jkraybill; 22.03.2012
comment
Спасибо что подметил это. Я должен был проверить, прежде чем делать последний комментарий о равенстве. Я уверен, что тип Decimal для чисел sObject, поэтому я отредактирую последнюю строку. - person barelyknown; 22.03.2012
comment
Прохладный. К вашему сведению, истинный тип для нескольких устаревших числовых полей (где вы видите xsd:int в качестве типа в WSDL) на самом деле не является демическим. Я обнаружил ошибку, о которой говорил: попытка выполнить acct.put('NumberOfEmployees', myDecimal) выдает System.SObjectException: недопустимое присвоение десятичного числа целочисленному в Apex. Я не могу вспомнить, работает ли acct.NumberOfEmployees = myDecimal, вполне возможно, что работает. - person jkraybill; 22.03.2012