Получение дерева с разузловкой

Автор oracle, 02.02.11, 13:31:51

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

oracle

Добрый день.
Пишу программу, часть работы которой заключается в получении дерева выделенного в Лоцмане объекта с полной разузловкой.
Я получаю дерево по связи "Состоит из ..." таким образом:

Objects: TClientDataSet;

Objects.Data := RunMethod('GetLinkedObjectsEx', [
                             ParentVersion.stType,
                             ParentVersion.stProduct,
                             ParentVersion.stVersion,
                             ParentVersion.inID,
                             'Состоит из ...',
                             False,
                             True,
                             False]);

где ParentVersion, выделенный в дереве объект.

Вроде все хорошо. Но пользователи говорят, что не все объекты получаются. Смотрю, и вижу, есть еще объекты привязанные по связи "Исполнения".
И тут по аналогии с предыдущим примером получаю объекты с разузловкой по связи "Исполнения" но ничего не получил. Т.к. у выделенного в Лоцмане объекта не прямых потомков по связи "Исполнения", то, я так понимаю, поэтому он и не получил ничего. Но есть вложенные объекты имеющие своих потомков по этой связи.

Поэтому я начал перебирать состав полученный мной в первом примере по состоянию "Состоит из ...". И смотрю по каждому объекту нет ли у него потомков по связи "Исполнения", если есть то у исполнений получаю потомков по связи "Состоит из ...".
Дальше вложенности уже не делаю. Т.е. рекурсию не делаю, т.к. исполнений у исполнения у нас пока нет))

А вопрос следующий. Все что я описал занимает кучу времени при получении объектов. Может можно сделать чтобы получение проходило быстрей? Как получить полную разузловку изделия?

Chaa

Можно попробовать получать объекты с помощью GetTree/GetTree2, тоже рекурсивно. Там можно сразу указать несколько связей, по которым должны возвращаться объекты, в виде
RunMethod('GetTree2', [ParentVersion.inID, 'Состоит из ...'#1'Исполнения', 0])

Jeff_Greg

procedure ExpandTree(inIDObj: integer; node: TTreeNode);
var
  vaErrCode, vaErrStr  : Variant;
  cdTemp, cdAttr        : TClientDataSet;
  mynode                  : TTreeNode;
begin
  cdTemp := TClientDataSet.Create(nil);
  cdTemp.Data := SocketConnectLoc.AppServer.GetTree2(
      inIDObj, 'Состоит из'#1'Документ', $00000000, vaErrCode, vaErrStr);
  if vaErrCode = 0 then
    begin
      if not cdTemp.IsEmpty then
        begin
          cdTemp.First;
          while not cdTemp.Eof do
            begin
              mynode := GeneralFrm.LocmanTree.Items.AddChildObject(
                  node, cdTemp.FieldByName('_PRODUCT').AsString, nil);
              mynode.SelectedIndex := ID;
              ExpandTree(cdTemp.FieldByName('_ID_VERSION').AsInteger, mynode);
              cdTemp.Next;
            end;
        end;
    end;
  cdTemp.Free;
end;

не подойдет?