Официальный форум российского программного комплекса T-FLEX PLM


Поиск  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
DOCs, событие "Изменение связи"
 
Всем доброго времени суток, перейдем сразу к делу:
Допустим у вас есть справочник, а в данном справочнике есть родительский объект и дочерний, при этом к обоим объектам можно подключать другие объекты со связью "на любой справочник", мы пишем с вами довольно простой макрос, чтобы объекты подключенные по такой связи к дочернему объекту, автоматически подключались к родительскому объекту. Все что я написал это так скажем начальные условия, теперь же возникает другая задача, которую и требуется разрешить, предположим, что нужно отключить через дочерний объект эти ранее подключенные объекты по связи "на любой справочник" да таким образом что бы и в родительском объекте они отключились тоже, каким способом можно это решить?
Хотелось бы это решить с помощью стандартной команды "Отключить", но такой способ я так понимаю возможен только если подключать макрос к событию "Изменение связи", однако в таком случае не будет работать первый макрос, потому что в первом макросе тоже изменяется связь с тем же наименованием. А отдельную кнопку делать и писать на неё макрос по которому будут отключаться объекты не хочется. Можно каким либо образом запускать макрос при выполнении конкретной команды "Отключить"?

Старался проблему расписать наиболее доходчиво, но если, что - готов разъяснить более доходчиво, не прикладываю никаких макросов, потому что это общий случай и я уже е в первый раз встречаюсь с подобной вещью.
 
Не до конца понял в чем проблема... Очень путает фраза: "предположим, что нужно отключить через дочерний объект эти ранее подключенные объекты по связи "на любой справочник". Имеется ввиду, что при подключении нового объекта имеющийся должен отключаться?
Какая задача решается? Нужно, чтобы к родительскому объекту были подключены все объекты дочерних объектов? Тогда я бы попробовал макрос "вешать" на сохранение объекта. Проверять, есть ли у сохраняемого объекта родитель, удалять у родителя все объекты по заданной связи, собирать у всех дочерних объектов все подключенные объекты по заданной связи, и подключать их к родителю.
Главное - спокойствие!
 
Да вы правильно поняли, что нужно чтобы к родительскому объекту подключались все объекты подключенные по связи дочерних объектов, но так же чтобы и работал обратный процесс при отключении этих объектов. В принципе я с вами согласен - ваш вариант действительно будет работать (насчет того чтобы "вешать" макрос на сохранение объекта) уверен даже, потому что так я уже пробовал делать, только вот тогда возникает проблема с быстродействием, такое решение получается не оптимальным, быстродействие такого решения очень сильно зависит от количества подключенных объектов...

Есть конечно вариант сделать через кнопку, то есть зайти через "Управление справочниками", там настроить диалог в дочернем объекте и повесить там на кнопку макрос, который будет отключать объекты и в дочернем, и в родительском объектах - по быстродействию это будет быстрее (не нужно прочесывать кучу уже подключенных объектов, а можно напрямую находить в родительском - например по параметру), но тогда нужно заморачиваться с диалогом, полностью его настраивать (что не всегда удобно, т.к. могут использоваться диалоги по умолчанию)

Интересует же все таки возможность добраться до уже существующих "команд", причем в данном частном случае - это команда "Отключить", просто интересно есть ли такая возможность в DOCs?
 
Если один и тот же объект не может связываться с несколькими дочерними объектами, то вариант через
Цитата
passsan написал:
макрос, который будет отключать объекты и в дочернем, и в родительском объектах
и будет самым правильным.
Можно обойтись без кнопки (повесить на сохранение объекта) - так будет гораздо удобнее конечным пользователям. Но потребуется доработка - в начале редактирования дочернего объекта сделать копию всех прикрепленных объектов по данной связи в предварительно созданную еще одну связь, а при сохранении сравнивать два списка объектов. И, соответственно, к родительскому объекту либо прикреплять новые объекты, либо откреплять старые.
В упомянутом выше случае, когда один и тот же объект может быть прикреплен к разным дочерним объектам, нужно будет дополнительно проверять наличие удаляемого объекта у других дочерних.
Изменено: Валерий Степаненко - 14.09.2015 16:54:08
Главное - спокойствие!
 
О! Точно! спасибо за идею, Валерий, попробую сделать со сравнением списков, думаю должно все получиться, обязательно отпишусь как получу какие-нибудь результаты и макрос приложу тогда уж...
 
Делал я значит делал этот супер пупер макрос и вот что получилось, косячки наверняка есть, однако все работает на УРА:

Код
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using TFlex.DOCs.Model.Macros;
using TFlex.DOCs.Model.Macros.ObjectModel;

