Есть деталь, в которой есть такие основные поля: дата, числовой показатель. Хотелось бы сделать представление в детали, в котором отображались эти данные, но сгруппированные по месяцам. То есть с такими полями: период (месяц, год), числовой показатель (сумма всех числовых показателей за указанный месяц).
Нравится
Придумал сделать такую выборку:
SELECT left(convert(varchar,[Date],112),6), sum([Out]) FROM [TerraSoft].[dbo].[tbl_Stats] GROUP BY left(convert(varchar,[Date],112),6)
Как действовать дальше?
Ведь поле left(convert(varchar,[Date],112),6) и GROUP BY
left(convert(varchar,[Date],112),6) должны срабатывать только для представления, а в обычном случае:
SELECT [Date], [Out] FROM [TerraSoft].[dbo].[tbl_Stats]
К тому же как поле left(convert(varchar,[Date],112),6) привести к нормальному виду для пользователя что-то вроде "январь 2010"?
Скорее тут удобно будет сделать не представление, а новую страничку внутри существующей закладки. На нее грид, новый датасет и запрос на основании новой View (как подцепить ее в виде сервиса таблицы неоднократно обсуждалось). А вот внутри View на сервере пишете запрос любой абсолютно, в том числе и отображение месяца текстом и прочее
Я так и подозревал, что придется создавать новый грид с отдельным запросом и датасетом. Есть пару вопросов для уточнения:
1. По поводу подцепить view в виде сервиса таблицы не нашел (сильно не старался), но интуитивно понял как сделать. Идею http://community.terrasoft.ru/node/3096 поддерживаю!
2. По поводу отображения периода лучше во view сделать или в датасете?
3. По поводу новой странички внутри закладки, это делается аналогично закладкам в деталях?
1. http://community.terrasoft.ua/forum/topic/5455 кратко описал Олег Лабьяк
2. все расчеты во view. на его основе простейший запрос и датасет
3. Как Задачи/расписание например... в принципе много вариантов
Почти получилось. Добавил к окну детали еще один датасет, сделал закладки со страницами, на каждой разместил дата грид, датагридвью с колонками. Обработчики событий для второго датасета установил такие же, как и были уже у автоматически созданного (окно изначально создавалось, как потомок wnd_BaseGridArea). Но почему-то второй датасет не хочет работать. В чем может быть проблема?
Или проще создать окно с нуля?
"Штинов Антон Викторович" написал:Но почему-то второй датасет не хочет работать
на OnPrepare детали повесьте открытие второго датасета
Подробнее можно?
Ведь на OnPrepare детали уже висит обработчик унаследованный от wnd_BaseGridArea
Повесил на onPrepare
function wnd_OrderInProjectsOnPrepare(Window) { dlDataByMonth.Dataset.Open(); ShowInformationDialog('test'); }
Событие срабатывает, но в dataGridView с этим Dataset ничего не отображается.
Пробовал разные варианты. Вывод такой - второй Dataset не имеет данных (((
Добавил
function dlDataByMonthOnDatasetAfterOpen(Dataset) { if (Dataset.IsEOF) { ShowInformationDialog('empty'); } }
выводит "empty", то есть в данном случае dataset оказывается пустым.
Пробовал еще так:
function wnd_OrderInProjectsOnPrepare(Window) { var NDataset = Services.GetNewItemByUSI('ds_OrderByMonth'); NDataset.Open(); if (NDataset.IsEOF) { ShowInformationDialog('empty'); } else { ShowInformationDialog('ok'); } }
В в результате датасет пустой.
Когда ds_OrderByMonth указываю в свойствах dlData, который создан автоматически, то информацию отображает.
Антон, Вы смотрели с помощью профайлера, какой запрос отправляется на сервер во время выполнения NDataset.Open()? Возможно, на выборку накладывается дополнительный фильтр.
exec sp_executesql N'SELECT TOP 40 [vw_OrderByMonth].[Period] AS [Period], ... [vw_OrderByMonth].[ProjectID] AS [ProjectID] FROM [dbo].[vw_OrderByMonth] AS [vw_OrderByMonth] WHERE(@P1 = [ProjectID])',N'@P1 varchar(8000)',NULL
Судя по профайлеру не передается параметр. То есть данная деталь должна отображаться для определенного проекта. В выборке параметр ProjectID создан, сравнение с именем ProjectID создано. Для DataGridView установлено свойство FilterSetCode в ProjectID.
Как я понимаю проблема в том, что надо передать параметр ProjectID в датасет. Как это сделать? Догадываюсь, что это надо сделать где-то на одно из событий ProjectWorkspace.
получаем на OnPrepare окна детали (деталь в разделе проекты, правильно?)
var ProjectID = GetAttribute(Self, 'ParentItemID');
фильтруем нужный датасет перед тем как его открыть (фильтр ProjectID и параметр ProjectID есть в запросе?)
ApplyDatasetFilter(your_Dataset, 'ProjectID', ProjectID, true);
Это нужно сделать во время обновления менеджера деталей (функция RefreshDetails скрипта scr_ProjectWorkspace). В функциях инициализации и обновления Вашей детали необходимо учесть ситуацию, когда активной будет второе представление.
Также необходимо устанавливать значение параметра ProjectID во время обработки события OnActiveViewChanged объекта grdData детали. Если изменяется текущее представление, нужно проверить, было ли инициализировано второе представление, и обновить его.
А как из scr_ProjectWorkspace обращатся к элементам окна детали?
Есть необходимость обращаться именно к элементам окна детали? В процессе инициализации обычно происходит присвоение нужных значений атрибутам, а потом эти атрибуты передаются в окно детали, и дальнейшая их обработка происходит уже в скрипте детали. Посмотрите в scr_ProjectWorkspace и других скриптах разделов тексты функций, которые начинаются на Initialize...Detail и Refresh...Detail.
Вообще обратиться из скрипта раздела к любому элементу нужной детали можно так:
Self.ComponentsByName('wnd_...Detail').Window.ComponentsByName(...).
Совсем запутался.
Как советовал Александр Кудряшов, на OnPrepare окна детали делать бесполезно, этот эвент срабатывает только один раз при открытие ТС.
Как я уже понял все действия надо выполнять в scr_ProjectWorkspace в функции RefreshDetails().
Как именно это можно сделать?
добавил туда такой код:
var Dataset = wndOrderDetail.Window.ComponentsByName('dlDataByMonth').Dataset; ApplyDatasetFilter(Dataset, 'ProjectID', wndOrderDetail.Window.Attributes('ParentItemID'), true); Dataset.Open();
Работает, но нужно заставить второй датагрид перерисовыватся, после обновления второго датасета. То есть данные показывает только после нажатия кнопки обновить в датагриде. Как это сделать?
А также как отключить датагрид, который создается поумолчанию?
Как отключить датагрид уже разобрался.
А вопрос по обновлению пока открыт.
"Лабьяк Олег Игоревич" написал:Также необходимо устанавливать значение параметра ProjectID во время обработки события OnActiveViewChanged объекта grdData детали.
Попробуйте обновлять текущий датасет детали в этом обработчике. Сначала определите ID родительской записи (в принципе, если всё реализовано правильно, это значение должно быть в атрибуте ParentItemID), далее закройте текущий датасет реестра (если он открыт), отключите все его фильтры, примените фильтр по родительской записи и откройте датасет.
В общем случае все эти действия выполняет функция RefreshDetailData, которая присутствует практически в любой функции обновления. Но в Вашем случае важно передать в неё именно датасет активного окна. Поэтому я писал ранее:
"Лабьяк Олег Игоревич" написал:В функциях инициализации и обновления Вашей детали необходимо учесть ситуацию, когда активной будет второе представление.
А моё замечание по поводу OnActiveViewChanged касалось ситуации, когда Вы выделили в основном реестре запись, открыли Вашу деталь и заметили, что нужное Вам представление скрыто. В этом случае при переходе на это представление необходимо выполнить его рефреш.
Сделал так (скрипт scr_ProjectWorkspace):
function Initialize() { ... // скрыть кнопки и datagrid, которые создаются по умолчанию для окна деталей SetAttribute(wndDetail.Window, 'HideButtonsFrame', true); wndDetail.Window.ComponentsByName('grdData').IsVisible = false; RefreshProject(); } function RefreshDetails() { ... else if (pcDetails.ActivePage.Name == pgDetail.Name) { RefreshCommonDetail(BaseWorkspace, wndDetail, 'ProjectID', 'ProjectID', '', ''); var Dataset = wndDetail.Window.ComponentsByName('dlDataCustom').Dataset; Dataset.Close(); ApplyDatasetFilter(Dataset, 'ProjectID', wndDetail.Window.Attributes('ParentItemID'), true); Dataset.Open(); } }
Где dlDataCustom компонент DatasetLink с дополнительной выборкой
Само окно детали (наследуется от wnd_BaseGridArea):
Добавлено две закладки (pages) на каждой по DataGrid, DataGridView с колонками. Одна DataGrid берет данные из dlData (который создается по умолчанию), вторая DataGrid берет данные из dlDataCustom.
Вот таким образом всё работает.