Здравствуйте! Требуется настроить планирование по работе менеджера. У менеджера есть задача обзвонить и назначить определенное количество встреч. Данная информация фиксируется через Задачи.
Как сделать настройку планирования, чтобы данная настройка отображалась в Разделе Планирования?
Пробовал сделать, но почему то не вышло.
Сделал запрос по задачам, создал настройку планирования - в поле показатель выбрал поле Количество,которые сформировано в запросе из Заголовка, выбрал функцию "Сумма".
Мне кажется, не совсем правильно выбрал показатель в настройке планирования.
При нажатии кнопки "Пересчитать факт" в разделе планирования выдает ошибку
Сообщение об ошибке: Ошибка открытия источника данных "". Оригинальное сообщение об ошибке: Operand data type nvarchar is invalid for sum operator
Как вывести в настройки планирования фактическое количество Задач в показатель? И чтобы по этому показателю можно было формировать плановые данные?

Спасибо.

Нравится

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

Все настроил. в Демо базе есть пример. Вопрос снимается

Добрый день. Подскажите, пож-ста, где можно глянуть пример? в какой версии TS?

Пример можно посмотреть в демо версии

Здравствуйте!
Настраиваю Планирование задач по примеру в демо версии. Смотрю количество задач по Ответственным. На детали Подробно для выбранного в списке ответственного отображается 4 задачи, при этом в колонке факт основной таблицы - 0,00.
Нажимаю "Пересчитать факт" ситуация сохраняется. В чем может быть причина?

Проблема решилась настройкой прав доступа.:smile:

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

Доброго времени суток,
Просьба подсказать как добавить в Итоги раздела Планирование сумму по колонке Потенциал, в коробочной версии реализована сумма Палана и Факта.
планирование
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);
}
Показать все комментарии

3.4.0.92 xrm

Вызывается функция function FillEnumByColumns(Enum, Columns, OnlyType, ForDimension, UseTableField), в которой сравнивается

- OnlyType {...} Object
[0] 7 Number
с
Field.SQLDataType (число от 0 до 7) Number.

Откуда берется Field.SQLDataType? И почему вставляются значения в перечисления только если Field.SQLDataType = 7. 7 - это что?

рис 1
рис 2
рис 3

Нравится

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

создала заново в "Настройках планирования" свое планирование по операциям - перечисление в измерениях заполнились. Но статей так и нет. см. рис 4.
рис 4

Пробовала изменить
//FillEnumByColumns(Enum, PlanningDimensionEdit.Query.Columns, null, true, true); // 2011
FillEnumByColumns(Enum, PlanningDimensionEdit.Query.Columns, null, false, true);
появляется статья :)
но потом при открытии "Плантрования" идет многократно "Ошибка открытия запроса (Деталь)".
рис 5Рис 5

Здравствуйте, Анна!

Field.SQLDataType - это тип поля в сервисе таблицы tbl_Cashflow, по которой строится планирование. Это системное перечисление ядра: http://www.terrasoft.ru/sdk/_SQLDataTypeEnum.html

Значение 7 соотвествует типу Уникальный идентификатор.

Добавить статью у Вас не получается, потому что она неправильно вытянута в запрос: следует вытягивать ее в виде

Операции.Статья, а не Статьи операций.ID

тогда вместо статей подтягиваются пользователи
рис 8
рис 6
рис 7

Причем пришлось создать еще одно планирование, потому что в существующем не подтягивалась статья в измерение.

Здравствуйте, Анна!

Веротянее всего, вопрос все-таки в построении запроса для планирования, однако для диагностики скриншотов недостаточно - необходим сам запрос. Есть ли у Вас возможность предоставить резервную копию БД для анализа?

Здравствуйте, Анна!

Для устранения проблемы необходимо:

1. Загрузить в конфигурацию модифицированный скрипт scr_UserReportCommon (в приложении);

2. Установить в сервисах таблиц Статья и Касса основную колонку для отображения:

cashflowclause

cashaccount

3.Корректно настроить запрос (пример запроса в Мастере):

planningquery

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

4. Очистить кэш и перезапустить Terrasoft.

5. Добавить измерения в планирование. Если они уже есть - удалить и добавить заново.

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

База данных с настроенным планированием по следующей ссылке:
http://depositfiles.com/files/exhm61l97

Супер, заработало! :)

>>> 1 <<< Теперь вчера отображались на детали Подробно операции, сегодня при входе в базу - то пусто то есть операции :)
Кроме того в гриде не обновляются суммы из операций, какие кнопки не нажимай:)
Редактировать колонку План то могу то не могу, хотя "6. Не забудьте для каждой записи в добавленном измерении раздать доступ для разных групп пользователей." сделала для всех пользователей все права.
И в настройках планирования мое планирование выделено красным цветом.
Почему?)
рис 9

>>> 2 <<< На Вашей базе добавляю операции с типом Приход - они видны в планировании, а вот добавила Расходную - она в планировании не появилась.
рис 10

Анна, если у Вас планирование выделено красным цветом, следует выполнить следующее:

1. Пересохранить его (открыть и нажать ОК);
2. Проверить измерения, показатели и информационные поля - для всех ли есть поля в запросе. При необходимости - также пересохранить.

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

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

111

Анна, спасибо! Красота получилась :)
А как установить план сразу на весь год, а по периоду, выставленному в планировании (у меня квартал)?

Анна, это устанавливается в настройках планирования:

planperiod

"Alimova Anna" написал:Анна, это устанавливается в настройках планирования:

Так вот интересная штука! Я так делала. Сделала сначала год, установила сумму. Потом поменяла на квартал - и он в 1 квартал бросил всю сумму, а не разделил ее на 4 квартала.

