Как организовать фильтрацию по наличию подчиненного элемента в TreeArea?

Добрый день!
1.Подскажите пожалуйста, как организовать фильтрацию узлов дерева по наличию подчиненного элемента нижнего уровня определенного типа в TreeArea?
2.Так же хотелось бы организовать несколько DataGridView (из одного датасета) в TreeArea с возможностью переключаться по Caption-ам (как в GridArea), не нашел такой возможности...
Версия CRM 3.2.0.11

Нравится

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

1. Нужен exist-фильтр, примерно так:
фильтр
Если нужно, добавляете ещё условие по типу потомка.

Дело усложняет то, что родительских (групповых) узлов несколько (от 2 до 4). Как быть с этим?

Здравствуйте Иван,
По поводу 1го вопроса, я так понял что корневых записей у вас может быть несколько, но каждая запись может быть подчиненной только одному родителю, если это так то подобный вопрос я подымал тут но там тема так и закончилась. Опишу как я сделал подобное:
1.Забудьте про FilterBuider, он вам не поможет, я бы советовал его скрыть.
2.Вынесите необходимые вам фильтры в Workspace и организуйте вызов подобно следующему:
1
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)?

Всем спасибо, разобрался. :)

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