Определение родителя в дереве
- Anderyt
- Активный участник
- Сообщения: 777
- Зарегистрирован: 15 июл 2004, 13:15
- Используемое ПО: Lotsia PDM PLUS
- Откуда: Тюмень
- Контактная информация:
про текущую ветку - это конечно хитро...
скорее всего, нужна какая то функция, которая будет обращать внимание на то, какая ветка открыта сейчас (то есть смотреть даже не совсем в БД, а в текущее открытое дереве на конкретном клиенте)..
99% - такой функции сейчас нет, чтобы сделать ее - все те же 99% нужно обращаться в techhelp@lotsia.com
но!!
а эти объекты Родитель 1 и Родитель 2 - одинаковых типов? может быть, их можно как то различить между собой?
или связи, например, по дате создания... а?
еще есть такая загадочная штука, как атрибуты ПРОЕКТА, то есть типа значение такого атрибута у определенного объекта зависит от того, в каком проекте мы смотрим на объект..
может быть, можно по этим атрибутам в действии поискать?..
скорее всего, нужна какая то функция, которая будет обращать внимание на то, какая ветка открыта сейчас (то есть смотреть даже не совсем в БД, а в текущее открытое дереве на конкретном клиенте)..
99% - такой функции сейчас нет, чтобы сделать ее - все те же 99% нужно обращаться в techhelp@lotsia.com
но!!
а эти объекты Родитель 1 и Родитель 2 - одинаковых типов? может быть, их можно как то различить между собой?
или связи, например, по дате создания... а?
еще есть такая загадочная штука, как атрибуты ПРОЕКТА, то есть типа значение такого атрибута у определенного объекта зависит от того, в каком проекте мы смотрим на объект..
может быть, можно по этим атрибутам в действии поискать?..
лучше день потерять, потом за пять минут долететь!
- Александр
- Активный участник
- Сообщения: 1658
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
может это поможет из старой переписки с техподдержкой
Можно использовать любую переменную. Вообще говоря a_TLinkID и LinkID_0 отличаются только тем, что первая в открытом дереве аутоматически считывает текущий код связи выделенного объекта (a_Object) с текущим родителем. Как a_Object, которая считывает текущий объект, так и a_TLinkID считывает текущий код связи a_Object...
Для корневого объекта a_TLinkID отсутствует.
Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
-
- Активный участник
- Сообщения: 239
- Зарегистрирован: 13 янв 2005, 14:30
- Используемое ПО: Lotsia PDM PLUS LT
- Откуда: Украина, Донецк
- Контактная информация:
Можно использовать примерно такую функцию:
Эта функция определяет является ли объект @obj_id дочерним к @obj_id1.
А вы можете ее поправить под свои нужды.
Код: Выделить всё
CREATE FUNCTION [dbo].[check_object_s]
(
@obj_id numeric(18,0),
@obj_id1 numeric(18,0)
)
RETURNS int
AS
BEGIN
declare @id table (id numeric(18,0) PRIMARY KEY NONCLUSTERED)
declare @id1 table (id numeric(18,0) PRIMARY KEY NONCLUSTERED)
insert into @id (id) values (@obj_id1)
while (select count(*) from LSDBO.tree_link tr1 right join @id tt on tr1.link_id=tt.id
where tr1.id is not null)>0
begin
delete from @id1
insert into @id1 (id) select id from @id
delete from @id
insert into @id (id) select distinct tr1.parent_id from LSDBO.tree_link tr1 right join @id1 tt on tr1.link_id=tt.id
where tr1.id is not null
if (select count(*) from @id where id=@obj_id)>0
begin
return 1
end
end
RETURN 0
END
А вы можете ее поправить под свои нужды.
Да такая функция нужна, мало того вообще нужны функции, отлавливающие выбор элемента в дереве.Anderyt писал(а):про текущую ветку - это конечно хитро...
скорее всего, нужна какая то функция, которая будет обращать внимание на то, какая ветка открыта сейчас (то есть смотреть даже не совсем в БД, а в текущее открытое дереве на конкретном клиенте)..
99% - такой функции сейчас нет, чтобы сделать ее - все те же 99% нужно обращаться в techhelp@lotsia.com
но!!
они одинаковых типов, поблема в том, что если искать по базе у них один общий объект "потомок", то есть при поиске вверх всё равно найдётся 2 этих объекта. (пробовал, так и работает)Anderyt писал(а): а эти объекты Родитель 1 и Родитель 2 - одинаковых типов? может быть, их можно как то различить между собой?
не определяющий параметр, возможно что будут создавать когда кому нравиться. Ветку создали неделю назад, а допустим только сейчас выбрали и решили действие запустить.Anderyt писал(а): или связи, например, по дате создания... а?
Проблема в том, что открытый проект будет всегда одинAnderyt писал(а): еще есть такая загадочная штука, как атрибуты ПРОЕКТА, то есть типа значение такого атрибута у определенного объекта зависит от того, в каком проекте мы смотрим на объект..
может быть, можно по этим атрибутам в действии поискать?..