Вопрос снят, непринципиально:)

Почему в измерение нельзя добавить Группу статьи?
См. "планирование по операциям 4" Бекап

Можно ли отображать в гриде или на детали Статью/Категорию/Группу статьи/Плательщика не закладками а одним списком построчно, примерно так
_Статья "Реклама" 1 000 грн
___категория 1 600 грн
______касса 1 300 грн
______касса 2 300 грн
...
___категория 2 400 грн

______касса 1 300 грн
______касса 2 100 грн
...
?

Здравствуйте, Анна!

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

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

Ок, ясно, спасибо :)

Где в админке механизм отображения колонок периодов в зависимости от выбранной галочки например "1 квартал"? смр рис 5

В скрипте wnd_PlanningViewGridScript в функции function CreateGridViewColumns()

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

Есть несколько проблем с правами.

Планирование
В разделе Настройка планирования на детали Доступ поставил права на запись, на детали Измерения поставил права на запись.
Также поставил права в разделе Планирование в детали Доступ. Тем не мене пользователи не могут пересчитать факт.

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

Права на деталь
Можно ли настроить права таким образом, чтобы пользователь имел только права чтения на запись, и права на запись в детали файлы? Попробовал настроить подобным образом, записывать в деталь всё равно не даёт.

Спасибо.

Нравится

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

Добрый день, Виталий!

По вопросу планирования: просмотрите, пожалуйста, прикрепленный документ Настройка раздела ПЛАНИРОВАНИЕ.doc – в нем даны подробные рекомендации о там, как настроить данный раздел, и раздать права доступа на его измерения.

По вопросу настройки раздела E-mail: необходимо видеть скриншоты Ваших настроек прав доступа в разделе Администрирование, а также скриншот Детали[Доступ] в разделе E-mail для одного из почтового сообщения, о котором идет речь. Отправьте нам их, пожалуйста, на support@terrasoft.ru (с указанием номера инцидента по Вашему запросу в теле письма: 0110145).

По правам на деталь: рассмотрим пример Детали[Визы] в разделе Документы. Доступ на деталь можно назначать как на отдельный объект (группа таблиц), так и совместно с разделом системы - Документы, указав в сервисе таблицы Вызы tbl_DocumentVises параметр Группа таблиц (Parent Table Group) – DocumentVises.png.

В случае, если Вы желаете администрировать Деталь как отдельную группу таблиц, в разделе Администрирование :: Права доступа к группам таблиц, нажмите кнопку «Добавить». Укажите название как «Визы в документах», а имя объекта SQL: tg_VisesInDocuments (префикс tg_ - обязателен). Затем в серсвисе tbl_DocumentVises указать параметр Группа таблиц (Parent Table Group) равным «Визы в документах». В разделе Администрирование :: Права доступа к группам таблиц после этого можно будет настраивать доступ к Детали по новой записи «Визы в документах».

Может кто сталкивался...
Почему возникает такая проблем с доступом: не доступны все кнопки Добавить-Изменить-Удалить... в окне wnd_VisesDetailGridArea. Причём при обновлении окна они на доли секунды становятся доступны, но доступность сразу исчезает. У пользователя полные права. У пользователя с аналогичными правами всё работает.
Кэш чистил.
Что это может быть и как исправить?

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

Свойство IsEnabled устанавливается в функции:

1

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

2

т.е. зависит от прав доступа на текущую (выделенную в реестре) запись.
Таким образом, у Вас, скорее всего, пользователь не имеет полных прав на запись.

Пользователь входит в группу, которая имеет расширенные права (на документы у группы полный доступ). Конкретно этому логину помимо этого дал полные права - никакого эффекта.
Переустановка ТерраСофт с очисткой %USERPROFILE%\\Application Data\\Terrasoft решила проблему после мониторинга Windows по обращению к файлам и реестру.

Хммм! Вышеописанное произошло вчера. Только что, с начала дня пользователи включили компы и понеслось автообновление Винды. Тот же пользователь, которому вчера переустанавливал Террасофт сообщает о рецессии проблемы, т.к. времени на выяснение причин возникновения траблы не дали - могу сообщить, что было обновление Windows XP. Просто переустановил ТерраСофт.

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

Скорее всего Вам просто нужно очистить (удалить все содержимое) папки Cache:

Пуск-Выполнить-%Appdata%-Terrasoft-Cache.

Фокус с очисткой кэша не удался (сразу написал об этом). Хорошо, что до переустановки винды не дошло:wink:

Vadson, здравствуйте.

Предлагаю поставить отладчик в функции function DoPrepare(Window) и проверить чему равна переменная AccessLevel.

Снова возникла аналогичная проблема, но у другого пользователя. Быстренько переустановили Террасофт. Проблема не исчезла (доступа к визированию у пользователя не появилось). У данного пользователя к группе договоров права на чтение, добавление, изменение. Поставили дебагер. Когда дебагер работает - AccessLevel=2. Доступ есть. Отключаем дебагер и пользователь снова не может поставить визу. Насколько непонимаю, то GetCurrentRecordAccessLevel работает как-то совсем непонятно. Кэш чистил. Доступ без дебагера появляется только при внесении ещё доступа на удаление.

Добрый день.
В выражении var AccessLevel = WorkspaceGridDataset.GetCurrentRecordAccessLevel(); метод GetCurrentRecordAccessLevel() определен в ядре. Причиной поведения приложения, описанного Вами может быть взаимодействие приложения с сервером СУБД.

