Определение родителя в дереве

Здесь обсуждаем систему TDM/PDM/Workflow Lotsia PDM PLUS (PartY PLUS).
Аватара пользователя
Anderyt
Активный участник
Сообщения: 777
Зарегистрирован: 15 июл 2004, 13:15
Используемое ПО: Lotsia PDM PLUS
Откуда: Тюмень
Контактная информация:

Сообщение Anderyt »

про текущую ветку - это конечно хитро...
скорее всего, нужна какая то функция, которая будет обращать внимание на то, какая ветка открыта сейчас (то есть смотреть даже не совсем в БД, а в текущее открытое дереве на конкретном клиенте)..
99% - такой функции сейчас нет, чтобы сделать ее - все те же 99% нужно обращаться в techhelp@lotsia.com
но!!
а эти объекты Родитель 1 и Родитель 2 - одинаковых типов? может быть, их можно как то различить между собой?
или связи, например, по дате создания... а?
еще есть такая загадочная штука, как атрибуты ПРОЕКТА, то есть типа значение такого атрибута у определенного объекта зависит от того, в каком проекте мы смотрим на объект..
может быть, можно по этим атрибутам в действии поискать?..
лучше день потерять, потом за пять минут долететь!
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

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

>Anderyt
точно помню что сделать можно - и точно по открытому окну - но вот хоть убей не помню как :wink: :wink: но теххелп точно помогал

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

Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 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
Откуда: Украина, Донецк
Контактная информация:

Сообщение Юрий »

Можно использовать примерно такую функцию:

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

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
Эта функция определяет является ли объект @obj_id дочерним к @obj_id1.

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

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

да уж :wink: :wink: :wink:
а вот все таки интересно что ответил теххелп aw?

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

aw
Новый участник
Сообщения: 14
Зарегистрирован: 13 май 2008, 09:32

Сообщение aw »

Anderyt писал(а):про текущую ветку - это конечно хитро...
скорее всего, нужна какая то функция, которая будет обращать внимание на то, какая ветка открыта сейчас (то есть смотреть даже не совсем в БД, а в текущее открытое дереве на конкретном клиенте)..
99% - такой функции сейчас нет, чтобы сделать ее - все те же 99% нужно обращаться в techhelp@lotsia.com
но!!
Да такая функция нужна, мало того вообще нужны функции, отлавливающие выбор элемента в дереве.
Anderyt писал(а): а эти объекты Родитель 1 и Родитель 2 - одинаковых типов? может быть, их можно как то различить между собой?
они одинаковых типов, поблема в том, что если искать по базе у них один общий объект "потомок", то есть при поиске вверх всё равно найдётся 2 этих объекта. (пробовал, так и работает)
Anderyt писал(а): или связи, например, по дате создания... а?
не определяющий параметр, возможно что будут создавать когда кому нравиться. Ветку создали неделю назад, а допустим только сейчас выбрали и решили действие запустить.
Anderyt писал(а): еще есть такая загадочная штука, как атрибуты ПРОЕКТА, то есть типа значение такого атрибута у определенного объекта зависит от того, в каком проекте мы смотрим на объект..
может быть, можно по этим атрибутам в действии поискать?..
Проблема в том, что открытый проект будет всегда один :D , то есть значение таких атрибутов будет одинаково всегда.
[/quote]
aw
Новый участник
Сообщения: 14
Зарегистрирован: 13 май 2008, 09:32

Сообщение aw »

Александр писал(а):да уж :wink: :wink: :wink:
а вот все таки интересно что ответил теххелп aw?
теххелп ответил

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

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

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

немного не в тему :wink:
aw а вы не задумывались - почему ни у кого из участников форума, а это должен вам сказать очень- ну просто очень опытные администраторы Лоции - не возникало необходимости в данном действии

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

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

aw
Новый участник
Сообщения: 14
Зарегистрирован: 13 май 2008, 09:32

Сообщение aw »

Александр писал(а):немного не в тему :wink:
aw а вы не задумывались - почему ни у кого из участников форума, а это должен вам сказать очень- ну просто очень опытные администраторы Лоции - не возникало необходимости в данном действии

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

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

вот- вот в этом и проблема
если не видеть картину в целом и пытаться решить что-то что быть может не совсем верно было задано изначально - это конечно катастрофа :wink: :wink:

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

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

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

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

и все таки - оптимальным решением вашей проблемы будут адресные атрибуты (указатели/ссылки- как хотите) т.е. при создании нового объекта вы сразу добавляете атрибуты с адресом/сами родителя/родителей

я сначала тоже экономил атрибуты :wink: но база построена таким образом что количество атрибутов объекта - не влияет на быстродействие ( у нас у одного объекта может быть и 100 атрибутов), конечно при условии что вы не будете работать со всеми атрибутами сразу - а это крайне редкий случай
так что....
Последний раз редактировалось Александр 15 май 2008, 09:51, всего редактировалось 2 раза.

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

aw
Новый участник
Сообщения: 14
Зарегистрирован: 13 май 2008, 09:32

Сообщение aw »

Юрий писал(а):Можно использовать примерно такую функцию:

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

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
Эта функция определяет является ли объект @obj_id дочерним к @obj_id1.

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

Но функцию не получится применить к проблеме, так как структура данных такая, что все объекты-предки имеют множественное вхождение в другие, (для одного потомка будет несколько не только первичных предков, но и которые расположены на несколько уровней вверх),
поэтому можно только по визуальному отображению дерева определить корень.
aw
Новый участник
Сообщения: 14
Зарегистрирован: 13 май 2008, 09:32

Сообщение aw »

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

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

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

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

чтож - вопрос исчерпан :wink: :wink: Удачи

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

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

Сообщение Disillusioned »

50 вхождений - пустяки однако, и десятки тысяч не редкость...
На настоящий момент, определение родителя более чем на один уровень в открытой ветке (в общем случае), навряд ли будет возможно, т.к. сведения о том, какой проект открыт в текущем окне, недоступны.
На мой взгляд, с большей пользой можно потратить время на то, чтобы ориентировать интерфейс и бизнес-логику на работу "от родителя".
Ах и с ними невозможно
И без них никак нельзя
Ответить