Как сделать мультисправочник в форме фильтрации отчета. Раньше можно было заменить модуль и дописать функционал, сейчас запретили делать замещение. Неужели нельзя никак?

Нравится

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

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

 

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

 

Но, к сожалению, это не всегда возможно.

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

 

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

 

Но, к сожалению, это не всегда возможно.

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

Добрый день.
Возникла проблема с реализацией следующего функционала:
для отчета в Excel сделали собственное окно фильтрации с выбором дат.
В этом же окне необходимо сделать множественный выбор подразделения(справочник контрагенты тип подразделение) для фильтрации. Тут то и получается загвоздка.
При использовании такого кода:
LookupUtilities.ThrowOpenLookupMessage(sandbox, config, addCallBack, this);
окно выбора открывается, но так как окно фильтрации работает в тихом режиме, после выбора значений callback не отрабатывает и мы попадаем в реестр активности вместо окна фильтрации. Как можно обойти это либо как использовать стандартный lookupEdit для множественного выбора из справочника?
Версия BPM 7.2.0.942

Нравится

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

Здравствуйте, Иван!
Не могли бы Вы более полно опистаь проблему и то, как Вы ее решаете и привести код страницы.
Не совсем понял, что подразумевается под тихим режимом.
Также посмотрите тему http://www.community.terrasoft.ua/forum/topic/10347, возможно это то, что Вам необходимо. Суть в том, что нужно использовать не ThrowOpenLookupMessage, а Open.

При открытии окна фильтрации в адресной строке остается '...0/Nui/ViewModule.aspx#SectionModule/ActivitySection/', поэтому когда в окне справочника нажимаем кнопку выбрать или отмена, то попадаем не на страницу фильтрации а в реестр активностей. При этом yandler отрабатывает нормально.
Файл с кодом модуля прикреплен.
Модуль вызывается так:

window.ActivityViewModel = this;
                var id = sandbox.id + "_ActivityReportFilterPage";
                var renderTo = Ext.get("centerPanel");
                var historyState = sandbox.publish("GetHistoryState");
                sandbox.publish("PushHistoryState", {hash: historyState.hash.historyState});
                sandbox.loadModule("ActivityReportFilterPage", {
                    renderTo: renderTo,
                    id: id,
                    keepAlive: true
                });

Иван, я немного не понял, после замены ThrowOpenLookupMessage на вызов Open проблема все еще актуальна или нет?)

После замены на Open и добавления в init следующих строк:

var state = sandbox.publish('GetHistoryState');
                var currentHash = state.hash;
                var currentState = state.state || {};
                if (currentState.moduleId === sandbox.id) {
                    return;
                }
                var newState = Terrasoft.deepClone(currentState);
                newState.moduleId = sandbox.id;
                sandbox.publish('ReplaceHistoryState', {
                    stateObj: newState,
                    pageTitle: null,
                    hash: currentHash.historyState,
                    silent: true
                });

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

Иван, посмотрите пример в EmailPage. Там в lookup.config передается набор загружаемых колонок:

			this.methods.getLookupConfig = function(columnName) {
				var scope = this;
				var callback = function(args) {
					scope.onLookupSelect(args);
				};
				return {
					config: {
						entitySchemaName: 'VwRecepientEmail',
						columnName: columnName,
						columns: ['ContactId'],
						filters: Terrasoft.createColumnIsNotNullFilter('ContactId'),
						multiSelect: true
					},
					callback: callback
				};
			};
...
this.methods.openCopyRecepientLookupEmail = function() {
				var lookup = this.getLookupConfig('CopyRecepient');
				lookup.config.actionsButtonVisible = false;
				LookupUtilities.Open(sandbox, lookup.config, lookup.callback, this, this.renderTo);
			};
...
this.methods.onLookupSelect = function(args) {
				var columnName = args.columnName;
				var isContactEmpty = Ext.isEmpty(this.get('Contact'));
				var items = args.selectedRows.collection.items;
				this.recepientCollection = this.recepientCollection || [];
				var collection = this.recepientCollection;
				var columnValue = this.get(columnName);
				if (Ext.isEmpty(columnValue)) {
					columnValue = '';
				} else {
					columnValue = columnValue.trim();
					var addSymbol = '';
					var symbol = columnValue[columnValue.length - 1];
					if (symbol === ';') {
						addSymbol = ' ';
					} else {
						addSymbol = '; ';
					}
					columnValue = columnValue + addSymbol;
				}
				Terrasoft.each(items, function(item) {
					var contactId = item.ContactId;
					if (isContactEmpty && Ext.isEmpty(columnValue) && columnName === 'Recepient') {
						this.loadLookup('Contact', contactId);
						isContactEmpty = false;
					}
					var displayValue = item.displayValue;
					if (collection.indexOf(contactId) < 0) {
						collection.push(contactId);
					}
					if (!((columnValue.indexOf(displayValue + ';') === 0) ||
						(columnValue.indexOf(displayValue + ';') >= 0))) {
						columnValue += displayValue + '; ';
					}
				}, this);
				this.set(columnName, columnValue);
			};

