Фильтрация по данным детали

Необходимо фильтровать информацию в разделе Проекты по людям, записанным в детали Команда. Немного запуталась с этим, так что буду благодарна за помощь)

Нравится

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

правильно ли я поняла что мне надо создать пользовательский фильтр Exists?

Да, надо создать фильтр Exist.Пример - фильтр созданный в Контрагентах для фильтрации по Типу цены - CompanyCurrentPriceType.

насколько я понимаю, мне надо фильтром сравнения сравнивать таблицу проектов tbl_Projects и таблицу детали Команда tbl_ProjectTeam. создала фильтр Exist. Создала поле tbl_ProjectTeam.ID. Дальше делаю фильтр сравнения, где хочу прописать что
tbl_ProjectTeam.ID = tbl_Projects.ID
Но в списке таблицы tbl_ProjectTeam нет!, есть только таблица из справочника tbl_ProjectTeamRole
как быть?

проблема решилась перезапуском системы=)

создала фильтр сравнения tbl_ProjectTeam.ID = tbl_Projects.ID, создала фильтр справочника
111

в клиенте появился мой фильтр. есть возможность выбрать из списка контактов, но дальше данные не фильтруются

Елена, проверил аналогичный пользовательский запрос для инцидентов (в инцидентах, детали Комманда соответствует tbl_ContactInIncident).
Все отрабатывает корректно. Возможно проблема связанна с тем что в разделе [Проекты] используется древовидный DataTreeGrid.
На данный момент сооветую использовать SQL Server Profiler для выяснения проблеммы

возможно я что-то не так сделала или не доделала при построении фильтра?
1111

я создала только это. может надо что-либо еще дописать?

Елена, Вам необходимо фильтровать не по tbl_ProjectTeam.ID, а по tbl_ProjectTeam.ContactID

поменяла, все равно не работает. Вот что у меня есть:

11

222

333

Учитывая, что Проекты такой специфический раздел, возможно надо повторить этот же фильтр после Union ALL в группе Where.