[/quote]
теххелп ответилАлександр писал(а):да уж![]()
![]()
![]()
а вот все таки интересно что ответил теххелп aw?
Код: Выделить всё
Действием над объектом родителя первого уровня в данной ветке найдете как родительский объект связи a_TLinkID. Это будет родитель именно в текущей ветке.
Если далее множественной входимости нет - идете вверх,до искомого объекта: Судя по картинке - он вполне конкретного типа, используя f_ExecSQLSelect_3 ищете родителей, проверяете, - если это не тот тип циклически повторяете от найденного родителя, если тип тот - выходите из цикла. Примерно так, в общих чертах...
Если множественная входимость встречается и выше, и ее нельзя исключить, например, анализируя типы родителей и атрибуты - такой подход невозможен.
[\code]
- Александр
- Активный участник
- Сообщения: 1658
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
немного не в тему
aw а вы не задумывались - почему ни у кого из участников форума, а это должен вам сказать очень- ну просто очень опытные администраторы Лоции - не возникало необходимости в данном действии
мой совет - если вы в начале внедрения -продумайте структуру данных - пока этих данных не стало слишком много - и не привязывайтесь к дереву которое вы видите на экране - работайте в масштабах всех базы сразу

aw а вы не задумывались - почему ни у кого из участников форума, а это должен вам сказать очень- ну просто очень опытные администраторы Лоции - не возникало необходимости в данном действии
мой совет - если вы в начале внедрения -продумайте структуру данных - пока этих данных не стало слишком много - и не привязывайтесь к дереву которое вы видите на экране - работайте в масштабах всех базы сразу
Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
Спасибо за советАлександр писал(а):немного не в тему![]()
aw а вы не задумывались - почему ни у кого из участников форума, а это должен вам сказать очень- ну просто очень опытные администраторы Лоции - не возникало необходимости в данном действии
мой совет - если в в начале внедрения -продумайте структуру данных - пока этих данных не стало слишком много - и не привязывайтесь к дереву которое вы видите на экране - работайте в масштабах всех базы сразу

Задачи и структуру внедрения придумываю не я

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


но Лоция тем и хороша - что в любой безвыходной ситуации можно выкрутиться - добавив пару атрибутов и еще чего нибудь

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
- Александр
- Активный участник
- Сообщения: 1658
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
и все таки - оптимальным решением вашей проблемы будут адресные атрибуты (указатели/ссылки- как хотите) т.е. при создании нового объекта вы сразу добавляете атрибуты с адресом/сами родителя/родителей
я сначала тоже экономил атрибуты
но база построена таким образом что количество атрибутов объекта - не влияет на быстродействие ( у нас у одного объекта может быть и 100 атрибутов), конечно при условии что вы не будете работать со всеми атрибутами сразу - а это крайне редкий случай
так что....
я сначала тоже экономил атрибуты

