Добрый день!
В sq-запросе включены фильтры (и корневой тоже). При открытии системы обновляется датасет грида и по профайлеру видно, что фильтры не включены.
Это "фича" или ошибка и как это можно испарвить?
В приложении сервис.
Нравится
Если это деталь, то может ошибка не в запросе, а в скрипте окна раздела:
Возможно вы не указали, чтобы фильтры остались включенными при обновлении датасета.
Обновление должно выглядеть как-то так:
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), но срабатывают на событие открытия датасета ?
Елена, потому-что далее эти фильтры очищаются. Причем отловить где - мне не удалось (возможно и в логике ядра). Поэтому я решил найти событие, после которого работа с датасетом уже не ведется, и там включить эти фильтры.
"Олейник Дмитрий" написал:Поэтому я решил найти событие, после которого работа с датасетом уже не ведется, и там включить эти фильтры.
Теперь ясно. Спасибо!