0
Голосовать

Не работает фильтр в окне выбора данных

Создано:
Метки записи:

Добрый день. У меня возникла следующая проблема: для запуска БП использую окно wnd_SelectData. Перед его открытием применяется функция ApplyDatasetIsNullFilter для фильтрации. Далее, если в окне я использую поиск по заголовку, то он не работает. Причём, если воспользоваться сначала быстрым фильтром, а после поиском, то он начинает работать. Я думаю, что проблема в применеии перед открытием ApplyDatasetIsNullFilter, потому что без этого всё работает. Может кто-нить подскажет решение?

Комментарии

Глова Сергей

Посмотрите как выполняется фильтрация при выборе города, когда выбрано значение страны в карточке контакта.

Проблем с фильтрацией датасета перед открытием SelectData у меня никогда не возникало.

Выложите код - попробуем помочь.

Vichka

У меня тоже не возникало никаких проблем, до того, как мне не понадобилось включить пользовательский фильтр.
Вызов окна :

function SelectServiceByCodeForTaskInProcess(ServiceCode, ShowCodeField, NotifyObject, Tag) {
        var Dataset = Services.GetNewItemByUSI(ServiceDatasetUSI);
        var AdminUnitID = Connector.CurrentUser.ID;
        ApplyDatasetFilter(Dataset, 'ServiceTypeCode', ServiceCode, true);
        ApplyDatasetFilter(Dataset, 'AdminUnitID', AdminUnitID, true);
        ApplyDatasetIsNullFilter(Dataset, 'IsStart', true);
       
        if (ShowCodeField) {
                var SearchFieldNames = 'Code;Caption';
                var DisplayFieldNames = 'Code;Caption';
        } else {
                var SearchFieldNames = 'Caption';
                var DisplayFieldNames = 'Caption';
        }
        SelectWindow = ShowSelectDataWindowForTaskInProcess(Dataset, SearchFieldNames,
                DisplayFieldNames, 'ID', GUID_NULL, 'Caption', '', NotifyObject ,Tag, false, false);
        if (!IsEmptyValue(Tag)) {
                SelectWindow.Tag = Tag;
        }
}
function ShowSelectDataWindowForTaskInProcess(Dataset, SearchFieldNames, DisplayFieldNames,
                KeyFieldName, KeyValue, SearchFieldName, SearchValue, NotifyObject,
                Tag, IsReadOnly, ShowModal) {
        var SelectDataWindow = Services.GetNewItemByUSI('wnd_SelectData');
        SetAttribute(SelectDataWindow, 'Dataset', Dataset);
        SetAttribute(SelectDataWindow, 'DisplayFieldNames', DisplayFieldNames);
        SetAttribute(SelectDataWindow, 'SearchFieldNames', SearchFieldNames);
        SetAttribute(SelectDataWindow, 'KeyFieldName', KeyFieldName);
        SetAttribute(SelectDataWindow, 'KeyValue', KeyValue);
        SetAttribute(SelectDataWindow, 'SearchFieldName', SearchFieldName);
        SetAttribute(SelectDataWindow, 'SearchValue', SearchValue);
        SetAttribute(SelectDataWindow, 'NotifyObject', NotifyObject);
        SetAttribute(SelectDataWindow, 'Tag', Tag);
        SetAttribute(SelectDataWindow, 'IsReadOnly', IsReadOnly);
        SetAttribute(SelectDataWindow, 'DeleteButtons', true);
        SelectDataWindow.Tag = Tag;
        SelectDataWindow.Prepare();
        if (ShowModal) {
                SelectDataWindow.ShowModal();
        } else {
                SelectDataWindow.Show();
        }      
        return SelectDataWindow;
}

В SelectData код стандартный, ничего не меняла

Лабьяк Олег Игоревич

Можно подробнее узнать, какой датасет Вы используете и какие фильтры в его запросе? Насколько я знаю, в базовых сервисах задач и процессов таких фильтров нет.

Попробовал вызвать окно из скрипта следующим образом, предварительно добавив в запрос sq_Service фильтр Unlocked (при применении возвращает список незаблокированных сервисов):

function SelectServiceByCodeForTaskInProcess(ServiceCode, ShowCodeField, NotifyObject, Tag) {
        var Dataset = Services.GetNewItemByUSI('ds_Service');
        var AdminUnitID = Connector.CurrentUser.ID;
        ApplyDatasetFilter(Dataset, 'ServiceTypeCode', ServiceCode, true);
        //ApplyDatasetFilter(Dataset, 'AdminUnitID', AdminUnitID, true);
        ApplyDatasetIsNullFilter(Dataset, 'Unlocked', true);
       
        if (ShowCodeField) {
                var SearchFieldNames = 'Code;Caption';
                var DisplayFieldNames = 'Code;Caption';
        } else {
                var SearchFieldNames = 'Caption';
                var DisplayFieldNames = 'Caption';
        }
        SelectWindow = ShowSelectDataWindowForTaskInProcess(Dataset, SearchFieldNames,
                DisplayFieldNames, 'ID', GUID_NULL, 'Caption', '', NotifyObject ,Tag, false, false);
        if (!IsEmptyValue(Tag)) {
                SelectWindow.Tag = Tag;
        }
}

function Main() {
        SelectServiceByCodeForTaskInProcess('Table', true);
}

Корректно работала как фильтрация по заголовку, так и по быстрому поиску.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

С уважением,

Олег Лабьяк,
инженер-программист,
группа компаний Terrasoft.

Vichka

Пишу поподробнее. Вызов окна следующий:

function SelectServiceByCodeForTaskInProcess(ServiceCode, ShowCodeField, NotifyObject, Tag) {
        var Dataset = Services.GetNewItemByUSI('ds_WFInGroup');
        var AdminUnitID = Connector.CurrentUser.ID;
        ApplyDatasetFilter(Dataset, 'AdminUnitID', AdminUnitID, true);
        ApplyDatasetIsNullFilter(Dataset, 'IsStart', true);
        if (ShowCodeField) {
                var SearchFieldNames = 'Code;Description';
                var DisplayFieldNames = 'Code;Description';
        } else {
                var SearchFieldNames = 'Number;Description';
                var DisplayFieldNames = 'Number;Description';
        }
        SelectWindow = ShowSelectDataWindowForTaskInProcess(Dataset, SearchFieldNames,
                DisplayFieldNames, 'WFServiceID', GUID_NULL, 'Description', '', NotifyObject ,Tag, false, false);
        if (!IsEmptyValue(Tag)) {
                SelectWindow.Tag = Tag;
        }
}

Фильтр IsStart - это пользовательский sql-фильтр, код следующий:
EXISTS
        (SELECT
                [tbl_WFGroupRights].[ID] AS [ID]
        FROM
                [dbo].[tbl_WFGroupRights] AS [tbl_WFGroupRights]
        LEFT OUTER JOIN
                [dbo].[tbl_AdminUnit] AS [tbl_AdminUnit] ON [tbl_AdminUnit].[ID] = [tbl_WFGroupRights].[AdminUnitID]
        WHERE([tbl_WFGroupRights].[WFGroupID] = [tbl_WFInGroup].[WFGroupID] AND
                [tbl_AdminUnit].[ID] = :AdminUnitID)) OR
   EXISTS (SELECT
                [tbl_WFGroupRights].[ID] AS [ID]
        FROM
                [dbo].[tbl_WFGroupRights] AS [tbl_WFGroupRights]
        LEFT OUTER JOIN
                [dbo].[tbl_AdminUnit] AS [tbl_AdminUnit] ON [tbl_AdminUnit].[ID] = [tbl_WFGroupRights].[AdminUnitID]
        LEFT OUTER JOIN
                [dbo].[tbl_UserInGroup] AS [tbl_UserInGroup] ON [tbl_UserInGroup].[GroupID] = [tbl_AdminUnit].[ID]
        WHERE([tbl_WFGroupRights].[WFGroupID] = [tbl_WFInGroup].[WFGroupID] AND
                [tbl_UserInGroup].[UserID] = :AdminUnitID)) OR
        EXISTS (SELECT [tbl_WFRights].[ID] AS [ID]
        FROM
                [dbo].[tbl_WFRights] AS [tbl_WFRights]
        WHERE([tbl_WFRights].[WFServiceID] = [tbl_WFInGroup].[WFServiceID] AND
                [tbl_WFRights].[AdminUnitID] = :AdminUnitID AND [tbl_WFInGroup].[WFGroupID] = :AllWorkflow)) OR
        EXISTS (SELECT
                [tbl_WFRights].[ID] AS [ID]
        FROM
                [dbo].[tbl_WFRights] AS [tbl_WFRights]
        LEFT OUTER JOIN
                [dbo].[tbl_AdminUnit] AS [tbl_AdminUnit] ON [tbl_AdminUnit].[ID] = [tbl_WFRights].[AdminUnitID]
        LEFT OUTER JOIN
                [dbo].[tbl_UserInGroup] AS [tbl_UserInGroup] ON [tbl_UserInGroup].[GroupID] = [tbl_AdminUnit].[ID]
        WHERE([tbl_WFRights].[WFServiceID] = [tbl_WFInGroup].[WFServiceID] AND
                [tbl_UserInGroup].[UserID] = :AdminUnitID AND [tbl_WFInGroup].[WFGroupID] = :AllWorkflow))
       

Лабьяк Олег Игоревич

Честно говоря, не совсем понял, где здесь IsNull-фильтр. Это фильтр типа Exists.

Попробуйте поступить следующим образом: включите в фильтре IsStart все условия, кроме корневого (с кодом IsStart). Далее вместо вызова

ApplyDatasetIsNullFilter(Dataset, 'IsStart', true);

поступите следующим образом:

var Parameters = Dataset.SelectQuery.Parameters;
SetParameterValue(Parameters, 'AdminUnitID', AdminUnitID);
EnableDatasetFilters(Dataset, true, 'IsStart');

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

С уважением,

Олег Лабьяк,
инженер-программист,
группа компаний Terrasoft.

Vichka

Я так тоже пробовала - всё равно не получается. Даже и не знаю, в чём тут дело.

Лабьяк Олег Игоревич

У меня подобная фильтрация работала. Думаю, проблема где-то в другом месте.

Для более тщательного анализа предоставьте, пожалуйста, удалённый доступ к Вашей конфигурации (если это возможно). Параметры удалённого доступа просьба выслать на support@tscrm.com

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

С уважением,

Олег Лабьяк,
инженер-программист,
группа компаний Terrasoft.

Лабьяк Олег Игоревич

Ещё раз посмотрел текст Вашего запроса. Первый раз не заметил, что у Вас кроме параметра :AdminUnitID есть ещё :AllWorkflow. Необходимо установить значение и для него. Например:

var Parameters = Dataset.SelectQuery.Parameters;
var AllWorkflowID = <ID группы "Все процессы">;
SetParameterValue(Parameters, 'AdminUnitID', AdminUnitID);
SetParameterValue(Parameters, 'AllWorkflow', AllWorkflowID);
EnableDatasetFilters(Dataset, true, 'IsStart');

Либо же установить значение этого параметра непосредственно в запросе.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

С уважением,

Олег Лабьяк,
инженер-программист,
группа компаний Terrasoft.