Попробуйте изменить функцию DoPrepare(Window) в сервисе Common\Details\Vises\wnd_VisesDetailGridAreaScript, приведите ее, например, к такому виду:

function DoPrepare(Window) {
	SetAttribute(Window, 'EditWindowUSI', 'wnd_VisesDetailEdit');
	var WorkspaceGridDataset =
		Window.ParentWindow.Attributes('WorkspaceGridDataset');
	SetAttribute(Window, 'WorkspaceGridDataset', WorkspaceGridDataset);
	var IsCanEditWorkspace = false;
    if (Assigned(WorkspaceGridDataset)) {
 
	    var VisesContactsDataset = GetSingleItemByCode('ds_VisesContacts', 'VisesContacts');
	    ApplyDatasetFilter(VisesContactsDataset, 'ContactID', Connector.CurrentUser.ContactID, true);
 
		VisesContactsDataset.Open();
 
		// старый способ назначения переменной AccessLevel 
		//var AccessLevel = WorkspaceGridDataset.GetCurrentRecordAccessLevel();
 
		var AccessLevel = (VisesContactsDataset.RecordsCount > 0) ?  tfalFullAccess : tfalReadAccess;
	    IsCanEditWorkspace = (AccessLevel == tfalFullAccess);
	}
	SetAttribute(Window, 'CanEditWorkspace', IsCanEditWorkspace);
	wnd_BaseGridAreaOnPrepare(Window);
}

Спасибо Павел!!!! Работает.

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

Возникла проблема с реестром планирования. В руководстве пользователя о колонке "План" написано, что значения в этой колонке могут быть изменены непосредственно в реестре и редактирование активируется щелчком мыши. Однако в моём случае колонка "План" ведёт себя так же, как и остальные колонки таблицы и данные в ней нельзя редактировать. При этом она отличается цветом от остальных колонок. В чём может быть проблема? Конфигурация такая: Terrasoft XRM 3.3.2.197, Windows XP SP3.

Заранее спасибо за ответ.

UPDATE: Проблема решена, дело было в правах доступа к измерениям в настройке планирования.

Нравится

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

Да, действительно для внесения плановых значений необходимо иметь доступ на добавления данных.
В случае возникновения новых вопросов сообщите нам об этом.

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

Здравствуйте все.
Подскажите как в скрипте получить доступ к данным сохраненного плана и факта определенного Планирования?
Я решаю такую задачу: пересчитывать автоматически план одного планирования на основании данных другого. Пробую сделать функцию CalcPlan на подобие function Calc(Planning, DimensionKey, OnlyDimensionID) в скрипте scr_PlanningCalcUtils.
Застряла на том, что надо открыть известное родительское планирование, и получить оттуда сохраненные значения. Измерения планирований совпадают.

Нравится

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

Виктория,

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

То есть, если Вам необходимо получить значения другого планирования, есть два варианта решения:

1. Сохранять эти значения при каждом пересчете в определенную таблицу

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

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

Преимущества второго - не нагружается лишний раз база данных.

В обоих случаях задача является крайне сложной в реализации из-за гибкости настроек планирования.

Фактически, сотруднику надо запретить менять родительский план (включая период планирования) иначе дочерний план функционировать перестанет.

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

Моя изначальная задача выглядит так: еженедельно перепланировать 1 показатель на основании факта, и видеть как для 20 других тоже изменятся планы (это такие прогнозы по этим показателям). Факт по всем показателям у меня считается в ТС, планы мне тоже надо сообщать в ТС, чтобы все пользователи могли их видеть. А вот пересчет по формулам я могу организовать только в Excel.
Поэтому я хочу заложить известный механизм пересчета планов в скрипт. Иначе моя работа будет такой: пересчитать факты по 21 планированию, потом занести факт в Excel, потом пересчитать в Excel новые планы, заполнить полученные планы по 20 показателям по-недельно на полгода вперед. В таком виде это занимает очень много времени.

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

Теперь о моем вопросе: у меня уже есть сохранненные план и факт родительского планирования, зачем еще раз его пересчитывать и куда-то сохранять?
Мне необходимо как-то получить доступ к этим уже сохранненным данным. Вот тут и возникла проблема.

Виктория, в том-то и дело, что сохраненные есть только настройки. Ваши дочерние лпаны зависят от настроек?

Если так, тогда их можно получить из ds_PlanningData

если все-таки высчитанное значение, то оно рассчитывается каждый раз заново. И тут уже есть нюансы.

Пересчет выполняется при показе планирования в скрипте wnd_PlanningViewGridScript. Оттуда можно получить скрипты, которые производят расчет.

1. Что-то я запуталась. Я вижу, что пересчет факта происходит только при нажатии кнопки "Пересчитать" (скрипт действительно wnd_PlanningViewGridScript). Но если ее не нажимать, то значения факта заполняются старыми значениями, которые были ранее высчитаны. Значит они хранятся где-то ( а именно в ds_PlanningData). А план так точно хранится. Это так для всех планирований. Мне не понятно в чем различие , о котором Вы говорите.

2. Вопрос, на который я не могу найти ответ: как получить массив со всеми данными PlanningValue по всеми измерениям и периодам для известного планирования?

Виктория, самые последние расчитанные значения содержатся в tbl_PlanningData (могут быть получены из ds_PlanningData соответственно).

Колонки называются PlanningValue и ActualValue

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

Получить идентификатор нужного планировани можно из датасета ds_Planning

Анна, наверное, я как-то неправильно формулирую свой вопрос.
Я попробую еще раз: как , зная ID планирования, ID измерения, ID периода сформировать массив фактических значений ?
Я не знала как написать такой скрипт. С последнего моего сообщения я продвинулась в этом вопросе

