Добрый день. У меня возникла следующая проблема: для запуска БП использую окно wnd_SelectData. Перед его открытием применяется функция ApplyDatasetIsNullFilter для фильтрации. Далее, если в окне я использую поиск по заголовку, то он не работает. Причём, если воспользоваться сначала быстрым фильтром, а после поиском, то он начинает работать. Я думаю, что проблема в применеии перед открытием ApplyDatasetIsNullFilter, потому что без этого всё работает. Может кто-нить подскажет решение?
Нравится
Посмотрите как выполняется фильтрация при выборе города, когда выбрано значение страны в карточке контакта.
Проблем с фильтрацией датасета перед открытием SelectData у меня никогда не возникало.
Выложите код - попробуем помочь.
У меня тоже не возникало никаких проблем, до того, как мне не понадобилось включить пользовательский фильтр.
Вызов окна :
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.
Пишу поподробнее. Вызов окна следующий:
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.
У меня подобная фильтрация работала. Думаю, проблема где-то в другом месте.
Для более тщательного анализа предоставьте, пожалуйста, удалённый доступ к Вашей конфигурации (если это возможно). Параметры удалённого доступа просьба выслать на support@tscrm.com
Олег Лабьяк,
разработчик,
3-я линия Службы поддержки 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.