Разобрался, спасибо.

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

Добрый день.

Столкнулись во с такой проблемой: при создание отчета в поле "Отображать отчет в разделе" не весь список разделов, нет новых созданных разделов. Как их туда добавить?

Нравится

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

Анастасия, чтобы добавить созданные разделы в перечень разделов, отображающихся в списке поля «Отображать отчет в разделе», необходимо:
1. Открыть сервис scr_ReportUtils (Common\Library\scr_ReportUtils).
2. Найти функцию function GetWorkspaceCodeEnum(). Добавить в нее строку кода, подобную

WorkspaceCodes("Accounts") = 'wnd_AccountsWorkspace';

Где Accounts – название раздела, wnd_AccountsWorkspace – сервис рабочего пространства раздела.

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

Здравствуйте.
Есть такой вопрос: При создании отчета fast report используется стандартное окно фильтрации, в котором отображаются фильтры Старт. Дата, Кон.Дата, Документ, Тип Документа. Тип Документа выставлен по умолчанию в fr_ReportSheduleOfWork.
Требуется автоматически подставлять в фильтр Документ текущий документ из грида. Делать отчет по выделенным записям нельзя, т.к. необходимо выбирать даты, а так окно фильтрации не появляется.
Вопрос в том, можно ли сделать это без собственного окна фильтрации?
Заранее благодарен.

Нравится

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

Здравствуйте, Иван Александрович.
Для того, чтобы реализовать возможность автоматически подставлять в фильтр "Документ" базового окна фильтрации отчета FastReport текущий документ из реестра записей, необходимо внести следующие дополнения в базовые скрипты:
1. Скрипт scr_ReportUtils. В функцию function ReportMenuItemExecute(ActionMenuItem, GridDataset, DataGrid, WorkspaceName) добавить строки кода (выделено жирным):

function ReportMenuItemExecute(ActionMenuItem, GridDataset, DataGrid, WorkspaceName) {
...................
} else {
var Report = Services.GetNewItemByUSI(ReportCode);
var FilterFormCode = Dataset.ValAsStr('FilterFormCode');
if (FilterFormCode) {
var FilterForm = Services.GetNewItemByUSI(FilterFormCode);
SetAttribute(FilterForm, 'ReportDatasetUSI',
FilteredDatasetCode);
SetAttribute(FilterForm, 'SelectedIDs', SelectedIDs);
}
//For Document//
var SelectedName = GetDatasetFieldValueByID(GridDataset.USI, SelectedIDs[0], 'Title');
SetAttribute(Report, 'SelectedID', SelectedIDs[0]);
SetAttribute(Report, 'SelectedName', SelectedName);
//For Document//

ShowReport(Report, FilterForm);
}
break;
}
} finally {
Dataset.Close();
}
}

2. Скрипт wnd_ReportFiltersScript. В конец функции function LoadFilters(Window), как отображено ниже, добавить код, реализующий установку значения фильтра в окне фильтрации:

function LoadFilters(Window) {
................
XMLStorage.LoadFromText(FiltersXML, ForceEncoding);
fbcMain.DataFieldsList.Deserialize(XMLStorage.RootNode);
}
//For Document//
var ReportCode = System.ExtractUSICode(ReportFilters.FastReport.USI);
if (ReportCode == 'fr_ReportName') {
var FieldName = GetAttribute(ReportFilters.FastReport, 'SelectedName');
var FieldID = GetAttribute(ReportFilters.FastReport, 'SelectedID');
fbcMain.DataFieldsList.Items(0).DisplayValue = FieldName;
fbcMain.DataFieldsList.Items(0).Value = FieldID;
fbcMain.DataFieldsList.Items(0).DisplayFieldValues.Clear();
fbcMain.DataFieldsList.Items(0).DisplayFieldValues.Add(FieldName);
fbcMain.DataFieldsList.Items(0).Values.Clear();
fbcMain.DataFieldsList.Items(0).Values.Add(FieldID);
fbcMain.DataFieldsList.Items(0).ValueNotSet = false;
}
//For Document//

}

Где в fbcMain.DataFieldsList.Items(0) содержится первый по порядку элемент в форме фильтрации, в fbcMain.DataFieldsList.Items(1) - второй и т.д

Получилось! Огромное вам спасибо, Наталия!

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