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

Значение поля не доступно в Queueable классе !ИЛИ история рокового стечения обстоятельств!!!

Привет.

Сегодня столкнулся с крайне непонятной проблемой и уже полдня ломаю голову

Есть простой Queueable класс который запускается асинхронно и делает один запрос из базы чтобы отослать данные в сторонний сервис.

Так вот почему-то одно поле (обычный picklist) упорно не хочет возвращать свое значение в запросе. Вроде поле обычное, все и для всех права на него открыты, когда я делаю запрос синхронно - значение вижу, асинхронный контекст выполняется тоже от моего имени. НО МЛЯ значение пустое. Я даже сделал поле Formula и выводу значение через него - синхронно вижу, асинхронно НЕТ!

ЧТО ЗА БРЕД?

Привет.

Сегодня столкнулся с крайне непонятной проблемой и уже полдня ломаю голову

Есть простой Queueable класс который запускается асинхронно и делает один запрос из базы чтобы отослать данные в сторонний сервис.

Так вот почему-то одно поле (обычный picklist) упорно не хочет возвращать свое значение в запросе. Вроде поле обычное, все и для всех права на него открыты, когда я делаю запрос синхронно - значение вижу, асинхронный контекст выполняется тоже от моего имени. НО МЛЯ значение пустое. Я даже сделал поле Formula и выводу значение через него - синхронно вижу, асинхронно НЕТ! 

ЧТО ЗА БРЕД?

Нет все еще хуже!!!

Поля не видно даже синхронно. Продублировал запрос перед асинхронным вызовом.

Тоже пусто. Код этот вызывается из триггера и проверяю я ручным апдейтом записи через стандарт лайаут.

Т.е. код лежит класса without sharing и вызывается из триггера - нет значения.
Воожу запрос через Developer Console - работает - вижу значение.

ЧТО МЛЯ ЗА БРЕД ТАКОЙ?

Нет все еще хуже!!!

Поля не видно даже синхронно. Продублировал запрос перед асинхронным вызовом.

Тоже пусто. Код этот вызывается из триггера и проверяю я ручным апдейтом записи через стандарт лайаут. 

Т.е. код лежит класса without sharing и вызывается из триггера - нет значения.
Воожу запрос через Developer Console - работает - вижу значение. 

ЧТО МЛЯ ЗА БРЕД ТАКОЙ?

Все! У меня просто мозг отказывается понимать что либо!

- создал еще одно поле Picklist -
- расшарил все возможные пермишены.
- выкинул поле на Layout
- редактирую, сохраняю, перегружаю страницу - значение поля на месте.
- добавил поле в Formula Field - вижу поле и значения в нем
- Запрос - и НИХЕРА! ПУСТО. Формула поле - там где должны быть значения полей - пусто.

Все! У меня просто мозг отказывается понимать что либо!

- создал еще одно поле Picklist - 
- расшарил все возможные пермишены.
- выкинул поле на Layout
- редактирую, сохраняю, перегружаю страницу - значение поля на месте.
- добавил поле в Formula Field - вижу поле и значения в нем
- Запрос - и НИХЕРА! ПУСТО. Формула поле - там где должны быть значения полей - пусто.

Может Set Permission какой ?

Может Set Permission какой ?

Пока не понимаю как PermossionSet может повлиять, но посмотрю.

Еще интереснее наблюдение:

Через Developer Console запускаю - метод из класса который делает запрос - нет значение
Делаю тот же самый запрос просто - есть значения.

Продолжаю ломать голову.

Пока не понимаю как PermossionSet может повлиять, но посмотрю.

Еще интереснее наблюдение:

Через Developer Console запускаю - метод из класса который делает запрос - нет значение
Делаю тот же самый запрос просто - есть значения.

Продолжаю ломать голову.

Dmitry Shnyrev
Пока не понимаю как PermossionSet может повлиять, но посмотрю.

Еще интереснее наблюдение:

Через Developer Console запускаю - метод из класса который делает запрос - нет значение
Делаю тот же самый запрос просто - есть значения.

Продолжаю ломать голову.


