создание функции планирования
Технические вопросы
Разработка

Создание функции планирования

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

Нравится

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

Краткий видео урок по разделу Планирование.

За видеоурок спасибо, но мой вопрос касается принципов создания ФУНКЦИЙ ПЛАНИРОВАНИЯ

Список функций планирования, который доступен в карточке редактирования показателей планирования, формируется с помощью функции FillEnumBySqlType скрипта wnd_PlanningIndicatorEditScript. Она имеет такой вид:

function FillEnumBySqlType(Enum, SqlType) {
   	CreateEnumItem(Enum, 'CNT', "Количество");
	if ((SqlType == sdtInteger) || (SqlType == sdtFloat)) {
   		CreateEnumItem(Enum, 'SUM', "Сумма");
	   	CreateEnumItem(Enum, 'MIN', "Минимум");
	   	CreateEnumItem(Enum, 'MAX', "Максимум");
	   	CreateEnumItem(Enum, 'AVG', "Среднее");
	} else
	if (SqlType == sdtDateTime) {
	   	CreateEnumItem(Enum, 'MIN', "Минимум");
	   	CreateEnumItem(Enum, 'MAX', "Максимум");
	}
	return Enum;
}

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

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

Получить это значение с помощью пользовательских запросов можно так: в качестве основной таблицы запроса использовать tbl_Account, вынести в запрос колонку "Название", переименовать её в "Количество" и указать в свойстве "Группировать значения как" значение "Количество". Далее на закладке "Фильтры" запроса добавить такой фильтр: "Дата создания Сегодня". Если в запросе больше не будет других колонок, Вы получите нужное значение. Но Вы не сможете настроить планирование по такому запросу.

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

Спасибо. Разобрался. В стандартной функции планирования, включающей в себя датасет ForecastFunctionTask и одноимённый запрос на выборку, есть поле TaskCount, которое и выполняет фактически ту же самую задачу, подсчитывая количество задач. Но выполняя по её образцу, получается так, что высчитыватся показатель, определяющий количество контрагентов, зарегистрированных в системе ДО сегоднешнего дня, т.е наоборот моей задаче. В запросе я создал фильтр Between по полю tbl_Acoount.CreatedOn. Если же я ставлю галочку НЕ, то подсчёт идёт верно. Не совсем понимаю свою ошибку в логике.

"razamanaz" написал:В стандартной функции планирования, включающей в себя датасет ForecastFunctionTask и одноимённый запрос на выборку, есть поле TaskCount

Уточните, пожалуйста, какую версию Вы используете. В версии 3.3.2 я не нашёл датасета с подобным названием.

"razamanaz" написал:Не совсем понимаю свою ошибку в логике.

Можете привести текст запроса, который получается в предпросмотре?

Версия 3.2.0.17.
Текст запроса:

SELECT
COUNT(CAST([tbl_Account].[ID] AS VARCHAR(38))) AS [AccountsNumber]
FROM
[dbo].[tbl_Account] AS [tbl_Account]
WHERE(NOT (NOT [tbl_Account].[CreatedOn] BETWEEN :StartDate AND :DueDate))

Я вижу в Вашем запросе двойное отрицание:

"razamanaz" написал:WHERE(NOT (NOT [tbl_Account].[CreatedOn] BETWEEN :StartDate AND :DueDate))

Думаю, Вы поставили галочку "Не" в двух местах: в основном блоке WHERE и в самом фильтре Between. Проверьте, пожалуйста. Если снять обе галочки, запрос должен работать корректно.

Совершенно верно. Только что сам заметил.Но получается интресная вещь: если снять обе галочки, то показатель всегда равен 21 и это значение никак не изменяется при добавлении нового контрагента. В запросе есть какие-либо ещё замечания? Судя по всему что-то в нём не так наверное.

Проверьте значения параметров :StartDate и :DueDate в момент выполнения запроса. Возможно, при установке значений этим параметрам Вы не учитываете время, только дату. В этом случае параметр :DueDate должен содержать не текущую, а завтрашнюю дату.

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

Отвечу сначала на второй вопрос. Для того, чтобы добавить фильтр в раздел "Планирование", необходимо добавить соответствующую колонку в запрос и датасет соответствующей функции планирования. Например, если Вам необходимо добавить фильтр по контрагенту в планирование количества задач, Вам необходимо добавить две колонки (AccountID и AccountName) в запрос sq_ForecastFunctionTask и одну колонку типа "Справочник" в датасет ds_ForecastFunctionTask.

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

Если же это нужно сделать абсолютно для всех элементов планирования, попробуйте так:

1) добавить в запросы функций планирования фильтр сравнения поля CreatedByID основной таблицы с соответствующим параметром;
2) в запрос и датасет элемента планирования (sq_ForecastItem и ds_ForecastItem) вынести поля создателя записи;
3) в функции CalculateActuals скрипта wnd_ForecastGridAreaScript определять ID создателя текущего элемента планирования (из датасета ItemDataset) и применять фильтр по создателю в датасете FilteredDataset после строк

	ApplyDatasetFilter(FilteredDataset, StartDateName, StartDate, true);
	ApplyDatasetFilter(FilteredDataset, DueDateName, DueDate, true);

Например, так:

	ApplyDatasetFilter(FilteredDataset, 'CreatedByID', CreatedByID, true);

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

В этом случае Вам необходимо сделать то, что я писал в ответе на второй вопрос: добавить в запрос Вашей функции ещё две колонки для автора и одну колонку типа "Справочник" в датасет. Все добавленные поля необходимо отключить. Посмотрите, например, как добавлено поле "Ответственный" (OwnerID) в запрос и датасет ForecastFunctionTask. Ваш запрос примет примерно такой вид (если включить колонки):

SELECT
COUNT(CAST([tbl_Account].[ID] AS VARCHAR(38))) AS [AccountsNumber],
[tbl_Account].[CreatedByID] AS [CreatedByID],
[Creator].[Name] AS [CreatedByName]
FROM
[dbo].[tbl_Account] AS [tbl_Account]
LEFT OUTER JOIN [dbo].[tbl_Contact] AS [Creator] ON [Creator].[ID] = [tbl_Account].[CreatedByID]
WHERE([tbl_Account].[CreatedOn] BETWEEN :StartDate AND :DueDate)

Благодарю, Олег. Вроде бы всё заработало.

Подниму старый топик, потому что тоже стоит задача реализовать план/фактное сравнение по определенным объектам системы. Задача реализовать планирование и сравнение с планом кол-во выполненных задач по определенным типам - звонок, презентация, встреча за месяц. Попытка следовать видеоуроку и создать свой запрос в постороителе запросов и на его основании функции планирования привели к следующим результатам.
1. Создал запрос в разделе Запросы и назвал его Планирование по задачам.
Выбрал поля :
- ИД;
- Ответственный;
- Планируемая Дата начала;
- Задача(Заголовок);
- Тип задачи;
- Состояние задачи;
Внутри запроса наложил фильтр(закладка Фильтр) по состоянию - Выполнена.
В запросе получил список завершенных задач по Ответственным.
2. Создаю Вид планирования в справочнике.
Выбрал свой запрос, указал Ключевое поле - "ИД", Поле Периода -"Планируемая Дата начала" и период планирования - Месяц.
Т.к. я понимаю так, что варианта многостолбцового планирования, допустим Столбец по типу Звонок, Встреча и т.д. нет возможности сделать, делаю функцию планирования по типу задачи Звонок и соответственно в разделе Фильтр в функции планирования добавляю фильтр - "тип задачи - Звонок".
Добавляю Измерение - Ответственный.
Попытка добавить Показатель планирования для Планирования и Отображения факта - дает пустые поля(см.рисунок). Если переключить на "Только для отображения факта" - появляются поля запроса и функция Кол-во. Приходиться пока остановиться на таком варианте. В результате, в таблице Планирование получаем список ВСЕХ контактов, которые участвовали в задачах, а не только в поле "Ответственный".
Хотелось бы услышать направление мысли для решения этой задачи и почему
- Не получается планировать по кол-ву задач?
- Почему в таблице планирования ВЕСЬ список раздела Контакты, а не только Ответственные, хотя в запросе все отображается корректно?
Версия 3.3.0.49 MS SQL Express 2008 R2

Руслан, скажите, Вы хотите планировать количество задач по типам и по ответственным одновременно? Это уже три измерения, тогда как допустимым является два. Где именно у Вас "в таблице планирования ВЕСЬ список раздела Контакты", что это за "таблица планирования"?

"Стоян Виталий" написал:Где именно у Вас "в таблице планирования ВЕСЬ список раздела Контакты", что это за "таблица планирования"?

Я имею в виду главное окно Раздела Планирование, т.е. вместе со списком Ответственных, я получаю еще кучу ненужных мне людей, хотя в разделе Запросы список, только Ответственных.
"Стоян Виталий" написал:Вы хотите планировать количество задач по типам и по ответственным одновременно?

Есть такое нескромное желание :-) Соответственно для реализации подобного функционала нужно будет сделать три Вида планирования, с соответствующими фильтрами по типам задач?

Руслан, весь список контактов может быть в том случае, если Вы выбрали в запросе главную таблицу "Контакты". Если это "Задачи", то такого быть не должно.
Чтобы при добавлении измерения список был не пустым, то нужно в запросе сформировать хотя бы одну колонку, которая бы содержала числовые значения. У Вас вытянут заголовок. Зайдите в свойства этой колонки и укажите итог "количество". После этого Вы сможете добавить измерение "количество".
Сделать планирование по ответственным и по разным типам задач невозможно. Можно планировать или по всем задачам сразу, или же создать несколько видов планирования, на каждый накладывая фильтр по определенному типу задач.

"Стоян Виталий" написал:Руслан, весь список контактов может быть в том случае, если Вы выбрали в запросе главную таблицу "Контакты". Если это "Задачи", то такого быть не должно.

Вот привожу картинки... может я чего не понимаю в определениях... но главная таблица у меня "Задачи" в запросе, это видно и в разделе Запросы и при выборе в Функцию Планирования... а в разделе планирования как видно на рисунке 19 экранов:confused: сотрудников...

А в чем теперь проблема? Отображаются ведь только ответственные. Их 19 человек. Не все контакты, а именно ответственные по задачам. Вам ведь так и нужно было.

Нет отображается 19 ЭКРАНОВ с элементами справочника Контакты!!!, а это грубо 19*40=760 м-м--м а у нас нет столько сотрудников :-). Просто я на картинке этого не могу показать :-) вы ж наших сотрудников по фамилиям не знаете...Там же на картинке в нижнем правом углу я квадратиком выделил...

Руслан, поскольку общие рекомендации были даны, но они не привели к результату, есть предложение написать на support@tscrm.com письмо с тем, чтобы обсудить возможность передачи на рассмотрение резервной копии базы данных. Воспроизвести проблему не удалось, поэтому возникает вопрос относительно базы. Укажите "для Виталия", чтобы обращение попало ко мне.

"razamanaz" написал:

Версия 3.2.0.17.


CRM или XRM? Подскажите, пож-ста, в каких версиях террасофта можно посмотреть настройку такого вида планирования(с сервисами sq_ForecastFunctionTask...), описанного в цитируемом ниже посте?
"razamanaz" написал:В стандартной функции планирования, включающей в себя датасет ForecastFunctionTask и одноимённый запрос на выборку, есть поле TaskCount, которое и выполняет фактически ту же самую задачу, подсчитывая количество задач.

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