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