Как построить свое дерево объектов на интерфейсе wf

Здесь обсуждаем систему TDM/PDM/Workflow Lotsia PDM PLUS (PartY PLUS).
Ответить
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Как построить свое дерево объектов на интерфейсе wf

Сообщение Александр »

Всем привет - кто нибудь делал такое?
(не знаю может сейчас это уже в базовом функционале)
короче нужно просто - слева дерево с узлами справа список и чекбокс использовать дочерние или нет + фильтр на все про все

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Как построить свое дерево объектов на интерфейсе wf

Сообщение Александр »

можно слева строковый массив запустить с рекурсивным запросом и отступами (формата: id_объекта, id_родителя, наименование_объекта)
справа запрос на дочерние элементы левого списка (1го уровня или всех) (формата: id_родителя, составное наименование_объекта)
обновлять правый список при переходе к другой строке в левом...
с этим нет вопросов
...
а вот как сделать чтобы слева узел можно было закрыть раскрыть... красиво?
типа слева добавить колонку с чекбоксами - но непонятно как модифицировать основной запрос для дерева
вот этот запрос для примера (MSSQL2005) (это текст для 1С))), есть такой же для Лоции - у меня просто идет интеграция разных БД (на платформе Лоции) для работы с прайсами)

Код: Выделить всё

WITH Rec (id, pid, title,level, list)
 AS (
   SELECT tb1._IDRRef as id, 
              tb1._ParentIDRRef as pid, 
              tb1._Description as title, 
              0, 
              cast(tb1._Description as nvarchar(max))  
     FROM dbo._Reference79 as tb1
    where tb1._Folder = 0 
             and 
             tb1._ParentIDRRef=0 --  id корневого родителя
 UNION ALL
   SELECT tb2._IDRRef as id, 
              tb2._ParentIDRRef as pid, 
              tb2._Description as title, 
              Rec.level+1, 
              cast(Rec.list + '/' + tb2._Description as nvarchar(max))  
     FROM dbo._Reference79 as tb2 inner join Rec 
              on Rec.id = tb2._ParentIDRRef and tb2._Folder = 0 
   )

 SELECT id, 
        pid, 
        space( level *4) + title--,
        --level,   --уровень вложенности
        --list      --составное наименование для сортировки
   FROM Rec
--where level<=2
ORDER BY list 
--OPTION(MAXRECURSION 0);

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

os_cherepanova
Новый участник
Сообщения: 23
Зарегистрирован: 19 сен 2011, 15:35
Используемое ПО: Lotsia PDM PLUS
Откуда: Воронеж

Re: Как построить свое дерево объектов на интерфейсе wf

Сообщение os_cherepanova »

Мы в подобной ситуации не нашли решения лучше, чем полностью перерисовывать массив:

Т.е. по изменению значения переменной-чекбокса удаляем все элементы массива, у которых некоторое значение не подходит (в вашем случае - удалить элементы с опредёленным pid) , в случае развёртывания - запрашиваем из бд все объекты, у которых pid=заданному id и добавляем их в массив в соответствующее место и перерисовываем массив.
У нас, правда, это не кнопка разворачивания, а кнопка "показать аннулированные элементы", так что ей не особенно часто пользуются.

PS: Пробовали играть с видимостью элементов и настройкой ширины строк - получается не красиво.
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Как построить свое дерево объектов на интерфейсе wf

Сообщение Александр »

os_cherepanova - сриншот не выложите дерева?... сюда - посмотреть как у вас получилось
ps
если кнопка узла идет отдельной колонкой, а дерево построено с отступами - вроде не красиво
а если кнопку узла двигать с отступами...
в общем пока не понятно

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

os_cherepanova
Новый участник
Сообщения: 23
Зарегистрирован: 19 сен 2011, 15:35
Используемое ПО: Lotsia PDM PLUS
Откуда: Воронеж

Re: Как построить свое дерево объектов на интерфейсе wf

Сообщение os_cherepanova »

Кнопку и иконку у нас с отступами двигать не получилось. Без иконок точно получилось бы симпатичнее, но у нас все привыкли по иконкам ориентироваться.
Так что красоты нет особой.
Изображение

Для примера попробовала сделать деревце без иконок, только с галочками - так поприличнее смотрится.
Изображение
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Как построить свое дерево объектов на интерфейсе wf

Сообщение Александр »

спасиб - смотрю...
а у нас вот пока так получается
tree1.gif
tree1.gif (8.08 КБ) 26667 просмотров
глубину списка используем в сдвиге по левому краю (X)
иконки узла - переменная тип строка (использовать как рисунок) + событие на нажатие с изменением рисунка по xor
и наименование узла
но из за использовать как рисунок - массив этот еле шевелится на прокрукту хотя всего ~1000 строк
вот думаем на счет быстродействия - пока нет идей

ps
смотрели с чекбоксами и с кнопками - но напрягает что при нажатии на них 'перемигивается' вся колонка с чекбоксами/кнопками - некрасиво

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Как построить свое дерево объектов на интерфейсе wf

Сообщение Александр »

вот в итоге пришли к текстовому изображению узла +/- подложили под него пустую текстовую рамку с тенью
tree2.gif
tree2.gif (70.85 КБ) 26660 просмотров
все ок, не тормозит

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

os_cherepanova
Новый участник
Сообщения: 23
Зарегистрирован: 19 сен 2011, 15:35
Используемое ПО: Lotsia PDM PLUS
Откуда: Воронеж