public class Macro : MacroProvider
{
    public Macro(MacroContext context)
        : base(context)
    {
        bool test = false;
        Объект работа = ТекущийОбъект;
        Объект обраб = null;
        Объекты объектыработы = работа.СвязанныеОбъекты["Связь с объектом"];
        Объекты тестработы = работа.СвязанныеОбъекты["Список объектов для сравнения"];
        int i=0, j=0, c=0;
        foreach( Объект тест_раб in тестработы)
            {
            i++;
            }
        foreach( Объект об_раб in объектыработы)
            {
             j++;
            }
       
        string[] список = new string[i] , список2= new string[j];
        
        if (i<=j) c=j; 
        else c=i;
        
        bool[] ok = new bool[c];
        
        for (int ax=0; ax<c; ax++)
            {
            ok[ax]=false;
            }
        i=0; 
        j=0;
         
        if (работа.РодительскийОбъект == null) 
            {
            Сообщение ("Ошибка", "Не найден проект"); 
            return;
            }
        else
            {    
            Объект род_проект = работа.РодительскийОбъект; 
            род_проект.Изменить();  
            Объекты объектырод = род_проект.СвязанныеОбъекты["Связь с объектом"];
            Объекты Дочобъекты = род_проект.ДочерниеОбъекты;
            int kol=0, mk=0, at=0;
            Объекты дочобсписка = null;
            foreach (Объект дочоб in Дочобъекты)
                {
                if(дочоб.ToString()!=работа.ToString())
                    {
                дочобсписка = дочоб.СвязанныеОбъекты["Связь с объектом"];
                mk=at;
                at=0;
 
                foreach(Объект дочобсп in дочобсписка)
                {    
                at++;
                }
                   if(at>mk) mk=at;
                kol++;
               // Сообщение ("", "mk-"+mk.ToString()+" at-"+at.ToString()+" kol-"+kol.ToString());
                }
                }
            string[,] список3 = new string[mk,kol];
            kol=0; 
       
               дочобсписка =null;
            foreach (Объект дочоб in Дочобъекты)
                {
                if(дочоб.ToString()!=работа.ToString()) 
                    {
                дочобсписка = дочоб.СвязанныеОбъекты["Связь с объектом"];
                int m=0;
                foreach(Объект дочобсп in дочобсписка)
                {    
                   if (m<mk){
                   список3[m,kol]= дочобсп.Параметр["Наименование"];
                   m++; 
                    }
                   }
                kol++;
                }
                }
             //   Сообщение ("", mk.ToString()+" "+kol.ToString());
          /* for (int n=0; n<kol; n++)
                for (int l=0; l<mk; l++)
                    {
                Сообщение ("", список3[l,n]+" "+l.ToString()+" "+n.ToString());
            } */
            
            if (объектыработы == null) return;
            if (тестработы != null) 
                {
                foreach( Объект тест_раб in тестработы)
                    {
                    список[i]=тест_раб.Параметр["Наименование"];
                    i++;                      
                    }
                foreach(Объект об_раб in объектыработы)
                    {
                    список2[j] = об_раб.Параметр["Наименование"];
                    j++;
                    }
                for(int a=0; a<i; a++)
                    {
                for(int b=0; b<j; b++)
                    {
                          if (список[a]==список2[b]) 
                           {
                           ok[a] = true;
                           }
                    }
            }    
        
        int d=0, f=0;
        foreach( Объект об_раб in объектыработы)
            {
                род_проект.Подключить("Связь с объектом", об_раб);               
            }
      
        foreach( Объект тест_раб in тестработы)
            {
   
              for(int az1=0; az1<c; az1++)
              { 
                if(az1<i)                  
                if((тест_раб.Параметр["Наименование"]==список[az1])&&(ok[az1] == false))
                  {
                test = false;    
                    for (int n=0; n<kol; n++)
                      for (int l=0; l<mk; l++)
                             {
                              if(тест_раб.Параметр["Наименование"]==список3[l,n]) test = true;
                             }
                  if (test == false) род_проект.Отключить("Связь с объектом", тест_раб);     
        
                }
              }
            }
          // Сообщение ("Оповещение", "Повтор - "+test.ToString());
        }
        else
            {
           foreach( Объект об_раб in объектыработы)
            {
               род_проект.Подключить("Связь с объектом", об_раб);
            }
        }
        род_проект.Сохранить();
        }               
    }
}
 
Нормальный такой объемчик... :shock:
И ежели работает - замечательно! :applanse:
Главное - спокойствие!
 
хочу заметить что тут вариант описан когда одни и те же объекты могут находиться в разных дочерних объектах, а удаляется из родителя только в том случае если нигде не повторяется
 
Насколько я понял - надо просто синхронизировать список связанных объектов родителя со списком всех дочерних объектов.
Т.е. на изменение связи можно поставить макрос

if (работа.РодительскийОбъект == null)
{
Сообщение ("Ошибка", "Не найден проект");
return;
}
List<Объект> дочерние_объекты = new List<Объект>();
foreach(var дочь in работа.РодительскийОбъект.ДочерниеОбъекты)
{
дочерние_объекты.Add(дочь.СвязанныеОбъекты["Связь с объектом"]);
}

foreach(var очереднойОбъект in работа.РодительскийОбъект.СвязанныеОбъекты["Связь с объектом"])
{
if (дочерние_объекты.Contains(очереднойОбъект))
дочерние_объекты.Remove(очереднойОбъект);
else
работа.РодительскийОбъект.Отключить("Связь с объектом", очереднойОбъект);
}

foreach(var очереднойОбъект in дочерние_объекты)
{
работа.РодительскийОбъект.Подключить("Связь с объектом", очереднойОбъект);
}

Если я правильно понял. Быстро и сердито...
Вижу...
Страницы: 1