Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 298

Воссоздать иерархию по таблице

15.08.2024, 19:37. Показов 1125. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые профессионалы!
Вынужден обратиться за помощью, потому что моих скилов явно здесь не хватает.
Есть иерархическая таблица
Название: table.jpg
Просмотров: 163

Размер: 11.6 Кб
где id - это элемент, а pid - это подчиненный элемент.
Есть treeview. Задача банальная - как бы так пройтись по этой таблице, чтобы воссоздать эту иерархию? Должно получиться вот это:
Название: иерархия.jpg
Просмотров: 163

Размер: 4.2 Кб
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.08.2024, 19:37
Ответы с готовыми решениями:

Воссоздать программу по коду
Помогите пожалуйста воссодать программу по коду usingSystem; using System.Collections.Generic; using System.ComponentModel; using...

Воссоздать игровой компьютер
Вообщем господа-товарищи форумные ребята Бюджет 50к Нужно собрать игровой компудахтер. SSD вся фигня.

Деление - воссоздать в коде (2*(x*x*x)-11*(x*x)+12*x+9)/(x-3)
Нужно написать прогу чтобы решить кубическое уравнение. Я хочу знать как воссоздать в коде деление вроде: ...

12
Модератор
 Аватар для D1973
9926 / 6463 / 2457
Регистрация: 21.01.2014
Сообщений: 27,419
Записей в блоге: 3
16.08.2024, 05:36
А почему так? Проще же наоборот, от ствола к листьям идти, для каждого элемента указывать его родителя. Тогда алгоритм элементарный получается:
1. Строим "ствол" (0-й уровень), выбирая элементы, у которых ID родителя = NULL
2. Обходим в цикле все элементы полученного "ствола", выбирая для каждого элемента ветви (элементы, для которых ID родителя = ID текущей ноды). Так строим уровень 1
3. Повторяем пункт 2 до тех пор, пока запросы возвращают какие-либо элементы.

А как по Вашему представлению иерархию строить - что-то даже и не пойму... Задом наперед все...
1
 Аватар для Beltar
831 / 445 / 39
Регистрация: 05.05.2022
Сообщений: 3,075
16.08.2024, 07:50
Чет я не понял. Почему id повторяются?

Я делал сохранение дерева в бинарник и загрузку из него в 1 проход с помощью стека, но чтобы алгоритм был нормальный надо организацию данных сначала правильную сделать.
1
1 / 1 / 0
Регистрация: 07.09.2021
Сообщений: 105
16.08.2024, 09:01
Цитата Сообщение от Beltar Посмотреть сообщение
Чет я не понял. Почему id повторяются?
Ну такое возможно в случае если id это не ключевой элемент. Судя по таблице, ключевое поле самое первое. Так что у двух одинаковых элементов в поле id буду разные ключевые значения.
1
Модератор
 Аватар для D1973
9926 / 6463 / 2457
Регистрация: 21.01.2014
Сообщений: 27,419
Записей в блоге: 3
16.08.2024, 09:20
Цитата Сообщение от esgard Посмотреть сообщение
Судя по таблице, ключевое поле самое первое.
Это не ключевое поле. Это вообще не поле. Это, так сказать, Row ID, нумерация записей табличного представления данных в какой-то оболочке для работы с БД.
1
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
16.08.2024, 19:01
Цитата Сообщение от t232006 Посмотреть сообщение
где id - это элемент, а pid - это подчиненный элемент.
Судя по представленным данным как раз все наоборот. pid - это родительский элемент, а id - это дочерний. Не может дочерний элемент иметь индекс меньше родительского.
1
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 298
16.08.2024, 23:52  [ТС]
Цитата Сообщение от Пытливый Посмотреть сообщение
Судя по представленным данным как раз все наоборот. pid - это родительский элемент, а id - это дочерний. Не может дочерний элемент иметь индекс меньше родительского.
да нет, там индексы не значат ничего. Это просто цифры. Четвертый отдел состоит из шестого, пятого и первого. В этом смысле.
0
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 298
17.08.2024, 17:14  [ТС]
я решил эту задачу. Получилось громоздко, непонятно, но работает. Если кому-то такая задача когда-нибудь понадобится, то пользуйтесь.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
procedure TForm3.FormShow(Sender: TObject);
var
  rec:                    Trec;
  curid, curlvl, maxN, m: shortint;
  k:                      ^shortint;
 
  procedure readstring;
  begin
    with DataModule2.tree do
    begin
      rec.id := fields[0].AsInteger;
      rec.pid := fields[1].AsInteger;  
      delete;
    end;
  end;
 
  procedure searchInTable(id: shortint);
  begin
    while DataModule2.tree.fields[0].AsInteger <> id do
      DataModule2.tree.next;
    readstring;
  end;
 
  function searchInTree(id: shortint): shortint;
  var
    kk: shortint;
  begin
    for result := 0 to tv.Items.Count - 1 do                                 //<--tv - это treeview
    begin
      kk := shortint(tv.Items.Item[result].Data^);
      if kk = id then
        exit;
    end;
    result := -1;
  end;
 
  procedure readstr(id: shortint; n: shortint);
  var
    m: shortint;
  begin
    searchInTable(id);
    new(k);
    k^ := rec.id;
    tv.Items.AddChildObject(tv.Items.Item[n], inttostr(id), k);
 
    if rec.pid <> 0 then
    begin
      m := searchInTree(rec.pid);
      if m = -1 then
        readstr(rec.pid, n + 1)
      else
        readstr(rec.pid, m);
    end
  end;
 
