Добрый день!

Можно ли настроить сгруппированное табличное представление (Список) в Итогах (Аналитике)? К примеру количество контактов сгруппированных по дате создания или количество задач сгруппированных по категориям и состояниям?

Нравится

4 комментария
Лучший ответ

Можете конечно создать представление (вьюху )  куда выберете сгрупировав ваши данные, но чтобы разворачивать/сворачивать вам нужно самому создать и подключить в итоги свой вэб виджет ну или хотябы скомуниздить готовый умеющий групировать записи в интернете :)

Пример разработки (подключения) своего виджета описан тут

 

Хочется пользоваться возможностью видеть сгруппированную (в частности по дате) информацию, с возможностью "раскрывать" группу.

Если данный функционал реализовать в отчетах, то такой возможности не будет

Для итогов типа «Список» нельзя группировать. Можно только сортировать и фильтровать.

Данные с группировкой можно увидеть на графике.

specs_dashboards_diagram_mode_menu.png 

Там же можно углубиться и посмотреть записи, из которых состоит интересующий столбец или сектор, или же все данные без группировки.

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

Зверев Александр,

большое спасибо за развернутый ответ.

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

Можете конечно создать представление (вьюху )  куда выберете сгрупировав ваши данные, но чтобы разворачивать/сворачивать вам нужно самому создать и подключить в итоги свой вэб виджет ну или хотябы скомуниздить готовый умеющий групировать записи в интернете :)

Пример разработки (подключения) своего виджета описан тут

 

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

У меня есть деталь DocumentsDetail с реестром, отображающая Grid документов. Я реализовал в ней группировку документов по типу и в качестве содержимого каждой группы отображаю Grid с набором документов соответствующего типа. Но возникает вопроса:

Как унаследовать конфигурацию Grid и столбцов из DocumentDetail, чтобы Grid каждой группы выглядел идентично гриду детали? Т.е, 1)Имел идентичный набор столбцов. 2) Имел идентичные настройки внешнего вида, стилизацию.

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

 

//diff:

            {               

                "operation": "merge",

                "name": "Detail",

                "values": {

                    }

                }

            },                        

            {

                "operation": "insert",

                "parentName": "Detail",

                "name": "DocumentsTestList",

                "propertyName": "items",

                "values": {

                    "generator": "ConfigurationItemGenerator.generateContainerList",

                    "idProperty": "Id",

                    "itemPrefix": "BorrowerDocGroup",

                    "collection": "BorrowerDocGroupsCollection",

                    "onGetItemConfig": "getDocsControlGroupConfig"

                }

            }

//methods:

getDocsControlGroupConfig: function (itemConfig, item) {             

               

                var itemId = item.get("Id");

                var testItemGroupConfig = {

                    "className": "Terrasoft.ControlGroup",                    

                    "caption": {

                        "bindTo": "Caption"

                    },

                    "collapsed": true,

                    "id": "DocsGroup" + itemId,

                    "items": [{                        

                        "className": "Terrasoft.Grid",

                        "type": "listed",                        

                        "id": itemId,

                        "idProperty": "Id",

                        "itemPrefix": "Id",

                        "collection": {

                            "bindTo": "Collection"

                        },

//как настроить отображение грида, который реализует функциональность первоначального грида детали и имеет идентичную конфигурацию столбцов? 

//здесь мне хотелось бы написать "columnsConfig": { "bindTo: "...?????"}

                        "columnsConfig": [                            

                            {

                                cols: 1,

                                key: [

                                    {

                                        "name": {

                                            "bindTo": "MDocument"

                                        }

                                    } 

                                ]

                            }

                        ],

                        "captionsConfig": [

                            {

                                cols: 1,

                                name: "document caption"

                            }                            

                        ],

                        //"onGetItemConfig": {

                        //    "bindTo": "getDocItemViewConfig"

                        //},                                               

                        "dataItemIdPrefix": "document-item"                        

                    }]

                };               

                itemConfig.config = testItemGroupConfig;                

            },

   

Нравится

2 комментария

Ты создаешь внутри одной детали несколько гридов?