продублировала тоже самое в Union ALL. Тот же результат, не работает(

я могу ошибаться, но может фильтр сравнения создан неверно?
tbl_ProjectTeam.ID = tbl_Projects.ID

Такое впечатление, что оно фильтрует, но не находит ни одной подходящей записи

Все заработало! поменяло фильтр сравнения на tbl_ProjectTeam.ProjectID = tbl_Projects.ID.

Остался только один баг, в списке фильтров, в группе Команда, фильтр Контакт прописан 3 раза. Не понимаю почему он продублировался

Елена, можете выгрузить сервис sq (или загрузить мой вариант sq, предварительно сохранив Ваш сервис), так как у меня проблему воспроизвести, не получилось, делал следующим образом.

В ItemSelect добавил exist фильтр
scr1

scr2

scr3

В клиенте фильтр выглядит следующим образом:
scr4

Мой сервис sq_Project в прикрепленных файлах

Моя ошибка, которую я получил в http://www.community.terrasoft.ru/forum/topic/7032#comment-30155
была в том что я добавил exist фильтр не в тот select (я случайно добавил в ParentChildSelect)

решение нашла здесь

http://www.community.terrasoft.ru/forum/topic/5266

Спасибо за помощь!

Подскажите, пожалуйста, как добавить такую возможность, чтобы фильтрация велась и по пустому значению фильтра. Тоесть если использовать фильтр Пусто, то выводились б проекты где не прописана команда.
фильтрация Не пусто, <>, = работают, а вот пусто нет

Елена, для реализации фильтрации по значению «пусто» необходимо создать дополнительный фильтр, например, NOT EXIST, посредством вызова которого выполнять фильтрацию проектов, для которых не указана команда.

ну это будет совсем новый фильтр. а использовать существующее условие Пусто в созданном фильтре как?

Елена, данный фильтр отрабатывает верно, но не так, как Вы ожидаете. Это происходит по следующей причине: в качестве главной таблицы для фильтрации используется таблица детали. При применении фильтра "пусто" условие фильтрации будет иметь вид: tbl_ProjectTeam.ContactID IS NULL, и таблица tbl_ProjectTeam при этом будет связана с таблицей tbl_Project по условию tbl_ProjectTeam.ProjectID = tbl_Projects.ID (что Вы можете отследить посредством Profiler). То есть, получаем следующую ситуацию: система ищет такие id участников команды по проекту, у которых contactID пустой. Видим, что сама формулировка вопроса таким образом является некорректной.
Для достижения описанных выше целей, единственно верным решением является использование дополнительного фильтра.

в таком случае, не понимаю каким должен быть новый фильтр или как поменять старый=((

Опишу более подробно слова Наталии в http://www.community.terrasoft.ru/forum/topic/7032#comment-30199
Ну уровне базы данных идут такие запросы :
Не пусто

WHERE((EXISTS 
	(SELECT
		[tbl_ProjectTeam].[ID] AS [ID]
	FROM
		[dbo].[tbl_ProjectTeam] AS [tbl_ProjectTeam]
	WHERE([tbl_Project].[ID] = [tbl_ProjectTeam].[ProjectID] AND
		(NOT [tbl_ProjectTeam].[ContactID] IS NULL)))))

В данном запросе мы имеем связь с деталью [tbl_Project].[ID] = [tbl_ProjectTeam].[ProjectID] что возвращает true логическое И условие NOT [tbl_ProjectTeam].[ContactID] IS NULL что также возвращает true, общее условие будет истинным

В случае с Пусто имеем запрос

WHERE((EXISTS 
	(SELECT
		[tbl_ProjectTeam].[ID] AS [ID]
	FROM
		[dbo].[tbl_ProjectTeam] AS [tbl_ProjectTeam]
	WHERE([tbl_Project].[ID] = [tbl_ProjectTeam].[ProjectID] AND
		([tbl_ProjectTeam].[ContactID] IS NULL)))))

в данном же случае [tbl_Project].[ID] = [tbl_ProjectTeam].[ProjectID] дает нам false, так как у нас в принципе нет такой связи (нет записей в детали Команда) следовательно все выражение ([tbl_Project].[ID] = [tbl_ProjectTeam].[ProjectID] AND ([tbl_ProjectTeam].[ContactID] IS NULL) ) будет false

Предлагаю вам реализовать более функциональный фильтр для того что бы обойти данное ограничение. Обратите внимание на фильтр Число задач в Контрагентах (фильтр TaskCount в sq_Account)

создала фильтр по числам как в контрагендам, все работает, но фильтр продублирован, я так понимаю это из-за особенностей раздела проекты. Как бороться с дублированием Exist фильтра я разобралась, а вот как быть с таким вот фильтром?

никак не могу избавиться от дублирования фильтра

111

Вот что у меня получается

222

Елена в скрипте scr_ProjectUtils допишите проверку

                   if (FiltersNode.FilterType == ftUser) {     
                            FiltersNode.ParentFilters.Remove(FiltersNode);
                   }                 

в функцию ClearUserFilters

Получим результат

function ClearUserFilters(FiltersNode) {
         if (FiltersNode.FilterType == ftFilters) {   
                   for (var i = 0; i < FiltersNode.Count; i++) {
                            ClearUserFilters(FiltersNode.Items(i));
                   }
         } else
         if ((Assigned(FiltersNode.TestExpression)) && 
                            (FiltersNode.TestExpression.ExpressionType == fetSelect)) {
                   var SelectQuery = FiltersNode.TestExpression.ExpressionSelectQuery;
                   for (var i = 0; i < SelectQuery.Count; i++) {
                            ClearUserFilters(SelectQuery.Items(i).Filters);
                   }
		//изменение 
                   if (FiltersNode.FilterType == ftUser) {     
                            FiltersNode.ParentFilters.Remove(FiltersNode);
                   }                 
		//изменение 
 
         } else
         if (FiltersNode.FilterType == ftUser) {     
                   FiltersNode.ParentFilters.Remove(FiltersNode);
         }
}

Изменение не помогло. Теперь ни один фильтр не работает, данные отображаются полностью постоянно. Но, да, дублирование исчезло=)

Елена, проводились ли какие либо доработки с разделом [Проекты]? Привожу пример моего варианта sq с реализацией фильтра Количество человек в комманде, после редактирования кода scr_ProjectUtils
http://www.community.terrasoft.ru/forum/topic/7032#comment-30232 ошибки с дублированием не наблюдалось, предлагаю вам подгрузить мой сервис sq_Project и посмотреть воспроизводится ли ошибка

Мой вариант sq:

1

2

3

4

5

6

7

8

9

10

В клиенте фильтр выглядит следующим образом
11

Все скриншоты в лучшем расширении в sqprj.rar

Вопрос решила. С фильтром было все нормально (у меня немного по-другому устроен, но работает корректно). Проблема оказалась в коде функции ClearUserFilters. Заменила строку
if (FiltersNode.FilterType == ftUser) {

на

if (FiltersNode.FilterType == 7) {

и все заработало. Код функции:

function ClearUserFilters(FiltersNode) {
if (FiltersNode.FilterType == ftFilters) {
for (var i = 0; i < FiltersNode.Count; i++) {
ClearUserFilters(FiltersNode.Items(i));
}
} else
if ((Assigned(FiltersNode.TestExpression)) &&
(FiltersNode.TestExpression.ExpressionType == fetSelect)) {
var SelectQuery = FiltersNode.TestExpression.ExpressionSelectQuery;
for (var i = 0; i < SelectQuery.Count; i++) {
ClearUserFilters(SelectQuery.Items(i).Filters);
}

if (FiltersNode.FilterType == 7) {
FiltersNode.ParentFilters.Remove(FiltersNode);
}
} else
if (FiltersNode.FilterType == 7) { //ftUser
FiltersNode.ParentFilters.Remove(FiltersNode);
}
}

Мне немного непонятна причина этой проблемы. почему замена ftUser на 7 помогла?

Елена, рад что проблема решена.

ftUser это константа с скрипта scr_SysEnums, котороя в версии 3.3.2.172 равна

ftUser = 0x00000007;

какую версию конфигурации вы используете, возможно у вас данная константа в scr_SysEnums не была равна 7 ?

да, наверно дело в версии. У меня 3.3.1.111
Большое спасибо за помощь!

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