begin
  DataModule2.copyTree.ExecSQL;
  with DataModule2.tree do
  begin
    active := false;
    active := true;
    first;
    readstring;
    new(k);
    k^ := rec.id;
    tv.Items.AddObject(nil, inttostr(rec.id), k);
    while RecordCount > 0 do
    begin
      first;
      m := searchInTree(rec.id);
      if m = -1 then
        readstr(rec.pid, 0)
      else
        readstr(rec.pid, m);
      first;
      if RecordCount > 0 then
        readstring;
    end;
 
  end;
end;
Данный код конструирует иерархию по таблице. Кроме того, сохраняет id строки, чтобы, щелкая на пункт, можно было бы получить всю информацию по этому объекту.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
17.08.2024, 19:39
это TreeView или VirtualTreeView ?
все эти new() как-то слегка режут глаз
0
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 298
17.08.2024, 20:28  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
все эти new() как-то слегка режут глаз
нет, это treeview. Я не претендую на единственно правильное решение, но treeview может хранить объект, для этого предусмотрены методы компонента, где нежен указатель на объект. Ну вот я и решил, что id записи можно как раз хранить как указатель.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
18.08.2024, 09:09
как раз к ID записи у меня нет особых вопросов
а вот к использованию Record - есть
очень немного сейчас аргументов можно найти в пользу использования Record
при этом синтаксис с крышечками сильно раздут и неудобен

при динамическом создании объектов классы гораздо удобнее
и зачем хранить указатель на ID, по которому надо искать данные объекта, если можно хранить указатель на сам объект?

ну и цикл - каждый раз крутить весь датасет при поиске с начала до конца немного избыточно
если организовать хранение как словарь объектов, то поиск на больших данных будет быстрее
если дерево очень большое, то хранение каждой ветки с детьми нужно организовывать в отдельный список, а списки - в словарь по ID ветки
1
 Аватар для Beltar
831 / 445 / 39
Регистрация: 05.05.2022
Сообщений: 3,075
18.08.2024, 13:53
Цитата Сообщение от krapotkin Посмотреть сообщение
при этом синтаксис с крышечками сильно раздут и неудобен
Крышечки можно пропускать, Delphi понимает, что речь об указателях.
0
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 298
18.08.2024, 19:03  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
и зачем хранить указатель на ID, по которому надо искать данные объекта, если можно хранить указатель на сам объект?
да, согласен, так было бы лучше. Почему так не сделал? Да с указателем просто пробовал и сразу же получился рабочий вариант - не стал менять.
Цитата Сообщение от krapotkin Посмотреть сообщение
если организовать хранение как словарь объектов, то поиск на больших данных будет быстрее
Да, это хорошая мысль.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.08.2024, 19:03
Помогаю со студенческими работами здесь

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

Возможно ли воссоздать данную программу?
Доброго времени суток. Скажите пожалуйста, возможно ли скомпилировать данную программу? Очень срочно( Заранее спасибо! Код программы

Воссоздать бинарное изображение по матрице
У меня имеется двумерный массив заданного размера заполненный 0/1 как воссоздать по ней бинарное изображение

Необходимо воссоздать программу из ворда
все коды есть и пару скринов, но нет самой программы. помогите восстановить.

Как воссоздать звуковой белый шум?
Здравствуйте! Пишу прогу для генерации белого шума. Имеется диапазон от 50 до 5 000 Гц. Программа выдаёт изначально частоту в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru