Тема: Сортировка "корневых" объектов

Имеется дерево объектов с элементами различных типов.
Правильно ли я понимаю, что сортировка этих элементов в корне дерева по типам и внутри типов по алфавиту
В ПРИНЦИПЕ НЕ ВОЗМОЖНА?
Это применимо как для версии 2.ххх так и для 3.ххх?

(изменено: Anatoly, 13 июня 2007г. 10:26:33)

Re: Сортировка "корневых" объектов

Burbon пишет:

Имеется дерево объектов с элементами различных типов.
Правильно ли я понимаю, что сортировка этих элементов в корне дерева по типам и внутри типов по алфавиту
В ПРИНЦИПЕ НЕ ВОЗМОЖНА?
Это применимо как для версии 2.ххх так и для 3.ххх?

Нет, Вы понимаете неправильно. Сортировать можно как в 2-й версии, так и в 3-й.

В 2-й версии у колекции TDMSObject есть свойство Order.
Для 3-й версии есть даже отдельная тема по сортировке (методы Move и Swap).
https://tdmsforum.ru/topic52.html

P.S. Сортировка в дереве ничем не отличается от сортировки в составе.

(изменено: Burbon, 13 июня 2007г. 12:04:50)

Re: Сортировка "корневых" объектов

Anatoly пишет:

Нет, Вы понимаете неправильно. Сортировать можно как в 2-й версии, так и в 3-й.

Так. Чудесно! Про 3.ххх пока отложим в сторону...

В 2-й версии у колекции TDMSObject есть свойство Order.
...
P.S. Сортировка в дереве ничем не отличается от сортировки в составе.

Разговор о версии 2.хх:
1. У элемента "Объекты" (ROOT_DEF) имеется только "Состав" и "Команды". Непонятно, как описать скрипт сортировки, который должен выполняться при создании состава элемента "Объекты", т.е. по событию а не по команде.


2. Пытаемся протестировать эту технологию сортировки на другом (не корневом) объекте.
При использовании скрипта следующего содержания:

' Задаём массив из типов объектов, в последовательености сортировки
ObjectArray = Array ("OBJECT_CONTENT", "OBJECT_COMPLEX", "OBJECT_COMPLEX_PART", "OBJECT_CIRCUIT", "OBJECT_DEPARTMENT")
' Вызов функции сортировки. Первый параметр - объект, состав которого будет сортировать
Call SortObjects(ThisObject, ObjectArray)

Sub SortObjects(Obj, ObjArray)
        Obj.Permissions = SysAdminPermissions
        OrderNum = Obj.Objects(0).Order
       
        For i = LBound(ObjArray) to UBound(ObjArray)
                For Each Object in Obj.Objects.ObjectsByDef(ObjArray(i))
                        Obj.Objects(Object).Order = OrderNum
                        OrderNum = OrderNum + 1
                Next
        Next
End Sub

получаем следующий порядок сортировки:
А. Разнотипные объекты группируются по своим типам
Б. Любой добавляемый объект из ПЕРВОЙ группы занимает вторую строчку в своей группе.
В. Любой добавляемый объект из ВТОРОЙ группы занимает ПЕРВУЮ строку в Своей группе

В чем специфика данного скрипта, что мы получаем столь обескураживающие результаты?

Re: Сортировка "корневых" объектов

Burbon пишет:

Разговор о версии 2.хх:
1. У элемента "Объекты" (ROOT_DEF) имеется только "Состав" и "Команды". Непонятно, как описать скрипт сортировки, который должен выполняться при создании состава элемента "Объекты", т.е. по событию а не по команде.

Скрипт сортировки надо писать в какой-нить объект, а потом через sql перегонять его в root. К сожалению, в 2-й версии по-другому сделать нельзя.

2. Пытаемся протестировать эту технологию сортировки на другом (не корневом) объекте.
При использовании скрипта следующего содержания:
...
получаем следующий порядок сортировки:
А. Разнотипные объекты группируются по своим типам
Б. Любой добавляемый объект из ПЕРВОЙ группы занимает вторую строчку в своей группе.
В. Любой добавляемый объект из ВТОРОЙ группы занимает ПЕРВУЮ строку в Своей группе
В чем специфика данного скрипта, что мы получаем столь обескураживающие результаты?

Данный скрипт сортирует по типам объектов - разве нет? Ошибки я не увидел.

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

Re: Сортировка "корневых" объектов

Какой тогда выход?

Как получить сортировку объектов находящихся в корне дерева? (Для версии 2.ххх).

Re: Сортировка "корневых" объектов

Сортиорвка в ROOT в принципе возможна и она

Anatoly пишет:

ничем не отличается от сортировки в составе.

Обращение к коллекции корневых объектов происходит через TDMSApplication.Root.Objects.
Вопрос другой: в каком месте и в какой момент выполнять этот скрипт. Вариантов тут тоже несколько:
1. повесить команду на ROOT, доступную ответственным за сортировку лицам.
2. скрипт в обработчике событий "Object_Created(Obj, Parent)" на создаваемом в руте объекте.
3. 1+2
4. может можно прикрутить скрипт еще к чему нибудь... но пока других мыслей нет.
5. Вариант, предложенный Anatoly с переносом события через SQL. Но я бы лично не рекомендовал руками копашиться в БД без полного осознания своих действий и их последствий.
6. поставить 3.0, там все гораздо проще.  :)

Re: Сортировка "корневых" объектов

Еще 1 способ сортировки корневых объектов - организация дерева объектов через выборки.  :)

Re: Сортировка "корневых" объектов

я на грани нервного срыва, а Вам шуточки...  :)

А я ожидал предложения добавить еще один уровень и сортировать уже не корневые объекты, а дочерние.

(изменено: Anatoly, 13 июня 2007г. 17:43:26)

Re: Сортировка "корневых" объектов

Если все постинги собрать, то получится:

1. У элемента "Объекты" (ROOT_DEF) имеется только "Состав" и "Команды". Непонятно, как описать скрипт сортировки, который должен выполняться при создании состава элемента "Объекты", т.е. по событию а не по команде.

Вам дали ответ:
Возможно 2-мя способами:
1. Вариант с переносом события через SQL.
2. Создание события "Object_Created(Obj, Parent)". Зная Parent, мы можем сортировать, как захотим.

2. Пытаемся протестировать эту технологию сортировки на другом (не корневом) объекте.
При использовании скрипта следующего содержания:

тут следует мой скрипт, представляющий ПРИМЕР сортировки.

получаем следующий порядок сортировки:
А. Разнотипные объекты группируются по своим типам
Б. Любой добавляемый объект из ПЕРВОЙ группы занимает вторую строчку в своей группе.
В. Любой добавляемый объект из ВТОРОЙ группы занимает ПЕРВУЮ строку в Своей группе
В чем специфика данного скрипта, что мы получаем столь обескураживающие результаты?

Насколько я понял, Вас не устраивает результат, т.к. сортируется только по типу объекта. А Вам необходима сортировка еще по некоторым условиям (к примеру: атрибутам, дате создания, дате модификации и т.д.)

Вам дали ответ: необходимо дописать скрипт.

P.S. добавлять еще один уровень - неправильное решение.

Re: Сортировка "корневых" объектов

Так вариант с выборками гораздо лучше создания еще одного типа информационного объекта, только для сортировки.
соответственно если у Вас в ROOT несколько разных типов объектов и есть необходимость их сортировать, то наиболее верный путь - это формирование дерева через выборки.
При этом гораздо удобнее настроить сортировку. Не надо писать доп. скриптов. условия сортировки указываются в выборке.

Единственное, что корневые объекты надо будет создавать не в руте, а непосредственно в справочнике через TDMSApplication.ObjectDefs().CreateObject

(изменено: Anatoly, 13 июня 2007г. 17:52:00)

Re: Сортировка "корневых" объектов

Mishaf пишет:

При этом гораздо удобнее настроить сортировку. Не надо писать доп. скриптов. условия сортировки указываются в выборке.

Зато надо писать Команду по созданию объектов, либо опять же изменять событие Object_Created.
Я не видел Вашу настройку, поэтому четко ответил на поставленный вопрос - как сделать сортировку, используя события.

