Регистрация  |  Вход

Вопросы по SOQL

Есть желание написать запрос для получения родительского и дочернего объекта, только если он есть.
Пример запроса:
[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 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)]

Ну уж сильно много запросов

Советуют так:

[Select Id, Name, (Select Id, Name From Contact)
From Contact Where Id in (Select AccountId From Contact)] 

Ну уж сильно много запросов

Gres
Советуют так:

[Select Id, Name, (Select Id, Name From Contact)
From Contact Where Id in (Select AccountId From Contact)]

Ну уж сильно много запросов

Ну да, в интернете именно такие примеры.
Я бы для этого замутил что-то кастомное на подобии RollupSummary только для Lookup поля
(вот тут обсуждается)
И потом просто селектил по WHERE children > 0

[quote="Gres"]Советуют так:

[Select Id, Name, (Select Id, Name From Contact)
From Contact Where Id in (Select AccountId From Contact)] 

Ну уж сильно много запросов[/quote]

Ну да, в интернете именно такие примеры.
Я бы для этого замутил что-то кастомное на подобии RollupSummary только для Lookup поля
(вот [url=http://salesforce.stackexchange.com/questions/33650/how-to-write-a-rollup-summary-trigger-for-a-lookup-relationship]тут[/url] обсуждается)
И потом просто селектил по WHERE children > 0

Кст, Дмитрий, спасибо за возможность отключения email уведомлений!

Кст, Дмитрий, спасибо за возможность отключения email уведомлений!

Gres
A можно как-то проверить были ли поле в запросе?

Т.е. Account a = [Select Id From Account]

a.Name - you got exception

Если метод для проверки, чтобы не получить ошибку?

Знаю я один способ, но он тебе совсем не понравится....

[quote="Gres"]A можно как-то проверить были ли поле в запросе? 

Т.е. Account a = [Select Id From Account] 

a.Name - you got exception

Если метод для проверки, чтобы не получить ошибку?[/quote]

Знаю я один способ, но он тебе совсем не понравится....

wilder
Знаю я один способ, но он тебе совсем не понравится....

try-catch ?

[quote="wilder"]Знаю я один способ, но он тебе совсем не понравится....[/quote]
try-catch ?

Gres
wilder
Знаю я один способ, но он тебе совсем не понравится....

try-catch ?

Не это еще нормальный способ. Мой способ если я правильно помню позволял получить список полей доступных для обращения причем все сразу.

[quote="Gres"][quote="wilder"]Знаю я один способ, но он тебе совсем не понравится....[/quote]
try-catch ?[/quote]

Не это еще нормальный способ. Мой способ если я правильно помню позволял получить список полей доступных для обращения причем все сразу.

Расскажешь?

Расскажешь?

Gres
Расскажешь?

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;
}

[quote="Gres"]Расскажешь?[/quote]

[code]
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;
}

[/code]

Gres
Расскажешь?

Работает?

[quote="Gres"]Расскажешь?[/quote]

Работает?

wilder
Gres
Расскажешь?

Работает?

Похоже работает настолько хорошо, что человек потерял дар речи :)

[quote="wilder"][quote="Gres"]Расскажешь?[/quote]

Работает?[/quote]

Похоже работает настолько хорошо, что человек потерял дар речи :)

wilder
Работает?

Да

[quote="wilder"]Работает?[/quote]
Да

Gres
wilder
Работает?

Нет

Странно но тут 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}

Из того что я вижу в логах, мой метод выводит только те поля, которые определены.

[quote="Gres"][quote="wilder"]Работает?[/quote]
Нет[/quote]

Странно но тут 2 варианта. Либо я не понял задание, либо кто-то плохой танцор. Логи прилагаю.
[code]
Contact A = new Contact (LastName ='Test',FirstName='Test1');
system.debug(LoggingLevel.error, A + '\n\n' + CheckFls(A));
[/code]

[code]
ERROR|Contact:{FirstName=Test1, LastName=Test}

{firstname=FirstName, lastname=LastName}
[/code]

Из того что я вижу в логах, мой метод выводит только те поля, которые определены. 

Wilder хочется сказать тебе спасибо за идею сериализации объекта, она помогла решить многие задачи.

[url=https://salesforce-developer.ru/community/developer/wilder]Wilder[/url] хочется сказать тебе спасибо за идею сериализации объекта, она помогла решить многие задачи.

Gres
Wilder хочется сказать тебе спасибо за идею сериализации объекта, она помогла решить многие задачи.

Не за что :)

[quote="Gres"][url=https://salesforce-developer.ru/community/developer/wilder]Wilder[/url] хочется сказать тебе спасибо за идею сериализации объекта, она помогла решить многие задачи.[/quote]

Не за что :)