у меня было что то похожие когда пытался получить getContext cтраницы в Dev Console.

[quote="Dmitry Shnyrev"]Пока не понимаю как PermossionSet может повлиять, но посмотрю.

Еще интереснее наблюдение:

Через Developer Console запускаю - метод из класса который делает запрос - нет значение
Делаю тот же самый запрос просто - есть значения.

Продолжаю ломать голову.[/quote]
у меня было что то похожие когда пытался получить getContext cтраницы в Dev Console.

Интересно в женской бане, а если не сложно - можно пример кода?

Интересно в женской бане, а если не сложно - можно пример кода?

Товарищи! Я разобрался.

Это очень редкое стечение обстоятельств:
гениальность предыдущего разраба и моя невнимательность.

В двух словах - задача была простая -
достать Контакты и связи между ними, заданные в кастомном junction object.
Связь односторонняя так что по смыслу понятно что должен быть один объект связи.
А не тут-то было - где-то в дебрях кода предыдущий разраб сотворил мега триггер который делает дублирующий junction object но меняет местами id контактов. Ну и конечно чтобы не смущать клиента вторая связь была скрыта со всех лайоутов, таким образом подумать о ее существовании было нельзя.

Теперь раковое стечение обстоятельств и моя невнимательность. Я перепутал поле по которому надо искать подчиненных контактов и получал как раз связи те что скрыты (не те что видны пользователю). Ну в тестах сравнил количество - совпало и ок. Содержимое полей не смотрел.
В итоге видим на странице 4 записи связей с заполненными доп полями - и в отправляемом запросе видим 4 записи с незаполненными полями (! причем некоторыми - остальные предательски заполнялись по умолчанию и были как раз похожи на то что имел клиент в оригинальных объектах).

Да, все бы было проще если бы я допустил мысль что junction objects может быть больше чем я вижу и хотя бы я сравнил ID в запросе с тем что я вижу на странице - вся проблема в количестве которое предательски било везде - и по тестам и визуально.

Товарищи! Я разобрался.

Это очень редкое стечение обстоятельств:
гениальность предыдущего разраба и моя невнимательность.

В двух словах - задача была простая - 
достать Контакты и связи между ними, заданные в кастомном junction object.
Связь односторонняя так что по смыслу понятно что должен быть один объект связи. 
А не тут-то было - где-то в дебрях кода предыдущий разраб сотворил мега триггер который делает дублирующий junction object но меняет местами id контактов. Ну и конечно чтобы не смущать клиента вторая связь была скрыта со всех лайоутов, таким образом подумать о ее существовании было нельзя. 

Теперь раковое стечение обстоятельств и моя невнимательность. Я перепутал поле по которому надо искать подчиненных контактов и получал как раз связи те что скрыты (не те что видны пользователю). Ну в тестах сравнил количество - совпало и ок. Содержимое полей не смотрел. 
В итоге видим на странице 4 записи связей с заполненными доп полями - и в отправляемом запросе видим 4 записи с незаполненными полями (! причем некоторыми - остальные предательски заполнялись по умолчанию и были как раз похожи на то что имел клиент в оригинальных объектах).

Да, все бы было проще если бы я допустил мысль что junction objects может быть больше чем я вижу и хотя бы я сравнил ID в запросе с тем что я вижу на странице - вся проблема в количестве которое предательски било везде - и по тестам и визуально. 

ок, ты хотел обратиться к одному junction object (или через него), но обращался на самом деле к другому (или через другой). А что АПИ имена одинаковы?

ок, ты хотел обратиться к одному junction object (или через него), но обращался на самом деле к другому (или через другой). А что АПИ имена одинаковы?

Немного не так.

Есть такая связь:
Child Contact < Junction_Object__c(Child__c(Contact MD), Parent__c(Contact MD)) > ParentContact

По логике чтобы связать 2 контакта достаточно создать 1 JO и заполнить 2 MD.

В моем случае создавалось 2 JO которые различались тем что оба MD были поменяны местами:

1. jo1(Child__c=Contact1, Parent__c=Contact2)
2. jo2(Child__c=Contact2, Parent__c=Contact1)

