Фильтры
Разработка

Не включаются фильтры при открытии датасета

Добрый день!

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

Это "фича" или ошибка и как это можно испарвить?

В приложении сервис.sq_brief.7z

Нравится

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

Если это деталь, то может ошибка не в запросе, а в скрипте окна раздела:
Возможно вы не указали, чтобы фильтры остались включенными при обновлении датасета.
Обновление должно выглядеть как-то так:
RefreshCommonDetail(BaseWorkspace, wndProjectDetail, 'ClientID', 'ClientID', null, null, null, null, null, null, true); Вот последний аргумент отвечает за то, чтобы остались включенные фильтры.

Ну а если грид, можно посмтореть на предпросмотре такие же данные выводит или нет. Если такие же то ошибка в запросе, если нет, то где-то в скрипте(передаются ли все нужные параметры, те ли они передаются и т.д.)

это грид.

Что вы имеете ввиду под предпросмотром? Если в администраторе - то все фильтры отображаются.

Код стандартный
[javascript]
function wnd_BaseWorkspaceOnShow(Window) {
if (!BaseWorkspace.WasShowed){
if (BaseWorkspace.OpenGroupDatasetInBaseScript){
OpenGroupsDataset();
}
BaseWorkspace.WasShowed = true;
}
CreateQueriesDetails();
}
[/javascript]

[javascript]
function OpenGroupsDataset() {
var Dataset = dlGroups.Dataset;
OpenDatasetWithDisabledEvents(Dataset);
BaseWorkspace.GroupsWereInitialized = true;
// debugger;
LocateToRootGroup(Dataset, BaseWorkspace.GroupParentIDFieldName,
BaseWorkspace.SavedGroupID);
ExpandCurrentNode(BaseWorkspace.GroupsTreeGrid);
}
[/javascript]

[javascript]
function LocateToRootGroup(GroupsDataset, ParentIDFieldName, ID) {
if (!Assigned(GroupsDataset) || (GroupsDataset.State == dstInactive)) {
return;
}
if (ID) {
GroupsDataset.Locate('ID', ID);
} else {
GroupsDataset.Locate(ParentIDFieldName, null);
}
}
[/javascript]

[javascript]
function dlGroupsOnDatasetAfterPositionChange(Dataset) {
scr_BaseWorkspace.dlGroupsOnDatasetAfterPositionChange(Dataset);
if (BaseWorkspace.GroupsWereInitialized){
RefreshBrief();
}
}
[/javascript]
по профайлеру во время RefreshBrief() (открывается датасет) идёт запрос без фильтров

в базовом окне раздела есть функция ApplyWorkspaceFilter() , или RefreshWorkspace() -- точно сейчас не скажу, нужно смотреть. Смысл ее в том, что она "снимает" все галочки в фильтрах, т.е. убирает фильтрацию перед тем, как наложить фильтр из ФилтерБилдера (т.е. фильтр для динамических групп).
Если Вам не нужны динамические группы -- то эту строчку нужно закомментировать. Если нужны -- то как-то прописать, чтобы она включала нужные Вам фильтры..
Это пока "общие" мысли, нет возможности сейчас посмотреть подробней... Но вдруг Вам поможет или натолкнет на мысль, куда "копать"..:smile:

Елена, как верно подметили Выше - скорее всего у Вас где-то встречается функция:

EnableDatasetFilters(Dataset, false);

которая снимает все фильтры.

Попробуйте пройтись отладчиком по всем колл-стеку, и проверяя периодически Dataset.SelectQuery.SQLText, выявить в какой момент у Вас сбрасываются фильтры.

В этой функции
[javascript]
scr_BaseWorkspace.wnd_BaseWorkspaceOnShow(Window);
[/javascript]
происходит открытие датасета грида.
Вставила в обработчик фильтрацию датасета:

[javascript]
function wnd_BriefWorkspaceOnShow(Window) {
debugger;
scr_BaseWorkspace.wnd_BaseWorkspaceOnShow(Window);//TODO
var Dataset = Window.ComponentsByName('wndGridData').Window.ComponentsByName('dlData').Dataset;
Dataset.Close();
var FilterArray = new Array('RightFilters');
EnableSelectQueryFilters(Dataset.SelectQuery, true, FilterArray)
Dataset.Open();
}
[/javascript]

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

