![]() |
![]() |
![]() |
|
Как построить дерево... | ☑ | ||
---|---|---|---|---|
0
kosts
31.07.08
✎
12:26
|
ПолеВвода1 = "ВЫБРАТЬ
Операции1.Ссылка КАК Ссылка1, Операции.Ссылка КАК Ссылка ИЗ (ВЫБРАТЬ Операции.Ссылка КАК Ссылка ИЗ Справочник.Операции КАК Операции ГДЕ Операции.Проект = &ВыбранныйПроект) КАК Операции1 ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Операции КАК Операции ПО Операции.Этап = Операции1.Ссылка ГДЕ Операции.Проект = &ВыбранныйПроект ИТОГИ ПО Ссылка1 ИЕРАРХИЯ, Ссылка ИЕРАРХИЯ"; Текст = ПолеВвода1; Запрос.Текст = Текст; Запрос.УстановитьПараметр("ВыбранныйПроект", ВыбранныйПроект); Дерево3 = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); ЭлементыФормы.Дерево3.СоздатьКолонки(); Так дерево строится, но только до второго уровня. Справочник Операции сам по себе одноуровневый, но в поле Этап записывается предок. Как проще всего построить дерево с произвольным количеством "подуровней"? |
|||
1
Mitriy
31.07.08
✎
12:29
|
в коде, обходом по выборке
|
|||
2
kosts
31.07.08
✎
12:33
|
(1) Думал над этим, сейчас застрял на том, как отсортировать выборку, что бы дерево строилось за один проход, но не идет что-то...
Проблема в том что не вижу способа отсортировать выборку в порядке их вывода в дерево... |
|||
3
hhhh
31.07.08
✎
12:35
|
ОбходРезультатаЗапроса.ПоГруппировкамСИерархией
|
|||
4
kosts
31.07.08
✎
12:37
|
(3) Результат тот же.
|
|||
5
Mitriy
31.07.08
✎
12:43
|
если справочник не иерархический, тогда чо-нить вроде этого, имхо:
"ВЫБРАТЬ Операции.Этап КАК Этап, Операции.Ссылка КАК Операция ИЗ Справочник.Операции КАК Операции КАК Операции ГДЕ Операции.Проект = &ВыбранныйПроект УПОРЯДОЧИТЬ ПО Этап, Операция ИТОГИ ПО Этап АВТОУПОРЯДОЧИВАНИЕ"; |
|||
6
kosts
31.07.08
✎
12:58
|
(5) Если так, то сперва выводятся элементы первого уровня, потом второго и тд.
Подумаю, поможет ли это... |
|||
7
kosts
31.07.08
✎
13:48
|
Может кто предсказать, если использовать отдельный справочник для хранения уровней
Т.е. справочник Операции (Наименование) справочник Связи (Операция, Вышестоящая операция) Можно ли по простому построить дерево в таком случае? |
|||
8
kosts
31.07.08
✎
15:41
|
(6)
Думал выводятся по уровням, однако, выводятся не по уровням. А то уже нашел нормальное решение, а дерево кривое получилось :-) |
|||
9
Косой
31.07.08
✎
15:48
|
Древесные справочники спокон веку делались так:
ID, Parent, Name, ... всё это хозяйство епстественно в одной таблице(справочнике:)) |
|||
10
kosts
31.07.08
✎
15:51
|
(9) Ну я так и сделал. Хочу добиться, что бы затем по простому построить дерево за один проход, а сейчас этого не получается...
из-за того, что в запросе строки идут в беспорядке... |
|||
11
kosts
31.07.08
✎
16:04
|
Сейчас вот так
ПолеВвода1 = "ВЫБРАТЬ |Операции.Ссылка КАК Операция, |Операции.Этап КАК ВышестоящаяОперация, |1 как НПП |ИЗ |Справочник.Операции КАК Операции |ГДЕ |Операции.Проект = &ВыбранныйПроект |ИТОГИ ПО | ВышестоящаяОперация |АВТОУПОРЯДОЧИВАНИЕ"; Дерево2.Строки.Очистить(); Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.Прямой); Строки = Дерево2; ст = Новый Соответствие; Пока Выборка.Следующий() цикл // Хотели воспользоваться тем, что подчиненные элементы будет в выборке позже вышестоящего Операция = Выборка.Операция; ВышестоящаяОперация = Выборка.ВышестоящаяОперация; узел = ст.Получить(ВышестоящаяОперация); Если узел = Неопределено тогда узел = Строки; КонецЕсли; Строка = узел.Строки.Добавить(); Строка.Операция = Операция; Строка.ВышестоящаяОперация = ВышестоящаяОперация; Если Операция <> null тогда ст.Вставить(Операция, Строка); КонецЕсли; КонецЦикла; В определенных местах дерево рвет. |
|||
12
Mitriy
31.07.08
✎
16:11
|
ВыборкаВышестоящаяОрганизация = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
..... Пока ВыборкаВышестоящаяОрганизация.Следующий() Цикл ..... ВыборкаОперация = ВыборкаВышестоящаяОрганизация.Выбрать(); Пока ВыборкаВышестоящаяОрганизация.Следующий() Цикл ....... КонецЦикла; КонецЦикла; |
|||
13
Mitriy
31.07.08
✎
16:12
|
(12)* млин...
Пока ВыборкаВышестоящаяОрганизация.Следующий() Цикл ..... ВыборкаОперация = ВыборкаВышестоящаяОрганизация.Выбрать(); Пока ВЫБОРКАОПЕРАЦИЯ.Следующий() Цикл ....... КонецЦикла; КонецЦикла; |
|||
14
kosts
31.07.08
✎
16:15
|
(12) Это не работает, т.к. в запросе не формируются корректные группировки.
Работает, только если заранее известно количество группировок, например, для запроса из (0) |
|||
15
kosts
31.07.08
✎
16:16
|
(13) Да я понял
|
|||
16
Mitriy
31.07.08
✎
16:16
|
(14) ты пробовал?
|
|||
17
kosts
31.07.08
✎
16:18
|
(16) Первоначально с этого и начинал. Для этого варианта проблема в том, что не могу составить запрос чтобы запрос сам корректно сгруппировал данные ...
|
|||
18
Mitriy
31.07.08
✎
16:22
|
(17) чего-то я не понимаю... ты хочешь, у тебя вложенность больше, чем 2?
|
|||
19
Mitriy
31.07.08
✎
16:23
|
(18)* без "ты хочешь"...
|
|||
20
kosts
31.07.08
✎
16:24
|
(19) Количество уровней неопределено.
|
|||
21
Mitriy
31.07.08
✎
16:36
|
тады ой... тут уже думать надо...
|
|||
22
Новиков
31.07.08
✎
17:20
|
>>Как проще всего построить дерево с произвольным количеством "подуровней"?
Я не особо понял, что городиться ниже этого вопроса, но на процитированный вопрос отвечу. Я пришел к мысли (хз правильной ли), что кароче всего код при выводе произвольного кол-ва уровней - рекурсивная процедура. рыба примерно такая: ДЗ = запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией) Для каждого ТекСтр Из ДЗ.Строки Цикл ПостроитьДерево(ТекСтр,0); КонецЦикла; В построить дерево пишешь цикл, который смотрит какие-то твои условия. Если енто группа, иерархия или хз что тебе надо - продолжаешь вызов этой процедуры с уровнем +1, када дошел до конца - выводишь свои листики. Я делаю всегда так - код получается очень коротким. А то что ты там сортировать вздумал - я не особо втыкнул :) |
|||
23
Mitriy
31.07.08
✎
17:26
|
(22) ну дык почитал бы сначала...
|
|||
24
Новиков
31.07.08
✎
17:28
|
ну дык почитал :) Как сам делаю - написал. Про сортировку я не понял.
|
|||
25
Mitriy
31.07.08
✎
17:29
|
(24) ну дык не только про сортировку не понял, почитай еще :)
|
|||
26
himch
01.08.08
✎
10:05
|
// Решение для Табличной части и Дерева значений.
// Загрузка из ТЧ в ДеревоЗначений Перем НомерСтрокиТЧ; Функция ДобавитьСтрокуИзТЧ(РодительскаяСтрокаТабличногоПоля,СтрокаТЧ) НоваяСтрока=РодительскаяСтрокаТабличногоПоля.Строки.Добавить(); КопироватьТЧ(НоваяСтрока,СтрокаТЧ); НоваяСтрока.СтрокаРодитель=СтрокаТЧ.СтрокаРодитель; НоваяСтрока.НомерСтроки=НомерСтрокиТЧ; НомерСтрокиТЧ=НомерСтрокиТЧ+1; Возврат НоваяСтрока; КонецФункции Процедура СчитыватьСтрокиИзТЧ(РодительскаяСтрокаТабличногоПоля, ТекущийРодительТЧ) Пока НомерСтрокиТЧ<=Операции.Количество() Цикл СтрокаТЧ=Операции[НомерСтрокиТЧ-1]; Если СтрокаТЧ.СтрокаРодитель=ТекущийРодительТЧ Тогда НоваяСтрока=ДобавитьСтрокуИзТЧ(РодительскаяСтрокаТабличногоПоля,СтрокаТЧ); Иначе Если СтрокаТЧ.СтрокаРодитель<ТекущийРодительТЧ Тогда Возврат; Иначе СчитыватьСтрокиИзТЧ(НоваяСтрока, СтрокаТЧ.СтрокаРодитель); КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры Функция СоздатьДЗ() // тут создаем само дерево значений КЧ = Новый КвалификаторыЧисла(10,0); Массив = Новый Массив; Массив.Добавить(Тип("Число")); ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, КЧ); ТП = Новый ДеревоЗначений; ТП.Колонки.Добавить("СтрокаРодитель",ОписаниеТиповЧ,"СтрокаРодитель"); ТП.Колонки.Добавить("НомерСтроки",ОписаниеТиповЧ,"НомерСтроки"); // и так далее.. Возврат ТП; КонецФункции Процедура ТабличноеПолеЗагрузитьИзТЧ(ТП) Экспорт ТП=СоздатьДЗ(); НомерСтрокиТЧ=1; СчитыватьСтрокиИзТЧ(ТП, 0); КонецПроцедуры // Сохрание из ДереваЗначений в ТЧ Функция ДобавитьСтрокуВТЧ(ТЧ, СтрокаТЧ,НомерСтрокиРодителя) НоваяСтрока=ТЧ.Добавить(); КопироватьТЧ(НоваяСтрока,СтрокаТЧ); НоваяСтрока.СтрокаРодитель=НомерСтрокиРодителя; Возврат НоваяСтрока; КонецФункции Процедура ЗаписатьСтрокиВТЧ(ТЧ, КорневаяСтрока, НомерСтрокиРодителя) Для каждого СтрокаТЧ из КорневаяСтрока.Строки Цикл НоваяСтрока=ДобавитьСтрокуВТЧ(СтрокаТЧ,НомерСтрокиРодителя); Если СтрокаТЧ.Строки.Количество()<>0 Тогда ЗаписатьСтрокиВТЧ(ТЧ,СтрокаТЧ,НоваяСтрока.НомерСтроки); КонецЕсли; КонецЦикла; КонецПроцедуры Процедура ТабличноеПолеИнформацииСохранитьВТЧ(ТЧ) ТЧ.Очистить(); ЗаписатьСтрокиВТЧ(ТЧ,ТабличноеПолеИнформации,0) КонецПроцедуры |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |