Планирование

Здравствуйте.
Помогите решить задачу: Надо, чтобы в разделе Планирование была возможность сравнивать факт не с одним плановым значением, а хотя бы с двумя (допустим, критическое значение и ожидаемое значение). Сейчас есть возможность внесения только одного Плана. Для сравнения с другим планом необходимо создавать такое же планирование и заполнять там планы отдельно. Поэтому на одной диаграмме вывести сравнение факта с несколькими планами невозможно. Почему-то такая функция не предусмотрена, хотя есть возможность вывести рядом несколько различных фактических значений.
Идеальный вариант решения: при указании, что показатель планируется, указывается кол-во планируемых значений. А далее с этими колонками работать по тому же принципу, что и с имещейся на сейчас колонкой "План". Чтобы их можно было заполнять, сохранять, считать % выполнения, скрывать при необходимости для отражения.
Допустимый вариант решения: при указании, что показатель планируется, автоматически создается 2 плана, а не один.
Какие функции отвечают за формирование планируемых колонок в таблице?
Где происходит выведение их на экран и сохранение заполненных значений?

Нравится

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

Здравствуйте, Виктория!

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

Инна Безверхняя,
II линия службы поддержки Terrasoft.

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

Виктория, еще раз, здравствуйте!

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

Прежде всего, Вам нужно добавить новое поле (PlanningValue2) в таблицу tbl_PlanningData, в соответствующий sq и датасет (sq_PlanningData и ds_PlanningData).

Далее, в скрипте scr_PlanningUtils в функцию function LoadPlanning(Planning, ID) необходимо добавить фрагмент кода, примерно такого содержания:

var Value = GetNewDictionary();
                Value.Add('IsVisible', true);
                Value.Add('IsEnable', true);
                Value.Add('IsCalculate', false);
                Value.Add('Prefix', 'PV2');
                Value.Add('Caption', "План 2");
                Value.Add('CanEdit', true);
                Planning.Values.Add('PlanningValue2', Value);

В функцию CreateDimensionDataset(Planning, DimensionKey) во втором цикле необходимо дописать:

                for (Key in Planning.Indicators) {if (Column.IsPlanning) {if (Values('PlanningValue2')('IsVisible')) {
                                                               DataField = DataFields.CreateCalcDataField();
                                                               DataField.Name = 'Planning2Sum_' + NamePrefix;
                                                               DataField.IsReadOnly = true;
                                                               DataField.Caption = IndicatorCaption + ' | ' + Values('PlanningValue2')('Caption');
                                                               DataField.MultilineCaption = DataField.Caption;
                                                               DataField.IsFilteringField = false;
                                                               DataField.SQLDataType = sdtFloat;
                                                               DataField.SQLPrecision = 2;
                                                               DataFields.AddItem(DataField);
                                               }
                               }}

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

Прорисовка гида прописана в скрипте wnd_PlanningViewGridScript, функция wnd_PlanningViewGridScript и далее, кроме того, нужно еще добавлять параметры для отображения/скрытия этой колонки и многое другое.

В целом, ситуация примерно такая, далее нужно пробовать, отлаживаться и тестировать.

Инна Безверхняя,
II линия службы поддержки Terrasoft.

Спасибо, буду пробовать.
Обязательно сообщу о результатах и проблемах (если возникнут).

Здравствуйте.
Проблема все-таки возникла. У меня вышло добавить колонку План 2, и даже сделать возможным ее скрытие/отображение.
Но: сохранить внесенные значения в колонку План 2 при отладке не получается.
Я пробовала изменить функцию UpdatePlanningValue, заменив часть кода на

	try {
		if (Dataset.IsEmptyPage) {
			InsertPlanningData(Planning.ID, Period.BeginDate, 
				Dimension.RecordID, DimensionID, Indicator.RecordID, 
				DataField.ValAsFloat, 0, 0,DataField.ValAsFloat);
		} else {
			Dataset.Edit();
			Dataset.Values('PlanningValue') = DataField.ValAsFloat;
			Dataset.Values('PlanningValue2') = DataField.ValAsFloat;
			Dataset.Post();
		}

Функцию InsertPlanningData тоже соответственно пришлось изменить. В нее я добавила еще одну переменную InsertPlanningData(PlanningID, Period, PlanningDimensionID,
DimensionID, PlanningIndicatorID, PlanningValue, ActualValue, FixedValue, PlanningValue2).
А в сам код этой фукнции добавила строку Dataset.Values('PlanningValue2') = PlanningValue2 || 0;
Ошибок при отладке нет, но после того, как вношу значение в колонку з План 2, ничего не меняется, все значения в ней равны 0.

Что надо изменить, чтобы получилось правильно?

А вот , если попробовать изменить значения в колонке План, то План 2 заполняется аналогичными значениями...

Внесла еще доп.изменения в функцию UpdatePlanningValue

if (Keys[2] != 'PV') {
	    if (Keys[2] != 'PV2') {
	    return;
		}
	}

И в конце добавила

if (Keys[2] == 'PV2') {
	try {
		if (Dataset.IsEmptyPage) {
			InsertPlanningData(Planning.ID, Period.BeginDate, 
				Dimension.RecordID, DimensionID, Indicator.RecordID, 
				0, 0, 0,DataField.ValAsFloat);
		} else {
			Dataset.Edit();
			Dataset.Values('PlanningValue2') = DataField.ValAsFloat;
			Dataset.Post();
		}
	} finally {
		Dataset.Close();
		ApplyDatasetFilter(Dataset, 'PlanningID', null, false);
		ApplyDatasetFilter(Dataset, 'Period', null, false);
		ApplyDatasetFilter(Dataset, 'PlanningDimensionID', null, false);
		ApplyDatasetFilter(Dataset, 'PlanningIndicatorID', null, false);
		ApplyDatasetFilter(Dataset, 'DimensionID', null, false);
	}
 
	}

Теперь все сохранилось!

Теперь очень хочется получить график по этим планируемым значениям :smile:
Надо внести изменения в скрипт wnd_PlanningViewGraphScript. С чего надо начать?

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

	var X;
	var Y;
	if    (Type == 1) {
	X= "(План)";
	Y='PV';
	}
	if    (Type == 3) {
	X= "(План 2)";
	Y='PV2';
	}
 
	if    (Type == 2) { 
	X= "(Факт)";
	Y='AV';
	}

И строки SeriesTitle = Indicator.Caption + ((Type == 1) ? "(План)": "(Факт)"); и FieldName = ((Type == 1) ? 'PV' : 'AV') + '_' + NamePrefix; заменить на SeriesTitle = Indicator.Caption + X; и FieldName = Y + '_' + NamePrefix;

В функции UpdateGraph после AddSeries(Planning, Dimension.Dataset, Graph, Indicator, 1); написать еще одну строку AddSeries(Planning, Dimension.Dataset, Graph, Indicator, 3);

Инне спасибо за помощь

Здравствуйте, Виктория!

Очень рада, что Вам удалось разобраться!
И спасибо за то, что поделились своим опытом, думаю, многим пользователям это будет полезно и интересно.

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