var ParentDataDataset = GetSingleItemByCode('ds_PlanningData');
ApplyDatasetFilter(ParentDataDataset, 'PlanningID',  '{A8D5F91D-2A19-4E02-8471-E829FAA818CB}', true);
ApplyDatasetFilter(ParentDataDataset, 'PlanningDimensionID','{DECC77D9-6D0C-4158-89E1-00FE1F937FD2}', true);  
var ActualValue = GetNewDictionary(); 
 
 
	for (Key in Planning.Periods) {
		System.ProcessMessages();
		Period = Planning.Periods[Key];
 
        Log.Write(1,Period.BeginDate) ;
 
ApplyDatasetFilter(ParentDataDataset, 'Period', Period.BeginDate, true);
 
ParentDataDataset.Open();
 
    var    X=   ParentDataDataset.Values('ActualValue');
    Log.Write(1,X) ;
    ActualValue.Add(X, Period.BeginDate);
 ParentDataDataset.Close();
 ApplyDatasetFilter(ParentDataDataset, 'Period', Period.BeginDate, false);
}
 
 

Но , в таком моем варианте я получаю результат: Дата первого периода, Факт.значение по этому периоду, и на второй итерации Дата второго периода и ... все. Ошибку выдает на строке var X= ParentDataDataset.Values('ActualValue');
Я применяю этот скрипт на дочернем планировании, в котором отмечено для просмотра 3 периода.

Виктория,

а какую ошибку выдает? Что при этом в датасете ParentDataDataset? Откуда берется Period.BeginDate?

Если в результате фильтрации датасет пуст, то в ParentDataDataset.Values('ActualValue') NULL и скрипт работать не будет.

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

Попробуйте перетянуть ParentDataDataset.Values('ActualValue') в watch отладчика и посмотреть содержимое.

Ошибку не выдает, на второй итерации цикла останавливается на строке Log.Write(1,X) ;

Проблемы с Period.BeginDate нет. Даты начала каждого периода берутся из моего текущего открытого (дочернего) планирования . И в лог эти даты выводятся правильно.

ParentDataDataset не пуст хотя бы на первой итерации, ведь значение факта я получаю, и оно выводится в лог.
НО: возможно надо как-то по другому отменить фильтр по первой дате ? чтобы потом во второй итерации накладывать фильтр на изначальный датасет? я имею ввиду строку ApplyDatasetFilter(ParentDataDataset, 'Period', Period.BeginDate, false);
Если фильтр не отменен, то выходит, что фильтр по дате начала периода применяется 2 раза, а значит на второй итерации - датасет действительно пуст....
Как правильно отменить этот фильтр?

ApplyDatasetFilter(ParentDataDataset, 'Period', Period.BeginDate, true);

Этот фильтр не работает, потому что ему передают значние другого типа, чем тип поля.

plan

То есть, в tbl_PlanningData в поле Period хранится дата последнего пересчета. И по ней фильтровать не надо.

Фильтровать надо по PlanningID, а потом становиться на последнюю запись датасета методом Dataset.GotoLast();

Ой, что-то я запуталась , уже практически окончательно. И мне очень нужна помощь, чтобы с этим разобраться.

Что надо: получить рассчитанное значение факта для 1периода, для 2ого периода, и тд (для всех тех периодов, которые открыты в дочернем планировании. Например, неделя 40, 41, и 42) из родительского планирования.

Что есть: у меня есть Даты начала (Period.BeginDate ) этих нескольких периодов (Например, даты 3.10.11, 10.10.11 и 17.10.11) . ID родительского планирования у меня тоже есть, также известны ID измерения и то, что в этом планировании всего один показатель, который планируется.

Теперь вопросы:

1. Моя логика такая: на основании этих данных я должна иметь возможность получить информацию о факте, который хранится в таблице tbl_PlanningData.
В указанной таблице есть ID, PlanningID, Period, PlanningDemensionID, DemensionID, DemensionID, PlanningValue, ActualValue. (где Period - дата последнего пересчета?).
Т.е. получатся , что в этой таблице нет указания на период, к которому относится сохраненная запись.
Но ведь связь между этой таблицей и периодом все же где-то должна существовать.
Так где же указано это соответствие? Какой датасет надо фильтровать?

2. Могу предположить , что Даты начала периода (который я получила из дочернего планирования) может быть недостаточно для организации такого фильтра. Тогда возникнет второй вопрос
Как по дате начала Period.BeginDate найти некое ParentPeriodID родительского планирования, соответствующее такой дате начала? в какой таблице и соответствующем датасете хранится это отношение?

"Тихенко Виктория" написал:
1. Моя логика такая: на основании этих данных я должна иметь возможность получить информацию о факте, который хранится в таблице tbl_PlanningData.

В указанной таблице есть ID, PlanningID, Period, PlanningDemensionID, DemensionID, DemensionID, PlanningValue, ActualValue. (где Period - дата последнего пересчета?).

Т.е. получатся , что в этой таблице нет указания на период, к которому относится сохраненная запись.

Но ведь связь между этой таблицей и периодом все же где-то должна существовать.

Так где же указано это соответствие? Какой датасет надо фильтровать?

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

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

"Тихенко Виктория" написал:2. Могу предположить , что Даты начала периода (который я получила из дочернего планирования) может быть недостаточно для организации такого фильтра. Тогда возникнет второй вопрос

Как по дате начала Period.BeginDate найти некое ParentPeriodID родительского планирования, соответствующее такой дате начала? в какой таблице и соответствующем датасете хранится это отношение?

Даты начала и конца генерируются в скрипте mds_PlanningPeriodScript и хранятся в мемори датасете до закрытия датасета.

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

Здравствуйте.
Помогите решить задачу: Надо, чтобы в разделе Планирование была возможность сравнивать факт не с одним плановым значением, а хотя бы с двумя (допустим, критическое значение и ожидаемое значение). Сейчас есть возможность внесения только одного Плана. Для сравнения с другим планом необходимо создавать такое же планирование и заполнять там планы отдельно. Поэтому на одной диаграмме вывести сравнение факта с несколькими планами невозможно. Почему-то такая функция не предусмотрена, хотя есть возможность вывести рядом несколько различных фактических значений.
Идеальный вариант решения: при указании, что показатель планируется, указывается кол-во планируемых значений. А далее с этими колонками работать по тому же принципу, что и с имещейся на сейчас колонкой "План". Чтобы их можно было заполнять, сохранять, считать % выполнения, скрывать при необходимости для отражения.
Допустимый вариант решения: при указании, что показатель планируется, автоматически создается 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);

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

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

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

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

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

Нравится

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

А каким образом это регистрируется в вашей системе ? (сдвиг плановой даты). Вы используете раздел "Проекты" ?

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

Для планирование производства идеально подходит раздел "Проекты". Я рекомендую Вам скачать обучающее видео по этому разделу.
Реализация уведомлений: самый простой способ - генерация уведомления (почта, напоминание, запись в разделе) на изменение плана.
Хотя все зависит от специфики и требований (Кто, когда, и как может менять план-факт, кого и как об этом оповещать, влияние на изменений на текущий проект и на все проекты компании - все это нужно учитывать)

спасибо

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

Использование CRM - вопрос самодисциплины. Даже вопрос воспитания.

Сегодня анализировал информацию о продажах в CRM системе, и очень ясно ощутил, насколько это занятие похоже на уборку, например, на столе.  Люди делятся на 2 типа :) Те кто в силу самодисциплины держат в порядке свой рабочий стол, свою одежду в шкафу, свои планы в ежедневнике ну и так далее. И те кто не умеют наводить порядок, просто не понимают зачем это нужно.

В детстве родители учат детей завязывать шнурки, чистить зубы, аккуратно складывать одежду... Потом школа прививает азы планирования времени - помните дневники, 3 дня слева и 3 дня справа? :) Где-то в студенчестве часть людей сами заводят себе ежедневники, планируют бюджет...

Работа в CRM системе гарантировано доставит удовольствие тому человеку, который с детства приучен к порядку. Вот как аккуратненько у меня записаны задачки, а вот какие у меня красивые процессы, вот приближаются знаменательные события, а вот тут красиво выводится разноцветная воронка продаж... Это как почищенные зубы, завязанные шнурки и разложенная в шкафу одежда - ну полный аналог, разве нет? Удовольствие от порядка.

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

CRM - это способ наведения порядка. Разложить все по полочкам, и сказать себе "Омммм... у нас все чисто".

Нравится

Поделиться

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

Браво, Дмитрий!
Так и есть!!!:cool:

"Ровинский Дмитрий" написал:Использование CRM - вопрос самодисциплины. Даже вопрос воспитания.

И поэтому crm-координатор, внедренец, всякий, кто несет crm-идеологию в массы, становится еще и воспитателем:-)

Красиво написано, Дима, понравилось. Мне кажется, из выше сказанного может слоган вырисоваться. :)

По-моему crm система, как и любая информационная система, это всего лишь инструмент наведения порядка, а никак не способ. И если нет порядка в голове, то этим инструментом можно такое наворотить... Например, забыв отменить задачу и отправив менеджера через весь город на встречу, которая была отложена.

"Раловец Ольга" написал:Мне кажется, из выше сказанного может слоган вырисоваться.

Мне кажется, из последнего предложения мантра вырисовывается :)

P.S. Чрезмерная тяга к порядку убивает творчество :) Хотя для crm-координаторов и внедренецев это может быть и к лучшему.

"Underscore a.k.a. _" написал:Чрезмерная тяга к порядку убивает творчество :)

Но и порядок часто порождает желание творить в противовес Системе:smile: тема философская нарисовалась...
творчество менеджера и Порядок, установленный бизнес процессом:wink:

Тогда уже
Творчество менеджера vs Порядок, установленный бизнес процессом
:)

"Underscore a.k.a. _" написал:Творчество менеджера vs Порядок, установленный бизнес процессом

интересно, почему творчество менеджера противоречит порядку?
Я не знаю, держал ли Микеланджело Буонарроти в порядке свои инструменты и краски. Но знаю какой у него был нервный срыв, когда он осознал, что спланировал задачи неправильно и никак не успевает закончить своего "Моисея".

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

"Ровинский Дмитрий" написал:интересно, почему творчество менеджера противоречит порядку?

Потому что "так, сегодня с 9:00 до 12:30 я творю" это не творчество. Это рутина. И хождение по этам БП штука нужная, я бы сказал необходимая. Но не творчество.
"Ровинский Дмитрий" написал:Но знаю какой у него был нервный срыв, когда он осознал, что спланировал задачи неправильно и никак не успевает закончить своего "Моисея".

А вот здесь я бы разделял Микеланджело творца и Микеланджело PM-а. Думаю первому было наплевать на сроки, ибо у Моисея впереди была вечность. И, согласитесь, он бы не стал упрощать статую из-за какого-то дедлайна.
Творчество - сродни энергетическому лучу, а порядок - линзы, которые фокусируют творчество и позволяют рубить на нем бабло.

