Подскажите, каким образом можно скопировать (создать по аналогии) раздел "Итоги"?

Нравится

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

Олег, уточните, какую бизнес задачу Вы хотите решить данным способом?

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

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

"Сафонов Олег" написал:создавать раздел, а потом удалять/скрывать стандартное представление

Этот способ будет намного менее трудоемким и более эффекстивным, чем создание еще одного раздела Итоги.

Этот раздел нестандартен, и не имеет такой гибкости в конфигурировании, как остальные разделы системы. bpm'online c несколькими разделами итогов еще не встречал.

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

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

Нравится

0 комментариев
Показать все комментарии
Если добавить агрегирующие функции в итоги типа "список" (как в графиках), то это упростит отчётности. Например, отобразить суммарные значения (сумма в валюте, сумма в базовой валюте, сумма налога и т.п.) по всем выписанным счетам за период по датам
1 комментарий

Добрый день!

Данная идея уже зафиксирована для реализации в будущих версиях продукта.

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

Встречайте новый красочный видеоурок «Настройка итогов»!
Узнайте, как легко вы можете настроить итоги в bpm’online для получения необходимой аналитики. В ролике рассмотрено, как можно представлять данные разделов системы в виде графиков и диаграмм, отображать суммарные, средние, минимальные и максимальные показатели, формировать списки ключевых записей.

Видео доступно по ссылке: Настройка итогов

Больше обучающих видеороликов смотрите на сайте академии Terrasoft.

Нравится

Поделиться

0 комментариев
Показать все комментарии
Развить функционал dashboard и сделать его стартовой страницей пользователя, которую каждый может настроить под себя.Например, сотрудник поддержки открывает bpm'online, видит 3 показателя. По показателю "новые инциденты" переходит в раздел инцидентов в группу "Новые". По показателю "просроченные" в соответствующую группу. Руководитель отдела продаж так же использует показатели "неоплаченные счета", "выигранные сделки" и т.п. Это позволит на основании показателей раздела "Итоги" сразу переходить к разделу, в котором необходимо выполнить какие-либо действия или изучить информацию для принятия решения
2 комментария

Владимир, добрый вечер.

В новой версии 7.4 существенно расширен функционал работы с графиками и аналитикой в целом. По сути реализованный функционал перекрывает задачи, описанные в Вашем сообщении. Релиз новой версии был сегодня.

"Гущин Николай" написал:По сути реализованный функционал перекрывает задачи, описанные в Вашем сообщении

Значит, мой потенциальный клиент быстро получит ответ на свои пожелания :)

Спасибо!

Показать все комментарии
Добавить возможность настраивать итоги в деталях карточки, как в реестре
2 комментария

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

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

uslugi.pngТребуется помощь в формировании коммерческого предложения в word.
А именно: Имеется таблица услуг (А1). Последнее поле таблицы А1 отображает итоговую сумму услуг с помощью записи #А1.Цена.Сумма>. Это в принципе уже реализовано и работает. Но необходимо это поле суммы вставить в промежуточную таблицу (А2), где будет несколько таких сумм и в конце по ним считается итоговая сумма.
Если вписать в таблицу А2 просто #А1.Цена.Сумма>, то ничего хорошего не получается

Пример, таблиц прикреплен.

Как можно реализовать подобное?

Нравится

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

Прошу по возможности поподробнее описать реализацию.

Интересно, это мне так везет или у Вас что-то с настройками доступа? Я не вижу Ваших скриншотов и при переходе на картинку uslugi.png у меня пишет "У Вас нет доступа к этой странице."...
Могу задать лишь наводящий вопрос (хотя без скриншотов только в общих чертах представила Вашу проблему..:sad:): итоговая сумма у Вас в ворде считается или тоже в запросе, на основе которого Вы строите отчет?

аналогично, не вижу скрин-шотов.

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

Итоговая сумма должна считаться в запросе да. Т.е. сначала считается сумма по А1 услугам.. а в А2 считается сумма уже по всему проекту на основе суммы А1.

Может лучше в Excel попробовать?)

КП состоит не только из таблиц.. и в добавок сколько будет услуг заранее не узнаешь, чтобы функцию подсчета сумм в Excel прописать. Или у вас более универсальный метод?

а отчет ФастРепорт?)

и еще -- в самом запросе у Вас суммы правильные получаются? т.е. у Вас не получается запрос построить или начинаются "чудеса" уже в самом Ворде?

