Диаграмма Ганта

Здравствуйте!
Пересмотрев задачу Диаграммы Ганта с другой стороны, пришли к выводу, отобразить на одной линии 3 показателя (пояснения на приложенном рисунке).

Пройдясь по коду скрипта wnd_ProjectGanttAreaScript, я обнаружила, что используется ActiveXObject Exontrol.G2antt.1. Прогуглив я обнаружила разные виды диаграмм объекта Exontrol и нашла визуальное отображение, которое нам подходит "exg2antt" (http://www.exontrol.com/exg2antt.jsp) и хочу заменить старую диаграммую на нее.

Подскажите пожалуйста, что необходимо для этого.

Нравится

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

Валентина, в Terrasoft используется данная компонента версии 4.3.1.7 (Exontrol ExG2antt Component, ExG2antt.dll в папке с бинарными файлами), по ссылке версия 5.1.1.1, насколько я понял она отличается лишь более красивым отображением, если вы хотите подменить данный компонент, то вы его можете скачать его evolution версию с сайта http://www.exontrol.net/content/products/g2antt.zip и подменить ActiveXGUID свойство в InitializeGanttObject (wnd_ProjectGanttAreaScript) далее возможно придется переписать некоторые функции работы с данным COM объктов, основные функции работы описаны в scr_ProjectGanttAreaUtils. Некоторые примеры работы с объектом описаны в документации которые предоставляет сам компонент (они доступны после установки дистрибутива, или на самом сайте exontrol.net)
Замечу, что данный компонент является платным и вы сможете бесплатно использовать только его триальную версию (в случае 5.1.1.1)

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

Для начала отмечу, что эти диаграммы отличаются не только красивым отображением. Если вы заметили, на той картинке, которую я прикрепила визуально отображаются 3 показателя
на одной линии (http://www.exontrol.com/images/exg2anttf.jpg тут побольше картинка и виднее). Мне необходимо отобразить три показателя на одной линии о проектам, в любом виде. Но этот вариант мне показался наиболее подходящим, для нашего случая.

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

Как вы думаете, если я начну изменять scr_ProjectGanttAreaUtils под ту диаграмму которую нам необходимо, будет ли тот исход, который я ожидаю?
Или мне следовать вашему совету: "если вы хотите подменить данный компонент, то вы его можете скачать его evolution версию с сайта http://www.exontrol.net/content/products/g2antt.zip и подменить ActiveXGUID свойство в InitializeGanttObject (wnd_ProjectGanttAreaScript) далее возможно придется переписать некоторые функции работы с данным COM объктов, основные функции работы описаны в scr_ProjectGanttAreaUtils."

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

Для начала следует разобрать примеры, подключить только ActiveX объект и попытаться нарисовать с помощью компоненты ExG2antt необходимое отображение, для понимания в принципе работы. На данном этапе scr_ProjectGanttAreaUtils может служить в качестве примера работы с компонентой

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

Спасибо за полезную подсказку.

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

Основываясь на примере шкалы "Начало план" и "Завершение план", подумала, что анологично можно сделать и шкалу по фактическим данным.

Для этого сделала следующее:
sq_ProjectElements

Direct Elements (добавила "основная колонка")
-ActualStartDate
-ActualDueDate

Linked Elements (добавила "основная колонка")
-ActualStartDate
-ActualDueDate

(Скопировала dataset, для того чтобы вносить изменения)
ds_ProjectElementsTest добавила 2 поля "Поле дата/время"
-ActualStartDate
-ActualDueDate

в коде "scr_ProjectGantAreaUtilsTest" (тоже этот скрипт скопировала, для того чтобы вносить изменения) сразу изменила ds_ProjectElementsTest

function IsProjectExists(ProjectID) {
var ProjDataset = GetOpenedDatasetByUSIWithFilter('ds_ProjectElementsTest', 'ProjectID', ProjectID); // change on the ds_ProjectElementsTest (ds_ProjectElements)
return (!ProjDataset.IsEmptyPage);
}

wnd_ProjectGanttArea
-amiGotoActualDate

Разобрала как подключается ActiveX объект. Визуально изменила шкалу, которая показывает "Начало план, Завершение план". Нашла среднее между тем что нам нужно.

Но когда я начала работать с скриптом scr_ProjectGanttAreaUtilsTest, возникли проблемы. Я внесла измения в scr_ProjectGanttAreaUtilsTest, в приложении закоментировала, какие измения были внесены в коде, также изменила код wnd_ProjectGanttAreaScript. Но так и не добилась эффекта, который ожидала.
Возникает ошибка: "Ошибка выполнения метода 'dlDataOnDatasetAfterOpen'. 'ActualProjectBarName' is undefined «Call Stack»"

Что вы можете посоветовать, для реализации второй шкалы. Может, я что-то я не так делаю.

P.S. Нашла полезную ссылку, с которой работала (http://www.exontrol.com/content/products/exg2antt/help/Bars_Add.htm)

Здравствуйте Валентина,
Проверили скрипты,
"Ошибка выполнения метода 'dlDataOnDatasetAfterOpen'. 'ActualProjectBarName' is undefined «Call Stack»" воспроизвети не получилось, если ошибка еще воспроизводится у вас, предлагаю рассмотреть варианты передачи бэкапа вашей бд нам, для тестирования, или выгрузки всех сервисов конфигурации

Алексей, спасибо большое!
Я от Вас получила письмо, но оно пришло в спам.:sad:
Я Вам подробно отпишусь письмом.

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

Спасибо большое за помощь!
Все получилось, так как хотели :)

Решение , на базе компонента внедренного в коробочную версию Terrasoft

//-----------------------------------------------------------------------------
// wnd_ProjectGanttAreaScript
//-----------------------------------------------------------------------------

…………

AreaObject.RequiredFieldsArray = new Array(
'ActualStartDate','ActualDueDate',
'EstimatedStartDate', 'EstimatedDueDate', 'Deadline',
'CompletionPercent', 'IsPlanFixated',
'LockedByID', 'SortPath', 'CalendarID', 'IsProjectNeedToBeCalculated',
'Duration', 'IsElementNeedToBeCalculated', 'PlanningType',
'NearestParentID', 'HasChilds', 'StateColor', 'StateIsFinish');

……..

function AddGanttItem(Dataset) {
var Items = Gantt.Items;
var RecordID = Dataset.Values('ID');
var ParentID = Dataset.Values('ParentID');
var Item = 0;
var ValuesArray = GetItemValuesArray(Dataset);
if (ParentID) {
var SortPath = Dataset.Values('SortPath');
if (SortPath != AreaObject.PreviousSortPath) {
AreaObject.PreviousSortPath = SortPath;
AreaObject.CurrentParentItem = GetItemByID(ParentID);
}
if (AreaObject.CurrentParentItem != 0) {
Item = Items.InsertItem(AreaObject.CurrentParentItem, RecordID, ValuesArray);
} else {
Log.Write(1, FormatStr("Элемент ID = '%1'не был добавлен. Не существует родительская запись ParentID = '%2' или ошибка пути Path = '%3'",
RecordID, ParentID, Dataset.Values('Path')));
return 0;
}
} else {
Item = Items.AddItem(ValuesArray);
Gantt.Items.ItemData(Item) = RecordID;
var DisplayedProjectIDsArray = GetDisplayedProjectIDsArray();
AddItemToArray(DisplayedProjectIDsArray, RecordID);
CalculateMixAndMaxEstimatedDate(AreaObject, Dataset);
}
Gantt.Items.ItemForeColor(Item) =
GetTextColorForGridRowByDataset(Dataset);
var BackColor = GetBackgroundColorForGridRowByDataset(Dataset);
if (BackColor) {
Gantt.Items.ItemBackColor(Item) = BackColor;
}
CreateItemBarByBarKey(Dataset, Item, EstimatedBarKey,
Dataset('EstimatedStartDate'), Dataset('EstimatedDueDate'), true);
if ((!Dataset.DataFields('ActualStartDate').ValIsNull) && (!Dataset.DataFields('ActualDueDate').ValIsNull)) {
CreateItemBarByBarKey(Dataset, Item, ActualBarKey,
Dataset('ActualStartDate'), Dataset('ActualDueDate'), true);
}

if (!IsEmptyValue(Dataset('Deadline'))) {
CreateItemBarByBarKey(Dataset, Item, DeadlineBarKey,
Dataset('Deadline'), Dataset('Deadline'), true);
}
Gantt.Items.ItemBar(Item, EstimatedBarKey, exBarPercent) = Dataset('CompletionPercent') / 100;
return Item;
}

Пример работы:
1

Здравствуйте!
Возникла необходимость, сгруппировать проекты по определенному параметру. А именно, если состояние проекта, варьирует от 0 до 100%. Но группировать проекты в зависимости от показателя состояние, Группировка должна происходить постоянно.
Вот таким образом
[Название проекта] - 1%
[Название проекта] - 1%
[Название проекта] - 2%
[Название проекта] - 2%
[Название проекта] - 10%
[Название проекта] - 14%
[Название проекта] - 14%
[Название проекта] - 15%

Подскажите пожалуйста, каким методом сгруппировать проекты.
Я думаю, что нужно создать запрос в sq_Project. Но какой еще пока не могу понять.
Благодарю за помощь!

Здравствуйте, Валентина
Возможно, вы имеете в виду сортировку? Т.е задача с том, что бы отобразить в гриде записи по возрастанию колонки " Фактически завершено, %"

Да я имею в виду сортировку. Я попробовала в запросе sq_Project в поле CompletionPercent установила тип сортировки "По возростанию". Но не происходит сортировка. Хотелось чтобы при добавлении нового проекта автоматически происходила распределение проектов по полю "Фактически завершено, %".

Валентина, дело в том, что для раздела [Проекты] используется древовидный реестр и завязано много дополнительной функциональности именно которая перекрывает сортировку.

Если для Вас критично – сортировать проекты в реестре, то тогда Вам необходимо в Terrasoft Administrator скрипте scr_ProjectUtils закомментировать текст функции SetProjectDatasetSortOrder, как показано на скриншоте ниже, сохранить изменения и перезапустить систему:
1

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

Понятно, спасибо Вам. Я подумаю над этим, если возникнут вопросы, отпишусь.

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