так что....
Последний раз редактировалось Александр 15 май 2008, 09:51, всего редактировалось 2 раза.
Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
Хорошая функция. Как раз она пригодится при проверке вхождения одного объекта в другой, если они не связаны напрямую (нет прямого линка с одного объекта на другой).Юрий писал(а):Можно использовать примерно такую функцию:Эта функция определяет является ли объект @obj_id дочерним к @obj_id1.Код: Выделить всё
CREATE FUNCTION [dbo].[check_object_s] ( @obj_id numeric(18,0), @obj_id1 numeric(18,0) ) RETURNS int AS BEGIN declare @id table (id numeric(18,0) PRIMARY KEY NONCLUSTERED) declare @id1 table (id numeric(18,0) PRIMARY KEY NONCLUSTERED) insert into @id (id) values (@obj_id1) while (select count(*) from LSDBO.tree_link tr1 right join @id tt on tr1.link_id=tt.id where tr1.id is not null)>0 begin delete from @id1 insert into @id1 (id) select id from @id delete from @id insert into @id (id) select distinct tr1.parent_id from LSDBO.tree_link tr1 right join @id1 tt on tr1.link_id=tt.id where tr1.id is not null if (select count(*) from @id where id=@obj_id)>0 begin return 1 end end RETURN 0 END
А вы можете ее поправить под свои нужды.
К сожалению, в условиях отбора при настройке параметров переменной, производится поиск только по прямому линку между объектами.

Но функцию не получится применить к проблеме, так как структура данных такая, что все объекты-предки имеют множественное вхождение в другие, (для одного потомка будет несколько не только первичных предков, но и которые расположены на несколько уровней вверх),
поэтому можно только по визуальному отображению дерева определить корень.
Это можно и скриптом определитьАлександр писал(а):и все таки - оптимальным решением вашей проблемы будут адресные атрибуты (указатели/ссылки- как хотите) т.е. при создании нового объекта вы сразу добавляете атрибуты с адресом/сами родителя/родителей

Структура данных такая, что все объекты-предки имеют множественное вхождение в другие, (для одного потомка будет несколько не только первичных предков, но и которые расположены на несколько уровней вверх). Однозначно определить в таком случае для одного потомка одного предка не возможно.
Не вариант. Не ясно сколько добавлять в объект атрибутов. Сейчас исходя из рабочей базы есть объекты с входимостью больше 50 в другие объекты... и это не предел.Александр писал(а): я сначала тоже экономил атрибутыно база построена таким образом что количество атрибутов объекта - не влияет на быстродействие, конечно при условии что вы не будете работать со всеми атрибутами сразу - а это крайне редкий случай
так что....
К тому же база уже создана и рабочая, пересобирать всю базу с добавлением этих атрибутов достаточно долго и трудоёмко.

- Disillusioned
- Активный участник
- Сообщения: 420
- Зарегистрирован: 15 июл 2004, 15:12
- Используемое ПО: Lotsia PDM PLUS
- Откуда: Подольск
- Контактная информация:
50 вхождений - пустяки однако, и десятки тысяч не редкость...
На настоящий момент, определение родителя более чем на один уровень в открытой ветке (в общем случае), навряд ли будет возможно, т.к. сведения о том, какой проект открыт в текущем окне, недоступны.
На мой взгляд, с большей пользой можно потратить время на то, чтобы ориентировать интерфейс и бизнес-логику на работу "от родителя".
На настоящий момент, определение родителя более чем на один уровень в открытой ветке (в общем случае), навряд ли будет возможно, т.к. сведения о том, какой проект открыт в текущем окне, недоступны.
На мой взгляд, с большей пользой можно потратить время на то, чтобы ориентировать интерфейс и бизнес-логику на работу "от родителя".
Ах и с ними невозможно
И без них никак нельзя
И без них никак нельзя