В Word'e писали макрос, который необходимо было запускать для пересчета сумм и других вычисляемых полей

"Ольга Прилипко" написал:

а отчет ФастРепорт?)

и еще -- в самом запросе у Вас суммы правильные получаются? т.е. у Вас не получается запрос построить или начинаются "чудеса" уже в самом Ворде?


Запрос самый обыкновенный. И с помощью него нельзя отдельно сумму вывести по записи <#А1.Цена.Сумма>.
Может есть подробный мануал по созданию запросов в администраторе? Попробую создать свой.

"Султанов Ринат" написал:Запрос самый обыкновенный. И с помощью него нельзя отдельно сумму вывести по записи <#А1.Цена.Сумма>.

да, я с таким не сталкивалась... сумма по сумме...
для меня вообще Ворд -- это для договоров, актов, каких-то документов, т.е. максимум, что туда "из необычного" вставляла (кроме значений полей) -- это сумма прописью... Поэтому даже не знаю, возможно ли такое. Может, кто-то сталкивался и посоветует:smile:
знаю, что в фастрепорте можно что-то похожее сделать, даже на комюнити уже писала (здесь).
"Султанов Ринат" написал:В Word'e писали макрос, который необходимо было запускать для пересчета сумм и других вычисляемых полей

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

Спасибо за ответы.. попробую реализовать задуманное, отпишусь о результатах.

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

Доброго времени суток!
Столкнулся с проблемой - есть запрос с вычисляемыми полями, заказчик захотел подбивать итоги по этим полям. Я определил событие OnDatasetCalcSummary, в котором по этим полям подвожу итоги. Непосредственно сама математика выполняется верно, итог присваивается верно, но в конце концов - итог пустой. На сколько помню, в SDK написано Использование данного события решает проблему подсчета итогов в реестрах по вычисляемым полям но почему же итог пустой??
Попробовал на XRM 3.4.0.92 - все прекрасно работает, у заказчика стоит XRM 3.4.0.144, такая же история и с 3.4.0.136.
Как-то, мягко скажем, корявенько решается проблема подсчета итогов в реестрах по вычисляемым полям. Возможно, есть более новые сборки, в которых эту проблему уже победили?

Нравится

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

Здравствуйте!
Выгрузите сервисы, укажите изменения, мы посмотрим на указанных Вами версиях.

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

Добрый день!

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

"Гакало Игорь Александрович" написал:

Добрый день!

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


Письмо отправил - готов продемонстрировать на вышеуказанных билдах

Константин, предлагаю Вам изучить тему http://www.community.terrasoft.ua/forum/topic/8468 и проделать нечто похожее как я пишу.

"АльфаКрыса" написал:

Константин, предлагаю Вам изучить тему http://www.community.terrasoft.ua/forum/topic/8468 и проделать нечто похожее как я пишу.


АК, спасибо большое за совет! Нечто похожее реализовано и у меня, но проблема кроется не в реализации переопределения подсчета итогов, а именно в отработке этих событий. Можете сами попробовать переопределить подсчет итогов на вышеуказанных билдах - переопределенное событие срабатывает, происходит вычисление, итог помещается в SummaryValues, НО, если подсчет происходил именно по вычисляемым полям - в гриде ничего не отображается. И именно для вычисляемых, для полей подзапросов или обычных - все отлично. Продемонстрировал тех поддержке эту проблему - ответили, что обращение передано в отдел разработки

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

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

Есть отчет, который выводит все города, и для каждого показывает количество контрагентов в этих городах.

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

Есть идея создания поля в tbl_City и для каждого города пересчитывать и записывать значение количества городов и фильтровать уже по этому полю.

Подскажите пожалуйста, может есть более рациональное решение?

Нравится

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

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

Как вариант также можно создать в sq параметр Count, фильтр сравнения tbl_City.AccountID > :Parameter(Count)