Re: Как построить свое дерево объектов на интерфейсе wf

Сообщение os_cherepanova »

Александр, с отступами и плюсами получилось шикарно. Надо будет сдвиг взять на заметку.
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Как построить свое дерево объектов на интерфейсе wf

Сообщение Александр »

ну и сам код нажатия на иконку узла (чисто скрипты)) vbscript)
'+' добавить дочерние элементы первого уровня
'-' удалить все дочерние элементы узла

Код: Выделить всё

'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
'событие на нажатие иконки узла дерева
'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Sub SelectActionsModePriceTree
  Dim Count, tmp, Str, i, Node, sql
  Dim a1, a2, a3, a4, arr, cSize, nSize, cLevel

    Count = cInt(LsJob.GetVarValue(" CurrentLineFrmTreePrice "))                        ' загрузить текущую строку массива
    a1 = LsJob.GetVarValue("tPriceLevel")
    cLevel = cInt(a1(Count-1))
    a2 = LsJob.GetVarValue("tPriceMode")
    a3 = LsJob.GetVarValue("tPriceId")
    a4 = LsJob.GetVarValue("tPriceName")
    cSize = UBound(a1)
 
    Select Case  cStr(a2(Count-1)) 
      Case "+"                                                           ' добавить дочерние элементы первого уровня
        a2(Count - 1) = "-"                                           ' поставить отметку что текущий узел открыт
        If DataBase.ADODB_Connected Then           ' если подключиться удалось работаем иначе нет
          If DataBase.ADODB_RecordSet Then         ' если удалось создать recordset тоже работаем 
            sql = "select level as tPriceLevel, '+' as tPriceMode, master.dbo.fn_varbintohexstr(id) as tPriceId, Description as tPriceName from  LSDBO.Ric_1C_Get_objChild(" & CStr(a3(Count - 1)) & ",0,0)"
            If DataBase.OpenRecordSet(sql) Then       ' прочитать данные из базы
              arr = rs.GetRows                                        ' рекордсет в массив
              rs.Close
              nSize = UBound(arr, 2)
              cSize = (cSize + 1) + (nSize + 1) - 1

              ReDim Preserve a1(cSize)                         ' изменить размерность массивов на новую группу дочерних элементов
              ReDim Preserve a2(cSize)                         ' изменить размерность массивов на новую группу дочерних элементов
              ReDim Preserve a3(cSize)                         ' изменить размерность массивов на новую группу дочерних элементов
              ReDim Preserve a4(cSize)                         ' изменить размерность массивов на новую группу дочерних элементов
              
              For i = 0 To cSize - nSize - Count - 1          ' переместить часть массива в конец начиная с текущей позиции+1
                a1(cSize - i) = a1(cSize - nSize - 1 - i)
                a2(cSize - i) = a2(cSize - nSize - 1 - i)
                a3(cSize - i) = a3(cSize - nSize - 1 - i)
                a4(cSize - i) = a4(cSize - nSize - 1 - i)
              Next
              
              For i = 0 To nSize                                        ' заполнить дырку данными из запроса
                a1(Count + i) = arr(0, i) + cLevel + 1
                a2(Count + i) = arr(1, i)
                a3(Count + i) = arr(2, i)
                a4(Count + i) = arr(3, i)
              Next
            End If

            Set rs = Nothing                                             ' убъем рекордсет
            Set cn = Nothing                                            ' убить объект соединения с базой
          End If
        End if

      Case "-"                                                               ' удалить дочерние элементы всех уровней
        a2(Count - 1) = "+"                                             ' поставить отметку что текущий узел закрыт
        nSize=0            
        For i=Count to cSize                                           ' подсчитать количество дочерних элементов
          if a1(i)<=a1(Count-1) Then 
            Exit For
          Else
            nSize=nSize+1
          End If
        Next 

        If nSize>0 then                                                    ' если есть дочерние элементы - удалить их
          cSize = cSize - nSize 
          For i = 0 To cSize - Count                                 ' переместить часть массива из конца в начало с текущей позиции+1
            a1(Count + i) = a1(Count + nSize + i)
            a2(Count + i) = a2(Count + nSize + i)
            a3(Count + i) = a3(Count + nSize + i)
            a4(Count + i) = a4(Count + nSize + i)
          Next
                 
          ReDim Preserve a1(cSize)                               ' изменить размерность массивов на новую группу дочерних элементов
          ReDim Preserve a2(cSize)                               ' изменить размерность массивов на новую группу дочерних элементов
          ReDim Preserve a3(cSize)                               ' изменить размерность массивов на новую группу дочерних элементов
          ReDim Preserve a4(cSize)                               ' изменить размерность массивов на новую группу дочерних элементов

        End If
    End Select     

    LsJob.SetVarValue "tPriceLevel", a1
    LsJob.SetVarValue "tPriceMode", a2
    LsJob.SetVarValue "tPriceId", a3
    LsJob.SetVarValue "tPriceName", a4
 
End Sub
и чуть чуть Лоции для обновления данных на форме

Код: Выделить всё

f_FormArrayToData ( this , 'frmPriceTree')
эт массив содержащий 4 массива("tPriceLevel", "tPriceMode","tPriceId","tPriceName")
ps
ограничения (хотя вроде многие так и ограничивают, и скорость выше и кода меньше)
- состояния дочерних узлов при переоткрытии не запоминаются
- при открытии открываем только первый уровень
pps
вообще - круто получилось! :wink: :wink:

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Ответить