Функция автоматической расстановки связей Проекта во вложенных элементах
Добрый вечер.
Задача , которую сейчас решаю: необходимо сделать возможным автоматическую замену связей во вложенных элементах Проекта. Можно считать, что уровень вложенности работ в проект только 1. Т.е. у меня есть Проект, я захожу в него, заполняю поля Клиент, Контакт, Поставщик, Продажа. Потом, стоя на этом проекте, выбираю в меню действия созданное мной действие "Расставить связи в проекте".
После этого срабатывает скрипт:
var ProjectID = null;
if (BaseWorkspace.GridDataset.IsActive) {
ProjectID = BaseWorkspace.GridDataset.Values('ID');
}
if (ProjectID) {
ProcessRelations(ProjectID);
ShowInformationDialog("Расставлены связи во всех вложенных элементах");
} else {
ShowWarningDialog("Проект не выбран");
}
}
function ProcessRelations(ProjectID, ProjectDataset) {
var Relations = new Object();
Relations.Opportunity = new Object();
Relations.ObjectOpportunity = new Object();
Relations.Client = new Object();
Relations.Contact = new Object();
Relations.Supplier = new Object();
if (!Assigned(ProjectDataset)) {
ProjectDataset = GetSingleItemByCode('ds_Project', 'ProcessRelations');
ApplyDatasetFilter(ProjectDataset, 'ID', ProjectID, true);
RefreshDataset(ProjectDataset);
}
Relations.Opportunity = ProjectDataset.ValAsGUID('OpportunityID') ;
Relations.ObjectOpportunity = ProjectDataset.ValAsGUID('object_projectID');
Relations.Client = ProjectDataset.ValAsGUID('ClientID');
Relations.Contact = ProjectDataset.ValAsGUID('ContactID');
Relations.Supplier = ProjectDataset.ValAsGUID('SupplierID');
ProjectDataset.DisableEvents();
if (!Assigned(ChildDataset)) {
var ChildDataset = GetSingleItemByCode('ds_Project', 'ProcessRelations');
ApplyDatasetFilter(ChildDataset, 'ParentID', ProjectID, true);
}
ChildDataset.Open();
ChildDataset.Edit();
try {
while (!ChildDataset.IsEOF) {
ChildDataset.Values('OpportunityID') = Relations.Opportunity;
ChildDataset.Values('object_projectID') = Relations.ObjectOpportunity;
ChildDataset.Values('ClientID') = Relations.Client;
ChildDataset.Values('ContactID') = Relations.Contact;
ChildDataset.Values('SupplierID') = Relations.Supplier;
ChildDataset.Post();
ChildDataset.GotoNext();
}
} finally {
ChildDataset.Close();
ApplyDatasetFilter(ChildDataset, 'ParentID', null, false);
ChildDataset.EnableEvents();
}
return true;
}
У меня получается правильно определить все ID необходимых мне связей, скрипт завершается без ошибки, выдается сообщение, что связи успешно проставлены, но связи не расставляются.
Где же искать ошибку?
Нравится
Может я и глупость сморожу, но разве ChildDataset.Edit(); не должен стоять под while?
И зачем try? Наверное, из-за него и не выводит ошибку.
Убрала try, с замиранием сердца :smile: ожидала ошибку, но увы ее нет.
Ничего не написали про результат, видимо отрицательный.
А ChildDataset.Edit(); остался на своем месте? Задаю этот вопрос потому что в вашем случаи у меня выдавал ошибку если подчиненных несколько (либо вы его переставили, либо только один подчиненный)
Но и в том, и в другом случаи я не вижу причину почему не работает.
Наверное, надо пошагово через дебагер смотреть.
ChildDataset.Edit(); переставила.
И не ошибки, ни результата заполнения.
Пока думала над указанной выше задачей, написала функцию , которая в выбранном проекте расставляет крайние сроки во вложенных элементах. Надо было сделать так, чтобы к дате завершения каждой работы прибавлялся один день, и сохранятся в поле Крайний срок этой работы.
Так вот эта фукнция работает на ура!
function ProcessDeadline(ProjectID, ProjectDataset) { var ChildDataset = GetSingleItemByCode('ds_Project', 'ProcessRelations'); ApplyDatasetFilter(ChildDataset, 'ParentID', ProjectID, true); ChildDataset.Open(); try { while (!ChildDataset.IsEOF) { ChildDataset.Edit(); var DueDate = ChildDataset.DataFields.ItemsByName('EstimatedDueDate').ValAsDateTime; var NewDate= new Date(DueDate); var Deadline = AddDateDays(NewDate, 1).getVarDate(); ChildDataset.Values('Deadline') = Deadline; ChildDataset.Post(); ChildDataset.GotoNext(); } } finally { ChildDataset.Close(); ApplyDatasetFilter(ChildDataset, 'ParentID', null, false); ChildDataset.EnableEvents(); } return true; }
Повторюсь, не знаю причин, по которым не отрабатывается.
Можно упростить код и обойтись без этих посредников:
var Relations = new Object(); Relations.Opportunity = new Object(); Relations.ObjectOpportunity = new Object(); Relations.Client = new Object(); Relations.Contact = new Object(); Relations.Supplier = new Object();
И писать на прямую
ChildDataset.Values('OpportunityID') = ProjectDataset.Values('OpportunityID'); //и т.д.
Но опять же советую, пошагово в дебагере посмотреть, что происходит.
Так на мой взгляд будет дольше работать скрипт, особенно если там 25 работ вложенных.
Я бы хотела сначала из проекта получить все необходимые мне связи, а потом присваивать эти значения в необходимом месте.
У вас может и не отрабатываться, потому, что object_projectID это мое поле.
И поверьте, никуда, кроме отладчика я не смотрю, однако же ошибку там найти не получается.
Виктория, в отладчике после строки
ChildDataset.Values('OpportunityID') = Relations.Opportunity;
проверьте, что записано в ChildDataset.Values('OpportunityID').
Будет хотя бы ясно, где именно проблема.
Нашла в чем проблема. В отсутствии строки ApplyDatasetFilter(ProjectDataset, 'ID', null, false);
Окончательный вариант
function amiProcessRelationsOnExecute(ActionMenuItem, Sender) { var ProjectID = null; if (BaseWorkspace.GridDataset.IsActive) { ProjectID = BaseWorkspace.GridDataset.Values('ID'); } if (ProjectID) { ProcessRelations(ProjectID); ShowInformationDialog("Расставлены связи во всех вложенных элементах"); } else { ShowWarningDialog("Проект не выбран"); } } function ProcessRelations(ProjectID, ProjectDataset) { var Relations = new Object(); Relations.Opportunity = new Object(); Relations.ObjectOpportunity = new Object(); Relations.Client = new Object(); Relations.Contact = new Object(); Relations.Supplier = new Object(); if (!Assigned(ProjectDataset)) { ProjectDataset = GetSingleItemByCode('ds_Project', 'ProcessRelations'); ApplyDatasetFilter(ProjectDataset, 'ID', ProjectID, true); RefreshDataset(ProjectDataset); } Relations.Opportunity = ProjectDataset.ValAsGUID('OpportunityID') ; Relations.ObjectOpportunity = ProjectDataset.ValAsGUID('object_projectID'); Relations.Client = ProjectDataset.ValAsGUID('ClientID'); Relations.Contact = ProjectDataset.ValAsGUID('ContactID'); Relations.Supplier = ProjectDataset.ValAsGUID('SupplierID'); ApplyDatasetFilter(ProjectDataset, 'ID', null, false); if (!Assigned(ChildDataset)) { var ChildDataset = GetSingleItemByCode('ds_Project', 'ProcessRelations'); ApplyDatasetFilter(ChildDataset, 'ParentID', ProjectID, true); } ChildDataset.Open(); try { while (!ChildDataset.IsEOF) { ChildDataset.Edit(); ChildDataset.Values('OpportunityID') = Relations.Opportunity; ChildDataset.Values('object_projectID') = Relations.ObjectOpportunity; ChildDataset.Values('ClientID') = Relations.Client; ChildDataset.Values('ContactID') = Relations.Contact; ChildDataset.Values('SupplierID') = Relations.Supplier; ChildDataset.Post(); ChildDataset.GotoNext(); } } finally { ChildDataset.Close(); ApplyDatasetFilter(ChildDataset, 'ParentID', null, false); ChildDataset.EnableEvents(); } return true; }