Елена, в Вашем коде на строке Dataset.Open() скопируйте и предоставьте содержимое свойства:

[javascript]
Dataset.SelectQuery.SQLText
[/javascript]

Dataset.SelectQuery.SQLText = undefined в этой функции

Елена, не встречал такого поведения.
Резервную копию БД можете предоставить?

К сожалению, не могу предоставить базу - только сервисы.

Кстати, у нас Terrasoft Sales, версия 3.3.2.47

MSSQL 2008

И в свойствах объекта Dataset.SelectQuery в принципе нет SQLText, не только этого датасета.

Елена, а создание дин. группы с данным фильтром Вам не подойдет?

Пробовал на wnd_BaseWorkspaceOnShow добавить функцию RefreshWorkSpace, и в ней перед GridDataset.Open() включить свой фильтр:

[javascript]
GridDataset.SelectQuery.Items(0).Filters.Items(0).ItemsByCode('FilterField').IsEnabled = true;
[/javascript]

При этом, SQLText меняется на:

[sql]
SELECT TOP 40
[tbl_Test].[ID] AS [ID],
[tbl_Test].[Name] AS [Name],
[tbl_Test].[FilterField] AS [FilterField],
[tbl_Test].[TypeID] AS [TypeID],
[Type].[Name] AS [TypeName]
FROM
[dbo].[tbl_Test] AS [tbl_Test]
LEFT OUTER JOIN
[dbo].[tbl_TestType] AS [Type] ON [Type].[ID] = [tbl_Test].[TypeID]
WHERE((:FilterField = [tbl_Test].[FilterField]))
[/sql]

Однако, сразу же после Dataset.Open() профайлер ловит запрос без фильтра, при этом само свойство SQLText сбрасывается на:

[sql]
SELECT TOP 40
[tbl_Test].[ID] AS [ID],
[tbl_Test].[Name] AS [Name],
[tbl_Test].[FilterField] AS [FilterField],
[tbl_Test].[TypeID] AS [TypeID],
[Type].[Name] AS [TypeName]
FROM
[dbo].[tbl_Test] AS [tbl_Test]
LEFT OUTER JOIN
[dbo].[tbl_TestType] AS [Type] ON [Type].[ID] = [tbl_Test].[TypeID]
[/sql]

Видимо, проблема в том, что для группы "Все записи" отбрасываются все фильтры.

звучит правдоподобно=) спасибо за разъяснения.

Подскажите, пожалуйста, как тогда можно сделать с помощью динамических или просто групп (или как-то ещё) фильтрацию датасета с фильтрами, указанными в сервисе запроса?

(указать все необходимые условия фильтрации для группы через тс-клиент не выйдет - очень много условий, завязанных на то, входит или нет текущий пользователь в определённые группы администрирования)

Нашел простое решение: на событии SelfOnDatasetAfterOpen(Dataset) пропишите:

[javascript]
function ds_TestOnDatasetAfterOpen(Dataset) {
Dataset.Close();
Dataset.SelectQuery.Items(0).Filters.Items(0).ItemsByCode('FilterField').IsEnabled = true;
Dataset.DisableEvents();
Dataset.Open();
Dataset.EnableEvents();
}
[/javascript]

и реестр при переходе в него будет отфильтрован.

Спасибо за совет!

правда, в таком виде фильтры всё равно не работают. Но если явно включить, например конкретный фильтр, а не группу фильтров, то он включается.

[javascript]
Dataset.SelectQuery.Items(0).Filters.Items(0).ItemsByCode('FilterField').Items(0).IsEnabled = true
[/javascript]

А вот так включаются все фильтры в группе:
[javascript]
var FilterArray = new Array('RightFilters');
EnableSelectQueryFilters(Dataset.SelectQuery, true, FilterArray)
[/javascript]

Почему же подобные манипуляции не срабатывали в функции wnd_BriefWorkspaceOnShow(Window), но срабатывают на событие открытия датасета ?

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

"Олейник Дмитрий" написал:Поэтому я решил найти событие, после которого работа с датасетом уже не ведется, и там включить эти фильтры.

Теперь ясно. Спасибо!

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