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

Добрый день!

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

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

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

Нравится

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

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

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

это грид.

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

Код стандартный

function wnd_BaseWorkspaceOnShow(Window) {
	if (!BaseWorkspace.WasShowed){
	    if (BaseWorkspace.OpenGroupDatasetInBaseScript){
	        OpenGroupsDataset();
		}
	    BaseWorkspace.WasShowed = true;
	}
	CreateQueriesDetails();
}
function OpenGroupsDataset() {
	var Dataset = dlGroups.Dataset;
	OpenDatasetWithDisabledEvents(Dataset);
	BaseWorkspace.GroupsWereInitialized = true;
//	debugger;
	LocateToRootGroup(Dataset, BaseWorkspace.GroupParentIDFieldName,
		BaseWorkspace.SavedGroupID);
	ExpandCurrentNode(BaseWorkspace.GroupsTreeGrid);
}
function LocateToRootGroup(GroupsDataset, ParentIDFieldName, ID) {	
	if (!Assigned(GroupsDataset) || (GroupsDataset.State == dstInactive)) {
		return;
	}
	if (ID) {
		GroupsDataset.Locate('ID', ID);
	} else {
		GroupsDataset.Locate(ParentIDFieldName, null);
	}
}
function dlGroupsOnDatasetAfterPositionChange(Dataset) {
	scr_BaseWorkspace.dlGroupsOnDatasetAfterPositionChange(Dataset);
	if (BaseWorkspace.GroupsWereInitialized){
		RefreshBrief();
	}
}

по профайлеру во время RefreshBrief() (открывается датасет) идёт запрос без фильтров

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

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

EnableDatasetFilters(Dataset, false);

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

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

В этой функции

scr_BaseWorkspace.wnd_BaseWorkspaceOnShow(Window);

происходит открытие датасета грида.
Вставила в обработчик фильтрацию датасета:

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();
}

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

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

Dataset.SelectQuery.SQLText

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

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

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

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

MSSQL 2008

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

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

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

GridDataset.SelectQuery.Items(0).Filters.Items(0).ItemsByCode('FilterField').IsEnabled = true;

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

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]))

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

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]

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

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

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

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

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

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

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

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

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

Dataset.SelectQuery.Items(0).Filters.Items(0).ItemsByCode('FilterField').Items(0).IsEnabled = true

А вот так включаются все фильтры в группе:

var FilterArray = new Array('RightFilters');
EnableSelectQueryFilters(Dataset.SelectQuery, true, FilterArray)

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

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

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

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

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