Как указать/обратиться к прародительскому (или по шагам наследования) Dataset

var WorkspaceDataset=Self.ParentWindow.ComponentsByName('dlData').Dataset;
var DatasetUSI = GetAttribute(Self, 'DatasetUSI');
//узнали родительский - как узнать прародительский или по уровню вложенности?
//что-то типа такого
var WorkspaceDataset1=Self.ParentWindow.ComponentsByName(DatasetUSI).Dataset;

Нравится

7 комментариев

Здравствуйте!

То, как обращаться к датасету родительского окна, зависит от того, как расположены элементы на форме. Например, если у нас есть карточка, а в ней WindowContainer, метод обращения будет один, а если мы с детали открываем окно редактирвоания - другой.

В данном случае оптимальный вопрос - посмотреть отладчиком.

Пример обращения к датасету реестра из окна редактирования карточкаи к датасету детали:

Self.Attributes('NotifyObject').ParentWindow.Attributes('NotifyObject').ParentContainer.ParentWindow.ComponentsByName('wndProductCategoryInOpp').Window.ComponentsByName('dlData').Dataset

Обратите внимание, вариант не оптимален, в данном случае оптимально передавать в атрибуты NotifyObject тот датасет, к которому нужно будет потом обращаться.

Допустим требуется обратиться из окна карточки редактирования детали к датасету владельца этой детали для получения аттрибутов родителя детали. Т.е. "с детали открываем окно редактирвоания"
Какой в этом случае вариант будет оптимален?

В этом случае оптимально обращаться посредством NotifyObject:

Self.Attributes('NotifyObject').ParentContainer.ParentWindow.ComponentsByName('dlData').Dataset

в данном случае Self - окно карточки редактирования детали.

Спасибо, но непонятнo, что является 'NotifyObject' (? с террасофт без году неделя)
Например: Хочу изменить результат визирования, как узнать, к какому документу относился данный результат визирования.

Здравствуйте!

В Вашем случае NotifyObject - это окно, из которого было открыто данное. Например, если Вами открывается окно редактирования детали, то NotifyObject для него будет окно детали.

Если открывается окно выбора из справочника в окне редактирования, то NotifyObject для него будет окно редактирования.

При выполнении этого выражения и террасофт и дебагер кричат, что им объект требуется. Вешал на события btnOKOnClick, btnOKOnExit. На последнем событии и дебагер повешался.
На вский случай проверил на событии dlDataOnDatasetDataChange(DataField) - тоже объект требует.
Правильно написал?

var WorkspaceDataset1=Self.Attributes('NotifyObject').ParentContainer.ParentWindow.ComponentsByName('dlData').Dataset;
if (Assigned(WorkspaceDataset1)) {
ShowInformationDialog("Родительский датасет ");
return null;	}

NotifyObject - это какая-то макроподстановочная переменная? Где про неё можно подробней прочесть?

Здравствуйте,
NotifyObject - это объект, которому мы передаем сообщения, как правило, мы обращаемся к нему через функцию SendNotify с scr_WindowUtils, и передаем сообщение, например: Окно выбора совершило все свои действия и окно которое вызвало окно выбора, должно что то пересчитать, для реализации логики реакции на сообщения сделано событие окна OnNotify (пример вы можете посмотреть в scr_AccountsWorkspace событие wnd_AccountsWorkspaceOnNotify) котрое обрабатывает сообщения.
В Вашем случае, если вы напишете Self в обработчике клика на кнопку, то объект Self будет кнопка, попробуйте использовать Control.ParentWindow для доступа к окну в котором находится кнопка (пример http://www.community.terrasoft.ru/forum/topic/1220)

Показать все комментарии