Думаю, можно создать один общий класс для гридов и переопределить методы, которые принимают конфигурации строк и столбцов.



 

Ext.define("Terrasoft.controls.Название_твоего_грида", {

    alternateClassName: "Terrasoft.Название_твоего_грида",

    extend: "Terrasoft.ConfigurationGrid", // или Terrasoft.Grid

и переопределить методы 

/**
	 * Инициализирует начальное значение конфигурации колонок.
	 * @param {Object} gridConfig
	 * @return {Array}
	 */
	initColumnsConfig: function(gridConfig) {
		var type = gridConfig.type;
		var config = this[type + "Config"];
		var columnsConfig = (config ? config.columnsConfig : gridConfig.columnsConfig) || [];
		if (!gridConfig.columnsConfig) {
			gridConfig.columnsConfig = columnsConfig;
		}
		return columnsConfig;
	},

	/**
	 * Инициализирует начальное значение конфигурации заголовков.
	 * @param {Object} gridConfig
	 * @return {Array}
	 */
	initCaptionsConfig: function(gridConfig) {
		var type = gridConfig.type;
		var config = this[type + "Config"];
		var captionsConfig = (config ? config.captionsConfig : gridConfig.captionsConfig) || [];
		if (!gridConfig.captionsConfig) {
			gridConfig.captionsConfig = captionsConfig;
		}
		return captionsConfig;
	}

Если хочешь ещё и из детали получить конфигурацию, то встроенной реализации механизма сообщений нет. Придется в зависимостях прописать sandbox и инициализировать его в методе конструктора

constructor: function (config) {
    this.sandbox = new sandbox();
    this.sandbox.moduleName = "имя_модуля";

    this.sandbox.registerMessages({
        "имя_сообщения": {
            "direction": Terrasoft.MessageDirectionType.PUBLISH,
            "mode": Terrasoft.MessageMode.PTP
        }

    });

    this.callParent(arguments);
},

Как вариант, можно попробовать перехватить Profile в котором находятся конфиги на отображение в списочном и плиточном отображении (listedConfig и tiledConfig).

К примеру в методе initProfile после вызова this.callParent(arguments) взять this.get("Profile") и динамически изменить listedConfig и tiledConfig для изменения конфигуарации колонок грида.

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

Для примера вот как можно добавить колонку ответсственного в запрос детали с документами (DocumentDetailV2):

addProfileColumns: function(esq) {
  //берем колонки
  var profileColumns = this.getProfileColumns();
  //добавляем новую
  profileColumns.Owner = {
    aggregationType: undefined,
    caption: "Ответстсвенный",
    dataValueType: undefined,
    path: "Owner",
    subFilters: undefined,
    type: "text"
  };
  //а это взято из метода addProfileColumns из GridUtilitiesV2
  Terrasoft.each(profileColumns, function(column, columnName) {
    if (!esq.columns.contains(columnName)) {
      if (column.aggregationType) {
        this.addProfileAggregationColumn(esq, column, columnName);
      } else {
        esq.addColumn(columnName);
      }
    }
  }, this);
}

Таким образом в запросе уйдет и колонка отвественного.

Изменяя значения в Profile можно динамически поменять отображение колонок и их значений.

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

Добрый день!
Нигде не смог найти информацию по использованию в entitySchemaQuery колонок с группировкой (Group By). Очень часто необходимо получать для отчетов в excel итоговые данные c использованием группировки по клиентам, операторам и т.д.
Буду признателен за информацию по данному вопросу.

Нравится

2 комментария

Здравствуйте. Иван!

Непосредственно класс entitySchemaQuery не поддерживает группировку данных.

Альтернативный вариант рассмотрен по ссылке ниже:
http://www.community.terrasoft.ua/forum/topic/7324#comment-31694

Спасибо, очень жаль...

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

Добрый день!

Надо создать сложный фильтр такого типа:
Field1 == 'XX' AND ((Field2 == 'YY' AND Field3 == 'ZZ') OR (Field4 == 'QQ' AND Field5 == 'RR'))

Попытка построить вот такой фильтр, как на скриншоте, ничего не даёт.
Подскажите, пожалуйста, в чем здесь "фишка"?

Нравится

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

Есть возможность запрофайлить запрос в момент нажатия на кнопку "Применить"? Какой запрос идет в базу? Попробовал на версии 3.5.2.19 - всё ок:

WHERE((([tbl_Account].[PrimaryContactID] IN (@P1) AND
	(([tbl_Account].[AccountTypeID] IN (@P2) AND
	((LEN(LTRIM([tbl_Account].[Communication1])) <> 0) AND
	NOT [tbl_Account].[Communication1] IS NULL)) OR
	([tbl_Account].[AccountTypeID] IN (@P3) AND
	((LEN(LTRIM([tbl_Account].[Communication1])) <> 0) AND
	NOT [tbl_Account].[Communication1] IS NULL))))))

У нас версия 3.3.2.309.
Запрофайлил: запрос в БД идёт с неправильной группировкой.

WHERE((([tbl_Cashflow].[ManagerID] IN (@P1) AND
(([tbl_Cashflow].[StatusID] IN (@P2) AND
(((([tbl_Cashflow].[ClauseID] IN (@P3)))) OR
[tbl_Cashflow].[StatusID] IN (@P4)) AND
([tbl_Cashflow].[ClauseID] IN (@P5)))))))

Видимо, проблема исходников. Кто-нибудь может проверить на такой же версии, как у нас?

Завтра на уровне технической поддержки проверим и сообщим Вам результат.

Здравствуйте!

Проверили на версии 3.3.2.

Результат аналогичен Вашему.

В более поздних версиях этой проблемы уже нет.

Завтра на протяжении дня сообщу Вам возможные решения данного вопроса.

"Безродный Андрей" написал:

Здравствуйте!

Проверили на версии 3.3.2.

Результат аналогичен Вашему.

В более поздних версиях этой проблемы уже нет.

Завтра на протяжении дня сообщу Вам возможные решения данного вопроса.

Спасибо, ждём.

Добрый день!

Уточнили информацию.

Действительно, данная ошибка имела место быть на всех версиях 3.3.2 и была исправлена в версии 3.4.

Изменения исключительно "ядровые", практически полностью переписана логика фильтрации на уровне ядра приложения.

Соответственно единственный вариант решения проблемы - это обновление на новую версию.

Для версии 3.3.2 возможно выполнить лайт-переход на версию 3.4.1, но при этом Вам необходимы лицензии на продукт версии 3.4.1, согласовать добавление которых Вы можете с Вашим ответственным менеджером.

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

Здравствуйте!
Как создать отчет с группировкой по созданным пользователями группам? (пардон за тавтологию:mrgreen:)

Нравится

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

Здравствуйте, Алексей.

Теоретически, вы можете это сделать десериализовав фильтры групп из таблицы, затем, распарсив результат использовать полученные значения для сборки фильтров на событии OnBeforeOpen набор данных.
Фильтры хранятся в колонке FilterData, посмотреть формат хранения данных можно выбрав значения:

select cast(cast(FilterData as varbinary(max)) as varchar(max)) from tbl_ContactGroup

Парсить можно используя регулярные выражения, они в Террасофте поддерживаются. Или методы работы со строками, фильтры в xml, проблем возникнуть не должно.

Но в целом, задача достаточно трудоемкая и, как по мне, не стоит того.

Здравствуйте, Максим!

Ок, тогда какие на ваш взгляд возможны варианты реализации формирования печатных форм прайс-листов с группировкой и выборкой по определённым типам продукта?
Совсем не хочется велосипед городить.

Алексей, FastReport позволяет фильтровать выводимые в отчет данные.
А группировать что нужно?
Возможна сложная сортировка, в несколько позиций в сервисе запроса отчета.

Максим, нужна возможность выбора определённого типа товаров, причем, с группировкой по типу.
Например, пусть, у нас магазин спортоваров, сейчас скоро открытие велосезона, нужен прайс по велосипедным запчастям со следующей группировкой: трансмиссия, тормоза, колёса, фрэймсеты и т.д., при этом нужна поддержка иерархии типов (хотя бы 3 уровня), то есть, например, тормоза бывают разных типов: гидравлические механические. И вот нам нужно отобразить все товары типа велозапчасти с группровкой по типам на всех этих уровнях иерархии.

Ранее мы добавили новое поле "Тип продукта", но по нему можно лишь отфильтровать или отгруппировать только по одному уровню иерархии, а надо чтобы можно было выбрать подтипы для группировки.

Можно конечно добавить поле подгруппа, но такой способ масштабирования иерархии мне кажется не очень удачным.

Нашел, что можно в свойствах отчета выбрать тип фильтрации "Для выделенных записей".
Тогда, если заранее была выбрана интересующая группа товаров, то фильтрация будет просто осуществлена заранее, но вопрос с группировкой остаётся открытым.

Для группировки используйте бенд GroupHeader, пример приведен в теме http://www.community.terrasoft.ru/forum/topic/8512

Наталия, в вашем примере используются футеры, это не то, что мне нужно, мне нужна просто двухуровневая иерархия заголовков группировки вместо стандартной одноуровневой
То есть нужны не только группы объединять под общими заголовками, как в стандартном отчете, но и подгруппы. Попробовал просто добавить ещё один GroupHeader и прописать у него в Condition [PriceByAccount."SubType"] (где SubType - Подгруппа, новое добавленное поле). В документации по FastReport не нашёл информации про иерархическую множественную группировку

Алексей, что не получилось, на первый взгляд все верно?
Что касается группировки - число уровней вложенности не ограничено.

Изменение структуры Fast Report никак не отобразилось на реальном представлении отчета, вложенной группировки нет.
Обнаружил, что при просмотре справочника подтипов продуктов (справочника того самого нового добавленного поля о котором шла речь выше) почему-то не отображаются записи, хотя они точно есть. Нет, когда только добавишь новую запись, то в открытом справочнике она появится, но отображается только она, а как только закроешь форму справочника и откроешь заново уже не видно ни одной записи. Хотя я думаю, что это никак не связано с вложенной группировкой, потому как в разделе продукты у продуктов можно выбирать в поле подтип добавленные позиции (то есть справочник подтип всё-таки наполняется хоть и на форме почему-то записи не отображаются)

Алексей, залейте сервисы отчета, пожалуйста.

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

Сервисы интересующего отчёта: папка Offering Price1
Сервисы справочников Подтип и Тип: папки Offering Type и OfferingSubType
Сервисы General->Main Grid: папка Main Grid

Архив лежит в облаке Google Drive:
https://drive.google.com/file/d/0B3vdHXcADJ3kd2hDRXNHei1saGc/edit?usp=s…

Алексей, установите еще корректно сортировку, чтобы в отчете происходила необходимая группировка.
Я установил три уровня сортировки, 0 по типу, 1 по подтипу и 2 по заголовку. В итоге FastReport отлично сгруппировал продукты.

Maxim, сортировка по умолчанию уже и так назначена (по возрастанию) на выбранные в SELECT поля Name, Type и SubType в сервисе sq_ReportOfferingsPriceByAccount1. Может я не там смотрю?

Алексей, в сервисах sq в свойствах колонки есть еще позиция сортировки:

Установите значения, которые я предложил в предыдущем посте и система сгруппирует записи.

Maxim, я установил значения позиций сортировки в соответствии с вашими рекомендациями, но по подтипам продукта не группируется. Надо-ли ещё что-то где-то изменять? (справочник подтипов, естественно заполнен, нескольким продуктам присвоены значения в поле "Подтип продукта").

Алексей, думаю оптимальным вариантом будет провести удаленный доступ и совместно посмотреть вопрос.
Напишите, пожалуйста, в личном сообщении либо на support@terrasoft.ru (со ссылкой на данную тему) удобный период проведения удаленного доступа.

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

Здравствуйте!

Создал отчет в FastReport

Интересует вопрос. Можно ли группировать записи как на рисунке ниже (по дому)?

Нравится

1 комментарий

Здравствуйте, Дмитрий!
Да, конечно, в фастрепорте такое возможно. Нужно использовать Group Header + Group Footer (Insert Band --> Group Header на панели инструментов фастрепорта). Причем тут можно сделать не один "уровень", а несколько, например, Улица -- Дом -- итоги, только нужно следить за порядком футеров.
Пример (взяла со своего проекта, на украинском языке -- но, надеюсь, суть Вы уловите):
Администратор:
отчет в Администраторе
Клиент:
отчет в Клиенте

groupsinreport.jpg
groupsinreportuser.jpg

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

Есть деталь, в которой есть такие основные поля: дата, числовой показатель. Хотелось бы сделать представление в детали, в котором отображались эти данные, но сгруппированные по месяцам. То есть с такими полями: период (месяц, год), числовой показатель (сумма всех числовых показателей за указанный месяц).

Нравится

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

Придумал сделать такую выборку:

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.
Вот таким образом всё работает.

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

Здравствуйте,
подскажите как решить задачу: по разделу Проекты надо сделать отчет (лучше Excel, поскольку его удобно фильтровать). В Карточке Проекта есть дополнительное пользовательское поле "Номер Машины". Проекты содержат определенный набор типовых работ, при этом даты начала и даты завершения 4х работ совпадают для всех проектов, у которых номер машины одинаковый. Надо вывести в отчет сгруппированные данные: "Номер машины", "Проект" + некоторые данные из карточки Проекта, а также названия этих 4х работ с датами начала и завершения. Сейчас я смогла сделать так: у меня выводятся в одну строку "номер машины" + информация о проекте, а в детали запроса название необходимых 4х работ и даты. Но получается, что эта деталь дублируется столько раз, сколько есть проектов. Это не удобно пользователю. Может, есть способ как решить мою задачу по-другому?

Нравится

2 комментария

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

Если бы речь шла об отчёте FastReport или формированием отчёта путём создания "вручную" в скрипте, то можно использовать два независимых источника данных, первый из которых содержал бы информацию о проектах, а второй - информацию о работах одного из проектов из первого источника. В FastReport можно было бы добавить два объекта MasterData, которые бы ссылались на эти источники. Но в базовом функционале пользовательских запросов нет возможности построить отчёт, который использует два практически независимых запроса. Необходимо решать эту задачу другими методами (FastReport или скриптами).

Да, спасибо. Я так и думал, будем создавать Fastreport.

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

Здравствуйте!

TerrasoftCRM X25 3.2.1.14
MS SQL 2008 Express

В построителе запросов отсутствует группировка для числового значения по сумме, только количество.

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

Спасибо.

Нравится

2 комментария

Здравствуйте, Виталий!

Для решения данной проблемы Вам необходимо загрузить в конфигурацию сервис, который прикреплен к сообщению.

Terrasoft Support Team

Спасибо!

Помогло!

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

Добрый день!

В настоящее время используем 2.8 и оцениваем целесообразность перехода на 3ю версию.
В связи с этим вопросы:

1. Не обнаружил в x25 панель группировки. В 2.8 она реализована над таблицей реестра и позволяет осуществлять группировку данных по полям записей реестра простым перетаскиванием заголовка на панель. Существует ли подобный функционал в третьей версии?

2. Версия 2.8 используется с базой MySQL. Возможен (если да, насколько сложен) перенос данных на 3.0.

Спасибо.

Нравится

3 комментария

Здравствуйте!
1. Нет данный функционал не реализован с целью оптимизации и быстродействия работы с базой данных. Для того чтобы была возможность группировки необходимо загрузить на клиента все(!) записи, что на многомиллионных базах требует ОЧЕНЬ "толстого" клиента.
2. Возможно Вы имели ввиду MSSQL? Или у Вас интеграция с MySQL?

1. спасибо, понятно.
2. да, конечно, прошу прощения, MSSQL 2000.

Да, для перехода есть утилита, которая переносит данные. Для корректного перехода необходимо ознакомится с документацией.

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