Есть желание написать запрос для получения родительского и дочернего объекта, только если он есть.
Пример запроса:
[Select Id, Name, (Select Id, Name From Contact)
From Contact Where Count(Contact) > 0]
Только так делать нельзя.
Может кто подскажет рабочее решение.
==================================================================================================
A можно как-то проверить было ли поле в запросе?
Т.е. Account a = [Select Id From Account]
a.Name - you got exception
Если метод для проверки, чтобы не получить ошибку?
Гугл что-то говорил?
Советуют так:
[Select Id, Name, (Select Id, Name From Contact)
From Contact Where Id in (Select AccountId From Contact)]
Ну уж сильно много запросов
Ну да, в интернете именно такие примеры.
Я бы для этого замутил что-то кастомное на подобии RollupSummary только для Lookup поля
(вот тут обсуждается)
И потом просто селектил по WHERE children > 0
Кст, Дмитрий, спасибо за возможность отключения email уведомлений!
Знаю я один способ, но он тебе совсем не понравится....
Не это еще нормальный способ. Мой способ если я правильно помню позволял получить список полей доступных для обращения причем все сразу.
Расскажешь?
Расскажешь?
public static map < string, Schema.SObjectField > CheckFls(sObject sObj) {
map < string, Schema.SObjectField > UsedField = new map < string, Schema.SObjectField > ();
if (sObj == null) return UsedField;
map < string, Schema.SObjectField > FieldsList = sObj.getSObjectType().getDescribe().fields.getMap();
JSONParser parser = JSON.createParser(JSON.serialize(sObj));
parser.nextToken();
parser.nextToken();
parser.nextToken();
parser.nextToken(); while (parser.nextToken() != null) {
if (parser.getCurrentToken() == JSONToken.FIELD_NAME) {
String fieldName = parser.getCurrentName().toLowerCase();
if (FieldsList.get(fieldName) != null) UsedField.put(fieldName, FieldsList.get(fieldName));
parser.nextToken();
}
}
return UsedField;
}
Расскажешь?
Работает?
Расскажешь?Работает?
Похоже работает настолько хорошо, что человек потерял дар речи :)
Работает?
Работает?
Нет
Странно но тут 2 варианта. Либо я не понял задание, либо кто-то плохой танцор. Логи прилагаю.
Contact A = new Contact (LastName ='Test',FirstName='Test1');
system.debug(LoggingLevel.error, A + '\n\n' + CheckFls(A));
ERROR|Contact:{FirstName=Test1, LastName=Test}{firstname=FirstName, lastname=LastName}
Из того что я вижу в логах, мой метод выводит только те поля, которые определены.
Wilder хочется сказать тебе спасибо за идею сериализации объекта, она помогла решить многие задачи.
Wilder хочется сказать тебе спасибо за идею сериализации объекта, она помогла решить многие задачи.
Не за что :)