Как организовать фильтрацию по наличию подчиненного элемента в TreeArea?
Добрый день!
1.Подскажите пожалуйста, как организовать фильтрацию узлов дерева по наличию подчиненного элемента нижнего уровня определенного типа в TreeArea?
2.Так же хотелось бы организовать несколько DataGridView (из одного датасета) в TreeArea с возможностью переключаться по Caption-ам (как в GridArea), не нашел такой возможности...
Версия CRM 3.2.0.11
Нравится
1. Нужен exist-фильтр, примерно так:
Если нужно, добавляете ещё условие по типу потомка.
Дело усложняет то, что родительских (групповых) узлов несколько (от 2 до 4). Как быть с этим?
Здравствуйте Иван,
По поводу 1го вопроса, я так понял что корневых записей у вас может быть несколько, но каждая запись может быть подчиненной только одному родителю, если это так то подобный вопрос я подымал тут но там тема так и закончилась. Опишу как я сделал подобное:
1.Забудьте про FilterBuider, он вам не поможет, я бы советовал его скрыть.
2.Вынесите необходимые вам фильтры в Workspace и организуйте вызов подобно следующему:
3. В моем понимании задачи, вы вводите название подчиненного элемента, и хотите видеть все корневые записи в котором они есть, т.е вы увидете кроме самой подчиненный записи которую Вы ищете, все записи которые есть в узле. Для того что бы грид нарисовал корневую запись, нужно что бы запрос выдал ее ID, подобное можно организовать следующим фильтром
.... WHERE([tbl_MyHappyTree].[ID] IN (SELECT [tbl_MyHappyTree1].[ID] AS [ID] FROM [dbo].[tbl_MyHappyTree] AS [tbl_MyHappyTree1] LEFT OUTER JOIN [dbo].[tbl_Invoice] AS [tbl_InvoiceForMng] ON [tbl_InvoiceForMng].[ID] = [tbl_MyHappyTree1].[InvoiceID] WHERE([tbl_InvoiceForMng].[ContactID] = :ManagerID OR [tbl_MyHappyTree1].[ID] IN (SELECT [tbl_MyHappyTree2].[ParentID] AS [ParentID] FROM [dbo].[tbl_MyHappyTree] AS [tbl_MyHappyTree2] LEFT OUTER JOIN [dbo].[tbl_Invoice] AS [tbl_InvoiceForMngPar] ON [tbl_InvoiceForMngPar].[ID] = [tbl_MyHappyTree2].[InvoiceID] WHERE([tbl_InvoiceForMngPar].[ContactID] = :ManagerID)))))
В данном примере я ищю ManagerID, обратите внимание на логику OR в блоке WHERE. Такие штуки реализовываются с помощью IN запросов
Да Альфа-Крыса, вы правильно поняли суть задачи, скажите а как этот фильтр сделать в дизайнере?
Здравствуйте, Иван!
Вам нужно будет добавить контролы в окно раздела (например, wnd_MyHappyTreeWorkspace) и обрабатывать нажатие на контролы в программном коде раздела.
Я думал есть способ обойти этот вариант, но раз так.. спасибо Анна за ответ!
При переходе на неактивные вначале DataGridView в ячейках пишет поле данных не активно, подскажите есть ли способ это исправить не ставя опцию выбирать в запросе постоянно?
"Ефанов Иван Александрович" написал:Я думал есть способ обойти этот вариант, но раз так.. спасибо Анна за ответ!
Нужно писать обработчики, включать фильтры.
Пример лукапного контрола
function edtTerrasoftMakeMeHappyOnChange(LookupControl) { if (IsEmptyValue(LookupControl.Text)) { LookupControl.Value = null; } if (IsEmptyValue(LookupControl.Value) && chbForedtTerrasoftMakeMeHappy.IsChecked) { return; } SetParameterValue(dlHappyDatasetLink.Dataset.SelectQuery.Parameters,'Название параметра который используется в IN запросе',LookupControl.Value); EnableSelectQueryFilters(dlHappyDatasetLink.Dataset.SelectQuery, true, ['Название In фильтра]); RefreshDataset(dlHappyDatasetLink.Dataset); }
chbForedtTerrasoftMakeMeHappy - CheckBox для включения контрола edtTerrasoftMakeMeHappy
Иван, организовать это через фильтры рабочей области действительно логичнее. В блоке фильтрации их реализовать тоже можно, но это будет ниже по удобству для пользователя и выше по трудоемкости для программиста.
С фильтрами согласен, вопрос в том, как такой фильтр сделать в TSAdmin(в select query)?