Метки записи: |
Добрый день. У меня возникла следующая проблема: для запуска БП использую окно wnd_SelectData. Перед его открытием применяется функция ApplyDatasetIsNullFilter для фильтрации. Далее, если в окне я использую поиск по заголовку, то он не работает. Причём, если воспользоваться сначала быстрым фильтром, а после поиском, то он начинает работать. Я думаю, что проблема в применеии перед открытием ApplyDatasetIsNullFilter, потому что без этого всё работает. Может кто-нить подскажет решение?
Комментарии
Посмотрите как выполняется фильтрация при выборе города, когда выбрано значение страны в карточке контакта.
Проблем с фильтрацией датасета перед открытием SelectData у меня никогда не возникало.
Выложите код - попробуем помочь.
У меня тоже не возникало никаких проблем, до того, как мне не понадобилось включить пользовательский фильтр.
Вызов окна :
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 (при применении возвращает список незаблокированных сервисов):
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.
Пишу поподробнее. Вызов окна следующий:
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-фильтр, код следующий:
(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). Далее вместо вызова
поступите следующим образом:
SetParameterValue(Parameters, 'AdminUnitID', AdminUnitID);
EnableDatasetFilters(Dataset, true, 'IsStart');
Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.
С уважением,
Олег Лабьяк,
инженер-программист,
группа компаний Terrasoft.
Я так тоже пробовала - всё равно не получается. Даже и не знаю, в чём тут дело.
У меня подобная фильтрация работала. Думаю, проблема где-то в другом месте.
Для более тщательного анализа предоставьте, пожалуйста, удалённый доступ к Вашей конфигурации (если это возможно). Параметры удалённого доступа просьба выслать на support@tscrm.com
Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.
С уважением,
Олег Лабьяк,
инженер-программист,
группа компаний Terrasoft.
Ещё раз посмотрел текст Вашего запроса. Первый раз не заметил, что у Вас кроме параметра :AdminUnitID есть ещё :AllWorkflow. Необходимо установить значение и для него. Например:
var AllWorkflowID = <ID группы "Все процессы">;
SetParameterValue(Parameters, 'AdminUnitID', AdminUnitID);
SetParameterValue(Parameters, 'AllWorkflow', AllWorkflowID);
EnableDatasetFilters(Dataset, true, 'IsStart');
Либо же установить значение этого параметра непосредственно в запросе.
Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.
С уважением,
Олег Лабьяк,
инженер-программист,
группа компаний Terrasoft.