Далее, создать собственное окно фильтрации (пример можно посмотреть здесь (во вложении первого ответа от Наталья Бондарь) и передать в sq значение введенного количества контрагентов.

Здравствуйте вы меня не совсем поняли. Каким образом можно отфильтровать по такому полю (на скриншоте).

Здравствуйте, Дмитрий.

Нет, в блоке WHERE нельзя применять фильтр по колонке с агрегатной функцией. Для этого используется HAVING:

	SELECT
	COUNT(CAST([tbl_Account].[ID] AS VARCHAR(38))) AS [AccountCount],
	tbl_City.Name
FROM
	[dbo].[tbl_City] AS [tbl_City]
LEFT OUTER JOIN
	[dbo].[tbl_Account] AS [tbl_Account] ON [tbl_Account].[CityID] = [tbl_City].[ID]
GROUP BY
tbl_City.Name
HAVING COUNT(CAST([tbl_Account].[ID] AS VARCHAR(38))) > 1

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

А можете поподробнее рассказать насчет подзапроса в фильтре, что-то ничего не выходит.

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

Сервис во вложении.

Спасибо!

Фильтр по количеству работает. Но мне нужно вместе с этим фильтром еще фильтры по типу контрагента и по ответственному. Сделал так:

Подскажите пожалуйста, как правильно включать фильтры подзапроса из скрипта

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

Включаются фильтры следующим образом:

var SelectedIDs = GetAttribute(Self , 'SelectedIDs');
ApplyQueryIncludeFilter(dsReportAccountBalanceHeader.SelectQuery, Filters, 'IDs', SelectedIDs);

Также, если Вы добавите стандартное окно фильтрации в отчетах Fast Report, фильтры будут созданы и автоматически включены.

А как включить эти фильтры из собственного окна фильтрации для отчета? Думаю примерно так:

function fr_AccountCitiesOnPreview(ReportPreviewer) {
	var DatasetNameStr = "ds_AccountsCities"; 
	var str = ReportPreviewer.DatasetUSIList.CommaText; //в строчке ReportPreviewer.DatasetUSIList.CommaText передаются USI датасетов, через запятую
	var ReportDatasetUSI =  str.substr(str.indexOf(DatasetNameStr), DatasetNameStr.length);
	var Dataset = ReportPreviewer.DatasetByUSI(ReportDatasetUSI);
    var AccountTypeIDstr = GetAttribute(ReportPreviewer.Report,'AccountTypeIDs');
    var OwnerIDstr = GetAttribute(ReportPreviewer.Report,'OwnerIDs');
    var Count = GetAttribute(ReportPreviewer.Report,'Count');
	var AccountTypeIDs = AccountTypeIDstr.split(',');
	var OwnerIDs = OwnerIDstr.split(',');
	var SelectQuery = Dataset.SelectQuery;
	if (Count > 0) {
		ApplyDatasetFilter(Dataset, 'Parameter', Count, true);
	}
	if (AccountTypeIDstr)  {
		ApplyQueryIncludeFilter(Dataset.SelectQuery, Dataset.SelectQuery.Filters, 'AccountTypeIDs', AccountTypeIDs);
	}
	if (OwnerIDstr)  {
		ApplyQueryIncludeFilter(Dataset.SelectQuery, Dataset.SelectQuery.Filters, 'OwnerIDs', OwnerIDs);
	}
}

Но так не работает. Что нужно писать вместо Dataset.SelectQuery.Filters?

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

Попробуйте функцию ApplyDatasetIncludeFilter(Dataset, FilterCode, ParamValues, Enabled, Parameters)

function ApplyDatasetIncludeFilter(Dataset, FilterCode, ParamValues, Enabled, Parameters) {
	var Filter = GetSelectQueryFilterByCode(Dataset.SelectQuery, FilterCode);
	ApplyQueryIncludeFilter(Dataset.SelectQuery, Filter.ParentFilters, FilterCode,
		ParamValues, Enabled, null, Parameters);
}

т.е:

 ApplyDatasetIncludeFilter(Dataset, 'AccountTypeIDs', AccountTypeIDs, true)

И проверьте, что бы в if "заходило".

В if заходит, но фильтры не срабатывают :sad:

Дмитрий, здесь нужна отладка...

Попробуйте на функции ApplyDatasetIncludeFilter(Dataset, 'AccountTypeIDs', AccountTypeIDs, true) нажать F11 в MS Visual Studio и пройтись в глубь. Попробуйте найти причину: возможно система берет "не тот" Select query (по идее их должно быть два), находит ли система в данном select query фильтр AccountTypeIDs.

Если не получится, напишите в личку время и дату когда Вам будет удобнее провести удаленное подключение для отладки.

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

По видимому он берет не "тот" SelectQuery, так как в списке фильтров при выполнении только Parmeter. А нет способа обращаться непосредственно к Subquery?

Мои попытки типа Dataset.SelectQuery.Subquery ни к чему не привели.

Здравствуйте, Дмитрий.

Есть:

Dataset.SelectQuery.Items(0).Filters

Вместо Items(0), попробуйте поставить Items(1) и посмотреть что "внутри".

На

Dataset.SelectQuery.Items(1).Filters

Пишет List index out of bounds (1)

Попробуйте в SelectQuery сервисе обозвать второй Select как Select1, и потом:

var Select1 = Dataset.SelectQuery.ItemsByCode('Select1');
var Filters = Select1.Filters;

Бросил это занятие и сделал записью итогов в отдельное поле в таблице городов и фильтрацией по этому полю. Вопрос закрыт.

Есть другой вопрос: если во время работы с CRM открыть и закрыть отчет, то при закрытии CRM выскакивает ошибка:

В чем может быть проблема?

Здравствуйте, Дмитрий.

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

Также рекомендую Вам почистить кеш и обновить используемые Вами бинарные файлы на более новую версию, направив запрос на support@terrasoft.ru.

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

Доброго времени суток,
Просьба подсказать как добавить в Итоги раздела Планирование сумму по колонке Потенциал, в коробочной версии реализована сумма Палана и Факта.
планирование
Terrasoft 3.3.2.172

Нравится

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

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

Поскольку реестр раздела формируется динамически в программном коде, Вам следует редактировать следующие сущности:

1. Структуру таблиц, где хранится планирование: tbl_Planning и tbl_PlanningData;

2. написать новые скрипты расчета потенциала по аналогии с содержимым Planning\Library\scr_PlanningFixedUtils в конфигурации

3. Добавить колонки в реестр отображения wnd_PlanningViewGrid

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

Здравствуйте Анна,
Решение задачи:
Изменения выделены комментариями //20.07
1.Подсчет:
В src_PlanningUtils

function CreateDimensionDataset(Planning, DimensionKey) {
	var Dataset = Services.CreateItem('DBDataset');
	var DataFields = Dataset.DataFields;
	var DataField;
 
	var DataTable = GetSingleItemByCode('tbl_PlanningData');
...
 
	for (Key in Planning.Indicators) {
		Column = Planning.Query.Columns[Key];
		IndicatorCaption = "Итого | " + Column.Caption;
		NamePrefix = GenNamePrefixByUID(Column.RecordID);
 
		if (Column.IsPlanning) {
			if (Values('PlanningValue')('IsVisible')) {
				DataField = DataFields.CreateCalcDataField();
				DataField.Name = 'PlanningSum_' + NamePrefix;
				DataField.IsReadOnly = true;
				DataField.Caption = IndicatorCaption + ' | ' + Values('PlanningValue')('Caption');
				DataField.MultilineCaption = DataField.Caption;
				DataField.IsFilteringField = false;
				DataFields.AddItem(DataField);
			}
		}
 
		if (Values('ActualValue')('IsVisible')) {
			DataField = DataFields.CreateCalcDataField();
			DataField.Name = 'ActualSum_' + NamePrefix;
			DataField.IsReadOnly = true;
			DataField.Caption = IndicatorCaption + ' | ' + Values('ActualValue')('Caption');
			DataField.MultilineCaption = DataField.Caption;
			DataField.IsFilteringField = false;
			DataFields.AddItem(DataField);
		}
 
//20.07
		if (Values('FixedValue')('IsVisible')) {
			DataField = DataFields.CreateCalcDataField();
			DataField.Name = 'FixedSum_' + NamePrefix;
			DataField.IsReadOnly = true;
			DataField.Caption = IndicatorCaption + ' | ' + Values('FixedValue')('Caption');
			DataField.MultilineCaption = DataField.Caption;
			DataField.IsFilteringField = false;
			DataFields.AddItem(DataField);
		}		
 
//20.07		
	}
 
	return Dataset;
}
function PlanningOnDatasetCalcFields(Planning, Dataset) {
	var Values = Planning.Values;
	var ValuesKeys = Values.Keys().toArray();
...
	if (Planning.DisplayRecordSum) {
		for (IndicatorKey in Planning.Indicators) {
			Indicator = Planning.Query.Columns[IndicatorKey];
 
			var PlanningSum = 0.0;
			var ActualSum = 0.0;
			//20.07
			var FixedSum = 0.0;
			//20.07
 
			for (PeriodKey in Planning.Periods) {
				Period = Planning.Periods[PeriodKey];
 
				NamePrefix = GenNamePrefixByDate(Period.BeginDate, Indicator.RecordID);
 
				var PlanningFieldName = Values('PlanningValue')('Prefix') + '_' + NamePrefix;
				var ActualFieldName = Values('ActualValue')('Prefix') + '_' + NamePrefix;
				//20.07
				var FixedFieldName = Values('FixedValue')('Prefix') + '_' + NamePrefix;				
				//20.07
 
				PlanningField = Dataset.Datafields.ItemsByName(PlanningFieldName);
				ActualField = Dataset.Datafields.ItemsByName(ActualFieldName);
				//20.07
				var FixedField = Dataset.Datafields.ItemsByName(FixedFieldName);
				//20.07
				if (PlanningField) {
					PlanningSum = PlanningSum + PlanningField.Value;
				}
				if (ActualField) {
					ActualSum = ActualSum + ActualField.Value;
				}
 
				//20.07
				if (FixedField) {
					FixedSum = FixedSum + FixedField.Value;
				}
				//20.07				
			}
 
			NamePrefix = GenNamePrefixByUID(Indicator.RecordID);
			if (Indicator.IsPlanning) {
				if (Values('PlanningValue')('IsVisible')) {
					PlanningFieldName = 'PlanningSum_' + NamePrefix;
					PlanningField = Dataset.Datafields.ItemsByName(PlanningFieldName);
					if (PlanningField) {
						PlanningField.Value = PlanningSum;
					}
				}
			}
			if (Values('ActualValue')('IsVisible')) {
				ActualFieldName = 'ActualSum_' + NamePrefix;
				ActualField = Dataset.Datafields.ItemsByName(ActualFieldName);
				if (ActualField) {
					ActualField.Value = ActualSum;
				}
			}
 
			//20.07
				if (Values('FixedValue')('IsVisible')) {
 
				FixedFieldName = 'FixedSum_' + NamePrefix;
				FixedField = Dataset.Datafields.ItemsByName(FixedFieldName);
				if (FixedField) {
					FixedField.Value = FixedSum;
				}
			}
			//20.07			
 
		}
	}
}

2. Отображение: В wnd_PlanningViewGridScript функция CreateGridViewColumns создает колонки в GridView

function CreateGridViewColumns() {
	var Planning = PlanningViewGrid.Planning;
	var GridView = grdData.ActiveView;
...	
	if (Planning.DisplayRecordSum) {
		for (Key in Planning.Indicators) {
			Indicator = Planning.Query.Columns[Key];
			IndicatorCaption = "Итоги | " + Indicator.Caption;
			NamePrefix = GenNamePrefixByUID(Indicator.RecordID);
 
			if (Indicator.IsPlanning) {
				if (Values('PlanningValue')('IsVisible')) {
					ColumnNamePrefix = GridView.Name + '_col' + NamePrefix;
					ColumnName = 'PlanningSum_' + ColumnNamePrefix;
					Column = Window.CreateComponent('DataGridColumn', ColumnName);
					Column.DataFieldName = 'PlanningSum_' + NamePrefix;
					Column.MinWidth = 40;
					Column.Width = 70;
					GridView.AddItem(Column);
				}
			}
 
			if (Values('ActualValue')('IsVisible')) {
				ColumnNamePrefix = GridView.Name + '_col' + NamePrefix;
				ColumnName = 'ActualSum_' + ColumnNamePrefix;
				Column = Window.CreateComponent('DataGridColumn', ColumnName);
				Column.DataFieldName = 'ActualSum_' + NamePrefix;
				Column.MinWidth = 40;
				Column.Width = 70;
				GridView.AddItem(Column);
			}	
 
 
			//20.07
				if (Values('FixedValue')('IsVisible')) {
				ColumnNamePrefix = GridView.Name + '_col' + NamePrefix;
				ColumnName = 'FixedSum_' + ColumnNamePrefix;
				Column = Window.CreateComponent('DataGridColumn', ColumnName);
				Column.DataFieldName = 'FixedSum_' + NamePrefix;
				Column.MinWidth = 40;
				Column.Width = 70;
				GridView.AddItem(Column);
			}
			//20.07
		}
	}
 
	Column = Window.CreateComponent('DataGridColumn', GridView.Name + '_colFake');
	Column.IsVisible = false;
	GridView.AddItem(Column);
}
Показать все комментарии