Re: Сортировка "корневых" объектов

Да... забыл добавить к своему предыдущему посту, что количество выборок в руте должо соответствовать количеству типов инф. объектов, которые можно там создавать, и количеству команд, навешанных на рут.

Команда создания нового объекта в справочнике займет около 5-6 строчек.

' Создание нового объекта
Set NewObject = ThisApplication.ObjectDefs("OBJECT_PROJECT").CreateObject
Set EditObjDlg = ThisApplication.Dialogs.EditObjectDlg
EditObjDlg.Object = NewObject

If EditObjDlg.Show = False Then
   NewObject.Erase
End If

(изменено: Anatoly, 13 июня 2007г. 18:02:15)

Re: Сортировка "корневых" объектов

Mishaf пишет:

Команда создания нового объекта в справочнике займет около 5-6 строчек.

Да, и еще надо не забыть про права доступа, которые надо изменить на Root, дабы не давать пользователям возможность удалять выборки.
И еще надо проанализировать события объекта, чтобы случайно не натолкнуться на parent, которого не будет у объекта в выборке.

А вот команду сортировки можно будет применить еще и для других объектов, невходящих в root... а вот выборки только для root  :)

Re: Сортировка "корневых" объектов

Anatoly пишет:

Зато надо писать Команду по созданию объектов, либо опять же изменять событие Object_Created.
Я не видел Вашу настройку, поэтому четко ответил на поставленный вопрос - как сделать сортировку, используя события.

Команда по созданию объектов "в воздухе" занимает 5-6 строчек простейшего кода. Она одинакова для всех корневых объектов. так что ее можно просто размножить изменив только SysID типа создаваемого объекта. + можно на эту команду навесить доп. проверки.
Скрипт сортировки гораздо сложней (больше 5-6 строчек) и тяжелей. Интересно сколько он будет отрабатывать по времени, если в составе скопится больше сотни объектов. А это реальная ситуация.

Выборка отработает быстрее, условия сортировки - любые, выдаваемые значения (столбцы) настраиваемые.
Это лично мое мнение, с  ним можно согласиться, можно опровергнуть, но я бы сделал именно так в этом случае.

(изменено: Mishaf, 13 июня 2007г. 22:02:09)

Re: Сортировка "корневых" объектов

Anatoly пишет:

Да, и еще надо не забыть про права доступа, которые надо изменить на Root, дабы не давать пользователям возможность удалять выборки.

Выборки конечно же надо делать системными, которые может удалить только сисадмин. + ограничить права на редактирование состава рута, т.к. его уже не надо будет редактировать.

Anatoly пишет:

И еще надо проанализировать события объекта, чтобы случайно не натолкнуться на parent, которого не будет у объекта в выборке.

Да согласен. Более того скоее всего придется еще скриптом навесить первоначальные права на создаваемый объект. Это тоже около 5-6 строчек простейшего кода.

Anatoly пишет:

А вот команду сортировки можно будет применить еще и для других объектов, невходящих в root... а вот выборки только для root  :)

Да согласен. Но необходимо определиться, что лучше подходит в данном конкретном случае. Оценить сложность, время реализации решения и решаемые им задачи. Зачем писать сложный, тяжелый скрипт, если можно обойтись простым, быстрым решением.  ;)

Если сортировка нужна везде, то наверное скрипт будет лучше. Хотя если сортировка нужна по типам, тем более в корне, то быстрее будет отрабатывать выборка с условиями сортировки. в остальных местах, где состав не очень большой, без скрипта не обойтись.

Re: Сортировка "корневых" объектов

Итого:
1. Решили остановиться на скриптах. Выборки -- черезчур заумно...
2. Что: объекты из коллекции TDMSApplication.Root.Objects
3. Когда: по событию Object_Created
4. Дополнительный критерий сортировки: Шифр объекта

Надеюсь, будет результат...

(изменено: Mishaf, 19 июня 2007г. 13:09:03)

Re: Сортировка "корневых" объектов

Есть решение по сортировке объектов и выборок в составе любого объекта, в том числе и ROOT.
На даный момент работает только для версии 3.0.
подробнее тут: https://tdmsforum.ru/topic74.html