Workbook.StatCorrTabSheetSource

Синтаксис

StatCorrTabSheetSource: PP.TS.StatTabSheetSource;

Описание

Свойство StatCorrTabSheetSource устанавливает источник данных для листа на вкладке «Матрица корреляции» в панели статистики.

Пример

Для выполнения примера предполагается наличие на странице компонента WorkbookBox с наименованием «workbookBox» (см. «Пример создания компонента WorkbookBox»), также необходимо в обработчике события открытия документа добавить следующий код:

	//К событию окончания соединения с метабазой добавим обработчик, который 
	//устанавливает доступность кнопки  "Добавить ряд", в зависимости от выделенных рядов
	metabase.EndRequest.add(PP.Delegate(function(){		
		var selectedSeries = wbk.getActiveSheet().getSelectedSeries();		
		//Проверяем наличие групповых рядов среди выделенных
		var groupSerieSelected = false;	
		for (var i = 0; i < selectedSeries.length; i++)
		{
			if (PP.TS.isGroupSerie(selectedSeries[i]))
			{
				groupSerieSelected = true;
				break;
			}
		}
		//Проверяем наличие дочерних рядов среди выделенных
		var derivedSerieSelected = false;
		for (var i = 0; i < selectedSeries.length; i++)
		{
			if (PP.TS.isDerivedSerie(selectedSeries[i]))
			{
				derivedSerieSelected = true;
				break;
			}
		}
		//Устанавливаем доступность кнопки
		if(selectedSeries.length>1 && !groupSerieSelected && !derivedSerieSelected)
		{
			addLRRowButton.setEnabled(true);
		}
		else
		{
			addLRRowButton.setEnabled(false);
		}					
	}));
			
	var addLRRowButton = new PP.Ui.Button({
		ParentNode: document.body, //Родительский узел DOM
		Content: "Добавить ряд", //Подпись
		Click: PP.Delegate(onClickAddLRRow)					
	});
	function onClickAddLRRow(){
		//Создаем объект, в котором будет содержаться информация о добавляемом ряде
		var metaData  = {};	
		//Присваиваем тип формулы добавляемого ряда "Линейная регрессия"
		metaData.formulaType = PP.TS.Ui.FormulaTypeEnum.LinearRegression;
		//Получаем выделенные ряды рабочей книги
		var selectedSeries = wbk.getActiveSheet().getSelectedSeries();
		var series = [];
		for (var i = 0; i < selectedSeries.length; i++)
		{
			if (!PP.TS.isGroupSerie(selectedSeries[i]))
				//Создаем массив негрупповых рядов из массива выделенных
				series.push(selectedSeries[i]);
		}
		if (series.length > 0)
		{
			//Получаем индекс последнего выделенного негруппового ряда
			var lastSerieIndex = series[series.length - 1].index;
		}
		metaData.serieFlags = 0;					
		metaData.selectedRows = series;
		metaData.index = lastSerieIndex;
		//Устанавливаем уровень
		metaData.formulaLevel = series[0].level;	
		//Создаем тело запроса к серверу для добавления вычислимого ряда
		var requestBody = tsService._getSetWbkMdSettings(wbk, metaData, PP.Mb.ListOperation.Add);
		requestBody.SetWbkMd.tArg.metaGet.getTabSheet = {
			pattern: {
				DHTML: true,
				structure: true
			}
		};
		//Устанавливаем признак того, что рабочая книга изменена
		wbk.setIsChanged(true);
		//Отправляем запрос на сервер
		tsService._invokeRemoteProc(wbk, requestBody, PP.Delegate(onResponse));
	}
				
	function onResponse(sender, args)
	{					
		//Получаем информацию 
		var res = JSON.parse(args.ResponseText);
		var report = args.Args.Workbook || args.Args.Report;
		var doc = args.Args.Document;
		if (res.SetWbkMdResult.meta)
		{
			var md = res.SetWbkMdResult.meta;
			report.setWbkMetadata(md);
			//Устанавливаем рабочей книге набор временных рядов
			if (md.series && md.series && md.series.its && md.series.its.it && md.series.its.it.length == md.series["@count"])
			{
				report.setSeries(md.series.its.it);
				report.setNeedUpdateSelection(true);
			}
			else
			{
				if (md.series && md.series && md.series.its && md.series.its.it)
				{
					//обновляет список рядов рабочей книги
					report.updateSeriesList(md.series.its.it);
					//Устанавливаем признак необходимости обновления отметки
					report.setNeedUpdateSelection(true);
				}
			}
			//Вычисляем и создаём новую отметку
			var headerSz = tsService._getHeaderSizes(report); //ширина и высота боковика и заголовка
			//Получаем выделенные ячейки в таблице рабочей книги
			var oldsel = report.getSelection();
			//Получаем диапазон выделенных ячеек
			var oldparts = PP.getProperty(oldsel, "range.parts.it") ? PP.getProperty(oldsel, "range.parts.it") : [PP.getProperty(oldsel, "range")];
			var minleft = null;
			var mintop = null;
			var maxright = null;
			var maxbottom = null;
			//Получаем координаты углов выделения
			for (i = 0; i < oldparts.length; i++)
			{
				if (minleft == null || oldparts[i].left < minleft)
					minleft = oldparts[i].left;
				if (mintop == null || oldparts[i].top < mintop)
					mintop = oldparts[i].top;
				var right = oldparts[i].left + oldparts[i].width - 1;
				if (maxright == null || right > maxright)
					maxright = right;
				var bottom = oldparts[i].top + oldparts[i].height - 1;
				if (maxbottom == null || bottom > maxbottom)
					maxbottom = bottom;
			}
			//Получаем признак того, что таблица повернута
			var trans = report.getMetadata().grid.transposed;
			//Создаем объект, в котором будет содержаться информация о выделенных областях
			var part = { type: "Cells" };
			//Инициализируем объект, в котором будет содержится информация о выделенных областях
			if (trans)
			{
				part.left = headerSz.Width + report.getRealIndex(md.series.its.it[0].index);
				part.width = md.series.its.it.length;
				part.top = mintop;
				part.height = maxbottom - mintop + 1;
			}
			else
			{
				part.left = minleft;
				part.width = maxright - minleft + 1;
				part.top = headerSz.Height + report.getRealIndex(md.series.its.it[0].index);
				part.height = md.series.its.it.length;
			}
			//Инициализируем объект, в котором будет содержится информация о выделении в таблице
						var sel = {
							type: "Normal",
							range: {
								left: 0,
								top: 0,
								height: 0,
								width: 0,
								parts: {
									it: [part]
								},
								type: "MultiPart"
							}
						};
						
						var selSeriesIdxes = [];
						for (i = 0; i < md.series.its.it.length; i++)
							selSeriesIdxes.push(md.series.its.it[i].index);
						//Посылаем запрос на изменение отметки в таблице
						setTableSelection(report, selSeriesIdxes, undefined, undefined, true, sel, part.left, part.top, part.width, part.height);	
					}	
				}					
		function setTableSelection(wbk, selectedIndexSeries, selectedIndexCols, callback, _setSelectedSerieses, selection, left, top, width, height)
		{					
			if (selectedIndexSeries && selectedIndexSeries.length > 0)
				//Устанавливаем массив индексов выделенных рядов в таблице
				wbk.setSelectedIndexSeries(selectedIndexSeries);
			else selectedIndexSeries = wbk.getSelectedIndexSeries();
					if (!selectedIndexSeries)
						selectedIndexSeries = [];
					if (selectedIndexCols && selectedIndexCols.length > 0)
						//Устанавливаем индексы выделенных колонок
						wbk.setSelectedIndexCols(selectedIndexCols);
					else selectedIndexCols = wbk.getSelectedIndexCols();
					if (!selectedIndexCols)
						selectedIndexCols = [];
					//Получаем наименьший индекс из индексов выделенных рядов
					var start = tsService._minIndexVal(selectedIndexSeries);
					//Получаем наибольший индекс из индексов выделенных рядов
					var count = tsService._maxIndexVal(selectedIndexSeries) - start + 1;
					if (isNaN(start))
						start = undefined;
					if (isNaN(count))
						count = undefined;
					//Получаем наименьший индекс из индексов выделенных колонок	
					var colStart = tsService._minIndexVal(selectedIndexCols);
					//Получаем наибольший индекс из индексов выделенных колонок
					var colCount = tsService._maxIndexVal(selectedIndexCols) - colStart + 1;
					if (isNaN(colStart))
						start = undefined;
					if (isNaN(colCount))
						count = undefined;
					
					//создаем тело запроса к серверу на выделение добавленного ряда
					var body =
					{
						SetWbkMd:
						{
							tWbk: wbk.getOdId(),
							tArg:
							{
								meta:
								{
								},
								pattern:
								{
									setTabSheet: {
										setPattern: {
											metaData: true,
											selection: true
										},
										metaData: {
											selection: selection
										}
									}
								},
								metaGet:
								{
									seriesFilter: {
										range: {
											start: start,
											count: count
										}
									},
									columnsFilter:
									{
										range: {
											start: selectedIndexCols[0],
											count: selectedIndexCols.length
										}
									},
									statistics: {
										includeAll: true
									},
									lanerFilter: true,
									period: true,
									seriesDependencies: true,
									seriesDependents: true,
									seriesAtts: true,
									seriesDiscrepancies: true,
									seriesDisplayParams: true,
									sorting: true,
									series: PP.Mb.ListOperation.Get,
									columns: PP.Mb.ListOperation.Get															
								}
							}
						}
					};
			//В тело запроса к серверу вносим информацию о источниках данных к панели статистик
			if (selectedIndexSeries.length == 1 || wbk.getPinned())
					{
						var res = { it: [] };
						if (wbk.getPinned())
							res.it.push({ k: wbk.getSelectedOrPinnedSeries()[0].k });
						else
						{
							var ser = wbk.getSeries()[selectedIndexSeries[0]];
							if (ser)
								res.it.push({ k: ser.k });
						}
						if (res)
						{
							body.SetWbkMd.tArg.metaGet.results = {
								correlation: true,
								coefficients: true,
								tabSheet: true,
								series: res
							};
						}
					}				
					tsService._send(body, PP.Delegate(onGetMd, undefined, { Workbook: wbk, SetSelectedSerieses: _setSelectedSerieses, Indexes: selectedIndexSeries }));							
				}
				
				function onGetMd(sender, args)
				{	
					//Получаем объект JSON из ответа сервера
					var res = JSON.parse(args.ResponseText);	
					//Получаем метаданные рабочей книги
					var wbkMd = wbk.getActiveSheet().getWbkMetadata();
					//Создаем объект, в котором будет содержаться информация о данных статистики
					var meta = undefined;
					if (wbkMd)
					{
						//Инициализируем объект, в котором будет содержаться информация о данных статистики из тела ответа сервера
						if (res.GetWbkMdResult)
							meta = res.GetWbkMdResult.meta;
						else meta = res.SetWbkMdResult.meta;
					}
					//Обновляем источники данных для панели статистик
					refreshStatSources(wbkMd, meta);	
					//Получаем панель статистик
					var tsPanel = workbookBox.getDataView()._TabStatPanel;	
					tsPanel.refresh();
				}
				
				function refreshStatSources(wbkMd, meta)
				{	
					//Присваиваем данные статистики к метаданным рабочей книги
					wbkMd.statistics = meta.statistics;
					if (meta.statistics)
						//Устанавливаем  статистические данные рабочей книге
						wbk.getActiveSheet().setStatData(meta.statistics);
					if (meta.results && meta.results.its && meta.results.its.it.length == 1)
					{
						if (meta.series.its.it)
						{
							//Устанавливаем источники данных панели статистик к рабочей книге
							var result = meta.results.its.it[0];
							if (result.correlation)
							{
								
								wbk.getActiveSheet().setStatCorrTabSheetSource(new PP.TS.StatTabSheetSource({ 	
								WbkOdId: wbk.getActiveSheet().getOdId().id, //моникёр рабочей книги
								Metabase: wbk.getMetabase() //Объект подключения к метабазе
								}));
							}
							else wbk.getActiveSheet().setStatCorrTabSheetSource(undefined);
							if (result.coefficients)
							{
								//Устанавливаем источник данных ко вкладке "Уравнение" панели статистик
								wbk.getActiveSheet().setStatCoeffTabSheetSource(new PP.TS.StatTabSheetSource({ 	
								WbkOdId: wbk.getActiveSheet().getOdId().id, //моникёр рабочей книги
								Metabase: wbk.getMetabase() //Объект подключания к метабазе
								}));
							}
							else wbk.getActiveSheet().setStatCoeffTabSheetSource(undefined);
							if (result.weights)
							{
								//Устанавливаем источник данных ко вкладке "Матрица весов" панели статистик
								wbk.getActiveSheet().setStatWeightsTabSheetSource(new PP.TS.StatTabSheetSource({
								WbkOdId: wbk.getActiveSheet().getOdId().id, //моникёр рабочей книги
								Type: PP.TS.Ui.StatTabSheetType.Weights,  //Тип
								Metabase: wbk.getMetabase() //Объект подключания к метабазе
								}));
							}
							else
								wbk.getActiveSheet().setStatWeightsTabSheetSource(undefined);
						}
					}
					else
					{
						wbk.getActiveSheet().setStatCorrTabSheetSource(undefined);
						wbk.getActiveSheet().setStatCoeffTabSheetSource(undefined);
						wbk.getActiveSheet().setStatWeightsTabSheetSource(undefined);
					}
				}				

После выполнения примера на html-странице будет размещена кнопка с наименованием «Добавить ряд». Необходимо раскрыть панель статистик, нажав на кнопку «Статистика».  Чтобы кнопка «Добавить ряд» была доступна, в рабочей книге нужно выделить более одного ряда, причем ни один из выбранных рядов не должен быть ни групповым, ни дочерним. При нажатии на кнопку «Добавить ряд» в рабочую книгу добавляется ряд с типом формулы «Линейная регрессия». После добавления ряда к рабочей книге устанавливаются источники данных для вкладок «Уравнение» и «Матрица корреляции» на панели статистик. Чтобы увидеть ряд, который добавился в рабочую книгу, нужно нажать кнопку «Обновить» на вкладке «Главная» ленты инструментов.

См. также:

Workbook