Конечно API Names у jo1 и jo2 одинаковые потому что это 2 записи одного Junction_Object__c


Как-то так :)

Немного не так.

Есть такая связь:
Child Contact < Junction_Object__c(Child__c(Contact MD), Parent__c(Contact MD)) > ParentContact

По логике чтобы связать 2 контакта достаточно создать  1 JO и заполнить 2 MD.

В моем случае создавалось 2 JO которые различались тем что оба MD были поменяны местами:

1. jo1(Child__c=Contact1, Parent__c=Contact2)
2. jo2(Child__c=Contact2, Parent__c=Contact1)

Конечно API Names у jo1 и jo2 одинаковые потому что это 2 записи одного Junction_Object__c


Как-то так :)

Кстати давно заметил неразбериху с названием Объектов и Записей в SF.
Особенно это касается общения с людьми из других областей особенно близких к ОРМ.

Знакомые обычно про Объект думают про запись. Т.е. например "селектнул лист объектов". А Объект по ихнему это Модель.

Да чего далеко ходить, даже SFники тоже как попало используют понятия Объекты(Standard, Custom) и Записи(Records).

Кстати давно заметил неразбериху с названием Объектов и Записей в SF.
Особенно это касается общения с людьми из других областей особенно близких к ОРМ.

Знакомые обычно про Объект думают про запись. Т.е. например "селектнул лист объектов". А Объект по ихнему это Модель.

Да чего далеко ходить, даже SFники тоже как попало используют понятия Объекты(Standard, Custom) и Записи(Records).

ну это особый случай.

во первых, у тебя не два jo, а две "конфликтующие" записи в пределах одного jo.

но такая проблема возможна только если это jo на тот же самый объект!!!!! (т.е. какой-то объект имеет jo на самого себя)

я такого еще не встречал...

ну это особый случай.

во первых, у тебя не два jo, а две "конфликтующие" записи в пределах одного jo.

но такая проблема возможна только если это jo на тот же самый объект!!!!! (т.е. какой-то объект имеет jo на самого себя)

я такого еще не встречал... 

Den Brown
но такая проблема возможна только если

Проблемы возможны всякие Все зависит от криворукости программиста

[quote="Den Brown"]но такая проблема возможна только если[/quote]
Проблемы возможны всякие :) Все зависит от криворукости программиста :D 

Den Brown
я такого еще не встречал...

Потому что это не проблема кода или проблема CRM - это проблема бизнес логики. Возможно просто изначально делалось одно, а потом 30 раз переделывалось (и я собственно продолжаю переделывать) поэтому и остались всякие вот такие артефакты. В мою компетенцию по задаче не входит анализ и улучшение существующего функционала - мне платят за доп функционал. Я отписал заказчику - но не уверен что тот понял - внешне та все работает - а пока работает не трогая (золотые слова)!!!

[quote="Den Brown"]я такого еще не встречал...[/quote]
Потому что это не проблема кода или проблема CRM - это проблема бизнес логики. Возможно просто изначально делалось одно, а потом 30 раз переделывалось (и я собственно продолжаю переделывать) поэтому и остались всякие вот такие артефакты. В мою компетенцию по задаче не входит анализ и улучшение существующего функционала - мне платят за доп функционал. Я отписал заказчику - но не уверен что тот понял :) - внешне та все работает :) - а пока работает не трогая (золотые слова)!!!

Dmitry Shnyrev
Потому что это не проблема кода или проблема CRM - это проблема бизнес логики

я не говорю, что там проблемы с ДБ архитектурой, вероятно все в порядке.

просто сама ситуация, когда требуется "self-reference" связь типа Many-to-Many, что приводит к созданию jo завязанного на один и тот же объект, интересно...

[quote="Dmitry Shnyrev"]Потому что это не проблема кода или проблема CRM - это проблема бизнес логики[/quote]

я не говорю, что там проблемы с ДБ архитектурой, вероятно все в порядке.

просто сама ситуация, когда требуется "self-reference" связь типа Many-to-Many, что приводит к созданию jo завязанного на один и тот же объект, интересно...