Функция автоматической расстановки связей Проекта во вложенных элементах

Добрый вечер.
Задача , которую сейчас решаю: необходимо сделать возможным автоматическую замену связей во вложенных элементах Проекта. Можно считать, что уровень вложенности работ в проект только 1. Т.е. у меня есть Проект, я захожу в него, заполняю поля Клиент, Контакт, Поставщик, Продажа. Потом, стоя на этом проекте, выбираю в меню действия созданное мной действие "Расставить связи в проекте".
После этого срабатывает скрипт:

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');
     
    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 необходимых мне связей, скрипт завершается без ошибки, выдается сообщение, что связи успешно проставлены, но связи не расставляются.
Где же искать ошибку?

Нравится

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

Может я и глупость сморожу, но разве 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;
}

Виктория, рад, что проблема решилась.

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