"Underscore a.k.a. _" написал:Потому что "так, сегодня с 9:00 до 12:30 я творю" это не творчество. Это рутина

спорно, очень спорно!

По этому поводу:
— У него запланирован подвиг с 8 часов до 10! Ну, что вы скажете, господин бургомистр, о человеке, который ежедневно отправляется на подвиг, точно на службу?
— Я сам служу, сударыня. Каждый день к девяти утра я должен идти в мой магистрат. Я не скажу, что это подвиг, но вообще что-то героическое в этом есть.

("Тот самый Мюнхгаузен")

Вот-вот. А теперь представьте его в 9 часов приходящим на работу, выпивающим дежурную кружку кофе с сигаретой,заполняющим расписание и начинающим обзванивать клиентов. Тоска. Рутина. Тут уж не до подвигов с творчеством.

Кстати уточнение в конце поста считаю личным оскорблением :)

Складывается впечатление, что CRM - враг творчества? :mrgreen:

Во-первых не CRM а информационные системы. И вообще автоматизация. Но по-моему это очевидно. А во-вторых не враг. Они просто создаются не для творчества. Не скажете же Вы, что лопата это враг плотничества :)

Есть такое понятие - творческий беспорядок.
Вроде бы как порядок, а вроде бы и не очень.

Даже автоматизация может быть творческим процессом, если подойти к этому - творчески.
Не нарушать незыблемых истин ( если встреча отменена - поставь состояние "Отмена", а можно поставить состояние "Отмена навсегда", или "отмена ненадолго")Экономит время - не надо писать комментарий и сразу понятно, что делать дальше.
Согласно, что не для всх такой подход приемлем, тем не менее - имеет право на внедрение :cool:

А дисциплина и воспитание - очень философские вопросы.

"Underscore a.k.a. _" написал:Они просто создаются не для творчества. Не скажете же Вы, что лопата это враг плотничества :)

Я и не говорю :) Они создаются для того, чтобы было больше времени и пространства для творчества благодаря делегированию рутинной работы автомату.
"Underscore a.k.a. _" написал:Творчество менеджера vs Порядок, установленный бизнес процессом

Я бы поставила между ними "рука об руку". А у Вас получается или творчество или автоматизация, по крайней мере у меня сложилось такое впечатление.

Всегда опасался людей, часто употребляющих фразы а-ля "рука об руку". Пропагандой от нее тянет :)

"Раловец Ольга" написал:А у Вас получается или творчество или автоматизация

Ну а чего ту такого странного? Результатом творчества есть уникальное решение. Результатом автоматизации есть набор шаблонных решений. Это и есть основное отличие творчества от изготовления.
P.S. Автор этого сообщения считает, что автоматизация это очень нужно. Собственно он по долгу службы только этим и занимается.
P.P.S. Автор этого сообщения не считает мир черно-белым и понимает, что эти понятия часто переплетаются.

"Underscore a.k.a. _" написал:Всегда опасался людей, часто употребляющих фразы а-ля "рука об руку". Пропагандой от нее тянет :)

И я Вам по секрету скажу, что не только употребление фразы "рука об руку" в каждом предложении делает меня человеком, которого стоит опасаться :)
"Underscore a.k.a. _" написал:Результатом автоматизации есть набор шаблонных решений.

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

"Underscore a.k.a. _" написал:Чрезмерная тяга к порядку убивает творчество

Это смотря что назыать творчеством. Если продавец прикрывает своё неумение или лень "творческим беспорядком", то надо подумать, нужен ли такой творец.
На самом деле, занимаясь "творчеством" там, где можно слепо следовать процессу, продавец и не доходит (не находит времени и возможности) до настоящего творчества продавца - подумать над тем, что клиенту нужно.

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

"Раловец Ольга" написал:
Не считаю это аксиомой. Даже печеньки, которые изготавливаются на конвеере без вмешательства человека, и то бывают разные.

Т.е. изготовление печенек на конвеере это творчество и они делаются не по шаблону? Согласен, отрицание очевидных вещей может быть намного опасней пропаганды:)
"Владимир Соколов" написал:Это смотря что называть творчеством

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

"Underscore a.k.a. _" написал:Т.е. изготовление печенек на конвеере это творчество и они делаются не по шаблону? Согласен, отрицание очевидных вещей может быть намного опасней пропаганды:)

Вырванная из контекста фраза может быть еще и не так понята! Если бы там было написано "Я люблю разные печеньки", Вы бы сделали такой же вывод? :)
Даже в полностью автоматизированном процессе и то неизбежно что-то нестандартное, а тем более в том процессе, где участвует человек, еще больше места для не шаблонных решений.

Если Вы запустите с помощью цикла 10 раз что-то типа:
Dataset.Append();
Dataset('Title') = 'молоко';
Dataset.Post();
то можно быть уверенным почти на сто процентов, что будет создано ровно 10 записей с заголовком молоко. А вот если посадите одного человека и скажите создать 10 продуктов "молоко", он может подойти к этому творчески и написать
=молоко=
МоЛоКо
МОЛОКО
Молоко и т.д.

Мое имхо:
Процессам - автоматизацию.
Работам - творчество.

Например преподаватель:
конспекты, расписание, подготовительные материалы - нужно держать в порядке.
уроки - проводить творчески.

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

"Глова Сергей" написал:код - писать творчески.

Код имеют право писать творчески только эксперты (либо лица, которые в этот момент времени считаются таковыми). Причем, даже не код, а руководства по написанию кода.

Остальные 80% кода должны быть написаны по жестким правилам и требованиям. Только тогда на выходе будет _прогнозируемый_ результат.

Во многом то же самое и с продажами. Либо это отдельные продавцы-фирмочки, которые не подчиняются общему направлению (как часто и работают компании), либо это действительно лучшие практики с постоянным их улучшением.

"Раловец Ольга" написал:он может подойти к этому творчески и написать
=молоко=
МоЛоКо
МОЛОКО
Молоко и т.д.

Руки отрывать таким творцам. После них потом разбирайся с Масквами. Это не творчество, это безалаберность.
"Глова Сергей" написал:код - писать творчески.

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

Dataset.Datafields.ParentDataset

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

"Underscore a.k.a. _" написал:Кодирование самый низкий уровень программирования, и тут уж творчество никак не допустимо. Если посадить двух кодеров, то на выходе мы должны в идеале получить два одинаковых результата.

Я неправильно выразился. Под словом "код" имелось ввиду решение определенной задачи.

Например, решение задачи "создание справочника" в Terrasoft CRM изначально было по схеме: создал таблицу, запрос, датасет, и т.д
Но кто-то решил написать скрипт, который решал задачу. Предлагаете ему руки оторвать за творчество?

Если это было сделано по личной инициативе, а не по плану, то да. Оторвать а потом премировать:)

Unerscore, даже в СССР рац.предложение приветсвовались :smile:

Творчеству - быть (в специально отведенных местах)!

Автоматизация людей - задача куда сложнее, чем автоматизация процессов:wink:

Underscore, Вы лично в своей работе оставляете место творчеству?

Вот такие весёлые темы получаются, когда коммерсант что-то говорит этакое идейное, а технари начинают сравнивать это с датасетами, печеньками, молоком и низкоуровневым программингом :wink:

"Глова Сергей" написал:Творчеству - быть (в специально отведенных местах)!

Ага, тут вот кто-то очень творчески предлагал результат задачи по ID через ХП искать:)
"Глова Сергей" написал:Underscore, Вы лично в своей работе оставляете место творчеству?

Конечно! Обожаю иконки для кнопочек подбирать:)

//дубль

"Underscore a.k.a. _" написал:Глова Сергей пишет:
Творчеству - быть (в специально отведенных местах)!

Ага, тут вот кто-то очень творчески предлагал результат задачи по ID через ХП искать:)


Underscore, не вижу в этом ничего плохого. Может, чтобы избавиться от Вашего глумления Ольга напишет универсальную ХП, аналог GetDatasetFieldValueByID, которая будет вызываться методом Connector и работать в разы быстрее чем текущее решение. Вы, конечно же, предложите оторвать руки и премировать?
"Underscore a.k.a. _" написал:Глова Сергей пишет:
Underscore, Вы лично в своей работе оставляете место творчеству?

Конечно! Обожаю иконки для кнопочек подбирать:)


Ну и как с Вами дискутировать?:smile:
Покажите скиншот Вашего расписания?
Просто я Вам не верю:)

"Underscore a.k.a. _" написал:Ну а чего ту такого странного? Результатом творчества есть уникальное решение. Результатом автоматизации есть набор шаблонных решений. Это и есть основное отличие творчества от изготовления.
P.S. Автор этого сообщения считает, что автоматизация это очень нужно. Собственно он по долгу службы только этим и занимается.
P.P.S. Автор этого сообщения не считает мир черно-белым и понимает, что эти понятия часто переплетаются.

Underscore, Вы слегка непоследовательны в отношении к творчеству и автоматизации.
Не могу понять я Вашу позицию.

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

"Раловец Ольга" написал:Даже печеньки, которые изготавливаются на конвеере без вмешательства человека, и то бывают разные.

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

"Романенко Роман" написал:Творить по расписанию нельзя.

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

"Романенко Роман" написал:Творить по расписанию нельзя.

Как музыкант с многолетним стажем заявляю: МОЖНО и НУЖНО! =)

"Шевченко Юрий" написал:Как музыкант с многолетним стажем заявляю: МОЖНО и НУЖНО! =)

Неужели получается творить по принципу "По воскресеньям я пишу отличные песни!"?

"Underscore a.k.a. _" написал:Это не творчество, это безалаберность.
Кодирование самый низкий уровень программирования, и тут уж творчество никак не допустимо. Если посадить двух кодеров, то на выходе мы должны в идеале получить два одинаковых результата.

От творчества до безалаберности один шаг :) или наоборот...
Просто пример, не воспринимайте буквально, не очень удаются мне примеры.
Сергей привел отличный пример создания справочников. Да и подобные задачи нередко встречаются.
"Глова Сергей" написал:Может, чтобы избавиться от Вашего глумления Ольга напишет универсальную ХП, аналог GetDatasetFieldValueByID, которая будет вызываться методом Connector и работать в разы быстрее чем текущее решение.

Ну разве только ради этого :)

Ребята, сделайте глубокий вздох, вспомните Пьюселика с дедушкой на рыбалке (кто был на тренинге - поймет, кто не был - сходите) разберитесь в своих комплексных эквивалентах и вспомните, о чем спор?
Начало поста - философия от Димы.
Последний комментарий - кусок кода от Оли.
Просто жесть! :lol:

Согласна, отклонились от темы, перенесла пример туда, где он более уместен.

"Глова Сергей" написал:Underscore, не вижу в этом ничего плохого. Может, чтобы избавиться от Вашего глумления Ольга напишет универсальную ХП, аналог GetDatasetFieldValueByID, которая будет вызываться методом Connector и работать в разы быстрее чем текущее решение. Вы, конечно же, предложите оторвать руки и премировать?

Предложу. Потому что
1)Этой ХП она либо
а)Проигнорит все настройки прав (думаю тут без вопросов)
либо
б)Повторит в ней все то что делается в ядре и касается прав. Т.е. сделает нехилое такое дублирование кода.
2)Эту ХП придется писать под три разных БД.
Но я надеюсь Ольга до этого не докатится :)
"Романенко Роман" написал:Перед тем, как печенье получилось отличным от другого

Ну хоть кто-то меня поддержал.
"Глова Сергей" написал:Underscore, Вы слегка непоследовательны в отношении к творчеству и автоматизации.
Не могу понять я Вашу позицию.

да чего уж тут непонятного. Вот Роман примерно то же самое говорит.
"Глова Сергей" написал:Покажите скиншот Вашего расписания?
Просто я Вам не верю:)

Охотно. А вообще доверие это основа нормальных человеческих взаимоотношений, так что даже не знаю что теперь делать :)

Отличные планы:cool:
Только Англию то за что ж так...

Англия - наверное, по основному БП проходит. Надо - значит надо :smile:

По поводу ХП - я же просто ради примера, может не совсем удачного.

"Александр Кудряшов" написал:Только Англию то за что ж так...

Пиво ихнее (давайте, Ольга, это Ваш шанс) подорожало сильно :)

"Underscore a.k.a. _" написал:Пиво ихнее (давайте, Ольга, это Ваш шанс) подорожало сильно :)

В рамках оффтопика - не только их, немецкое тоже...

Да, придется пить эти чешские помои :)

"Underscore a.k.a. _" написал:Расписание Undescore.PNG

Вот это надо включить в презентацию!

"Александр Кудряшов" написал:Отличные планы:cool:
Только Англию то за что ж так...

Думаю, за американских колонистов :)

"Романенко Роман" написал:Неужели получается творить по принципу "По воскресеньям я пишу отличные песни!"?

Рома, вдохновение,идея, муза (называй как хочешь) может прийти когда угодно, даже во сне. Важно запланировать для себя то время, когда ты эту идею воплотишь и подумаешь над её реализацией.

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

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

"Шевченко Юрий" написал:Рома, вдохновение,идея, муза (называй как хочешь) может прийти когда угодно, даже во сне.

Юра, я же с этим не спорю.
Есть "ремесло", а есть творчество. "Ремеслу" - расписание и планирование, а творчеству - вдохновение и свободная от рутины голова и душа. Когда творишь, меньше всего думаешь о расписании, категориях и прочих "полях, обязательных для заполнения в CRM".

"Underscore a.k.a. _" написал:По-моему crm система, как и любая информационная система, это всего лишь инструмент наведения порядка, а никак не способ. И если нет порядка в голове, то этим инструментом можно такое наворотить..

Сразу вспомнил:

"Михаил Булгаков" написал:"...разруха не в клозетах, а в головах.", - Собачье сердце

:lol:
Дмитрий начал интересную тему... Underscore - раскрыл ее другую сторону :)
Истина - одна... И как было сказано в одном фильме: the true is out there!
А вот правда... Мы живем во время постмодернизма, где правде - это только субъективное восприятие истины. Следовательно - у каждого своя :wink:

--
www.it-sfera.com.ua

Чего-то меня понесло не в ту степь....

--
www.it-sfera.com.ua

Виталий, надеюсь за время вашего тсутствия на комьюнити ничего серьезного не случилось? Ато приходите на работу к 8 явно не для того чтобы поработать, настроение у Вас какое-то философское:)

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

Компания SofteX(CRM Solution Partner, г.Симферополь) сейчас занимается реализацией очень интересного проекта в котором мы полностью переработали понятие бюджетирования и планирования у компаний. Мы создаем инструмент, с помощью которого возможно работать с бюджетами компании и филиалов, заниматься годовым планированием бюджета по статьям, с анализом аналогичных периодов прошлых лет, с автоматических распределением годового бюджета по месяцам, расчета данных по статьям расхода из подчиненных таблиц затрат...

Кому интересно, с удовольствием можем обсудить данную тему и поделиться опытом!

Нравится

Поделиться

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

Очень интересная тема и мы считаем насегоднешний день очень актуальная. Хотелось бы у Вас узнать какие результаты достигнуты и как конкретно работает функционал. Такие модули являются обязательными для систем уровня ERP. Так же многие наши клиенты спрашивают о такой возможности. Если можно опишите механизм сбора фак. бюджета из документов в единый отчетный реестр.

На сегодняшний день этот проект существует как готовое ТЗ, которое с декабря 2008 поступает в разработку. В системе Terrasoft CRM (можно реализовать на любом продукте 3.2) мы добавляем два новых модуля:
Бюджеты: Используется для регистрации новых бюджетов сложных структур (в том числе консолидированные бюджеты), визирование бюджетов на разных уровнях доступа, ведение архивной базы бюджетов.
Планирование: Из текущего бюджета можно открыть модуль Планирования, в котором ведется все статьи доходов-расходов за год и по месяцам, плановые и фактические суммы, % содержания статьи в бюджете, маржа, средние цены,...Есть визуальные формы графики распределения бюджета по месяцам.
Отчеты: Печатная форма бюджета ПЛАН, Печатная форма сравнения бюджетов, Печатная форма бюджета ПЛАН-ФАКТ.

Что касается заполнения фактических данных в бюджеты, тут механизм следующий: Во всех финансовых операциях есть обязательные поля: Период, Статья. После заполнения этих полей в операциях, введенных вручную, или полученных из 1С обновляются фактические показатели в бюджете!

Добрый день!
Можно как то оценить доработку?

Добрый день, Роман!

Конечно!
Пишите в личку или скайп d.shindin

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