Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
22 / 4 / 1
Регистрация: 25.03.2012
Сообщений: 199
RAD XE3+

Вывод данных с базы данных в TreeView

01.06.2022, 20:35. Показов 1572. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу помочь с выводом данных, с большим разветвлением, в TreeView
Перепробовал многие варианты, и все не то.
Привожу 2 фото. Одно, это исходник, как должна выглядеть TreeView
Второе фото, таблица из SQL, для понимания как сохранены данные в БД.
Вот ее схема:
(@id int,
@NashaKompaniua_id int,
@TipDogovora_id int,
@SrokDeistviua_id int,
@NameRazdela nchar(200),
@NomerRazdela nchar(10),
@Text_Razdela text,
@id_ImageIndex int)
Вот один из многих вариантов, не верный.
Дерево прорисовывается не правильно. Не могу правильно вывести детей
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
procedure TForm_TransLog.N47Click(Sender: TObject);
var
  tip_id,srok_id,i,j,n: Integer;
  tip,srok,Ed1,Ed2,NR: String;
  NOMER : Array[1..10] of String;
begin
  NK_id := DataModule1.FDQuery_NashaKompaniua_Table.FieldByName('id').AsString;
 
  if Form_BlankiDogovorov <> nil then
  begin
    if Form_BlankiDogovorov.Showing then
    begin
      Form_BlankiDogovorov.Show;
    end;
  end
  else
  if Form_BlankiDogovorov = nil then
  begin
    Form_BlankiDogovorov := TForm_BlankiDogovorov.Create(Application);
    with Form_BlankiDogovorov do
    begin
      Parent := Form_TransLog;
      Show;
 
      DataModule6.FDQuery_TipDogovora_Table.Active := True;
      DataModule6.FDQuery_SrokDogovora_Table.Active := True;
 
      Panel7.Width := GroupBox5.Width - Panel7.Left - 16;
      Panel9.Width := GroupBox6.Width - Panel9.Left - 16;
 
      TreeView1.Items.Clear;
 
      with DataModule6.FDQuery_View_BlankiDogovorov_TreeView1 do
      begin
        Close;
        SQL.Clear;
        SQL.Add('SELECT id, NashaKompaniua_id, TipDogovora_id, SrokDeistviua_id, NameRazdela, NomerRazdela, Text_Razdela, id_ImageIndex');
        SQL.Add('FROM View_BlankiDogovorov_TreeView1');
        SQL.Add('WHERE (NashaKompaniua_id = '''+NK_id+''')');
        SQL.Add('ORDER BY TipDogovora_id ASC, SrokDeistviua_id ASC, NomerRazdela ASC');
        Open;
      end;
 
      DataModule6.DataSource_View_BlankiDogovorov_TreeView1.DataSet.First;
      while not DataModule6.DataSource_View_BlankiDogovorov_TreeView1.DataSet.Eof do
      begin
        if (DataModule6.FDQuery_View_BlankiDogovorov_TreeView1.FieldByName('NameRazdela').AsString = '') and
           (DataModule6.FDQuery_View_BlankiDogovorov_TreeView1.FieldByName('NomerRazdela').AsString = '')
        then
        begin
          tip_id := DataModule6.FDQuery_View_BlankiDogovorov_TreeView1.FieldByName('TipDogovora_id').AsInteger;
          srok_id := DataModule6.FDQuery_View_BlankiDogovorov_TreeView1.FieldByName('SrokDeistviua_id').AsInteger;
 
          with DataModule6.FDQuery_View_TipDogovora_Poisk do
          begin
            Close;
            SQL.Clear;
            SQL.Add('SELECT * FROM View_TipDogovora_Poisk');
            SQL.Add('WHERE (id = '''+IntToStr(tip_id+1)+''')');
            Open;
          end;
 
          tip := DataModule6.FDQuery_View_TipDogovora_Poisk.FieldByName('TipDogovora').AsString;
 
          with DataModule6.FDQuery_View_SrokDogovora_Poisk do
          begin
            Close;
            SQL.Clear;
            SQL.Add('SELECT * FROM View_SrokDogovora_Poisk');
            SQL.Add('WHERE (id = '''+IntToStr(srok_id+1)+''')');
            Open;
          end;
 
          srok := DataModule6.FDQuery_View_SrokDogovora_Poisk.FieldByName('SrokDogovora').AsString;
 
          if (DataModule6.FDQuery_View_BlankiDogovorov_TreeView1.FieldByName('TipDogovora_id').AsInteger = tip_id) and
             (DataModule6.FDQuery_View_BlankiDogovorov_TreeView1.FieldByName('SrokDeistviua_id').AsInteger = srok_id)
          then
          begin
            NodeGruppa := TreeView1.Items.Add(nil, tip+' - ('+srok+')');
            TreeView1.Items.BeginUpdate;
            NodeGruppa.ImageIndex := 3;
            NodeGruppa.SelectedIndex := 3;
            TreeView1.Items.EndUpdate;
 
            TreeViewCount := NodeGruppa.AbsoluteIndex;
            TreeView1.Selected := TreeView1.Items.Item[TreeViewCount];
            TreeView1.SetFocus;
          end;
        end
        else
        begin
          Ed2 := DataModule6.FDQuery_View_BlankiDogovorov_TreeView1.FieldByName('NomerRazdela').AsString;
          Ed1 := DataModule6.FDQuery_View_BlankiDogovorov_TreeView1.FieldByName('Text_Razdela').AsString;
 
          NR := DataModule6.FDQuery_View_BlankiDogovorov_TreeView1.FieldByName('NomerRazdela').AsString;
          j := 0;
 
          for i := 1 to Length(NR) do
          begin
            if NR[i] = '.' then
            begin
              j := j + 1;
              NOMER[j] := Copy(NR, j, j);        //ShowMessage(IntToStr(j)+' - '+NOMER[j]);     Пробую разбить строку
            end;
          end;
 
          if j = 0 then
          begin
            NodeGruppa := TreeView1.Selected;   // Устанавливаем указатель на выбранный элемент
            while NodeGruppa.Parent <> nil do   // Если Parent = nil, значит это корневой элемент
            NodeGruppa := NodeGruppa.Parent;    // Устанавливаем указатель на родительский элемент
 
            id_Razd := TreeView1.Selected.AbsoluteIndex;
            if id_Razd = TreeView1.Selected.AbsoluteIndex then
            begin
              NodeGruppa := TreeView1.Items.AddChild(TreeView1.Selected, Ed2 +'. '+ Ed1);
              TreeView1.Items.BeginUpdate;
              NodeGruppa.ImageIndex := -1;
              NodeGruppa.SelectedIndex := -1;
              TreeView1.Items.EndUpdate;
              TreeView1.FullExpand;
            end;
          end
          else
          if j > 0 then           //ТУТ НУЖНО ПЕРЕДЕЛАТЬ
          begin
            
 
           { for n := 1 to j do
            begin
              if NOMER[n] = NOMER[j] then
              begin
                TreeViewCount := NodeGruppa.AbsoluteIndex;
                TreeView1.Selected := TreeView1.Items.Item[TreeViewCount];
                TreeView1.SetFocus;
 
                begin
                  NodeGruppa := TreeView1.Items.AddChild(TreeView1.Selected, Ed2 +'. '+ Ed1);
                  TreeView1.Items.BeginUpdate;
                  NodeGruppa.ImageIndex := -1;
                  NodeGruppa.SelectedIndex := -1;
                  TreeView1.Items.EndUpdate;
                  TreeView1.FullExpand;
                end;
              end;
            end;  }
 
              begin
                id_Razd := TreeView1.Selected.AbsoluteIndex;
                if id_Razd = TreeView1.Selected.AbsoluteIndex then
                begin
                  NodeGruppa := TreeView1.Items.AddChild(TreeView1.Selected, Ed2 +'. '+ Ed1);
                  TreeView1.Items.BeginUpdate;
                  NodeGruppa.ImageIndex := -1;
                  NodeGruppa.SelectedIndex := -1;
                  TreeView1.Items.EndUpdate;
                  TreeView1.FullExpand;
                end;
              end;
 
              begin
                  NodeGruppa := TreeView1.Items.AddChild(TreeView1.Selected, Ed2 +'. '+ Ed1);
                  TreeView1.Items.BeginUpdate;
                  NodeGruppa.ImageIndex := -1;
                  NodeGruppa.SelectedIndex := -1;
                  TreeView1.Items.EndUpdate;
                  TreeView1.FullExpand;
                end;
          end;
 
 
        end;
 
        DataModule6.DataSource_View_BlankiDogovorov_TreeView1.DataSet.Next;
      end;
    end;
  end;
end;
Миниатюры
Вывод данных с базы данных в TreeView   Вывод данных с базы данных в TreeView  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.06.2022, 20:35
Ответы с готовыми решениями:

Вывод данных с базы данных в TreeView
Здравствуйте! Помогите разобраться и подкорректировать код, вывожу данные с БД в TreeView , по нажатию на выбранную категорию происходит...

Treeview из базы данных
Добрый день прошу помощи. Пишу прогу RadStudio10 SQL=&gt;ADOconnection=&gt;ADOquery=&gt;Datasoure. Можете подсказать как с двух таблиц загрузить...

Treeview и базы данных
Где можно найти уроки с примерами исходного кода по работе с treeview и базами данных без установки сервера баз данных (используем базы в...

15
408 / 242 / 88
Регистрация: 28.04.2022
Сообщений: 1,207
01.06.2022, 21:15
Лучший ответ Сообщение было отмечено kabachok как решение

Решение

У вас неправильная концепция. Сделайте два поля: ID и ParentID. ID - собственный идентификатор элемента в иерархии (это поле у вас есть). ParentID - идентификатор родителя, т.е. вышестоящего узла. Если ParentID IS NULL, тогда это root. Далее по этим идентификаторам строятся ветки. В момент раскрытия узла (по соответствующему событию) делаем запрос на выборку всех дочек этого узла и создаём дочерние элементы.
1
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
01.06.2022, 21:18
в задачах такого рода есть один правильный ответ
методология
если у вас простыня кода 8 экранов
а) работать не будет
б) починить невозможно
в) никто не возьмется вникать что там у вас
г, д, е ... и т.д.

вам нужно представить, что все данные у вас уже на руках каким-то образом и теперь нужно сделать
методы
1) отдельный метод для заполнения каждого возможного типа узла
2) главный метод, который определяет, что за тип данных у вас на этом произвольно взятом узле
и запускает один из методов из п.1

далее применить главный метод рекурсивно для каждого узла в КОРНЕВОМ списке

Добавлено через 27 секунд
ну и полностью поддержу то что написал Gluck99,
0
22 / 4 / 1
Регистрация: 25.03.2012
Сообщений: 199
01.06.2022, 21:28  [ТС]
Надеюсь, что мысль понял.
То есть, на каждую ветку делаю отдельный SQL- запрос?
ParentID, добавлю.
Спасибо, буду пробовать.
0
408 / 242 / 88
Регистрация: 28.04.2022
Сообщений: 1,207
01.06.2022, 21:52
Цитата Сообщение от kabachok Посмотреть сообщение
То есть, на каждую ветку делаю отдельный SQL- запрос?
Запрос будет один, точнее, их два:
1) выбрать всех root'ов, т.е. те записи, у которых ParentID IS NULL. Создать их в treeview.
2) выбрать всех дочек конкретного родителя (узла) по клику мышкой на этом узле.
Тут, правда, придётся немного попотеть. Во-первых, надо будет создать поле в treeview для хранения ID элемента в БД, иначе непонятно как формировать запрос. Во-вторых, мало создать элемент, надо создать его с возможностью раскрытия [+], если он сам содержит дочек, или наоборот, если не содержит, то без знака [+]. В принципе, эту проверку можно добавить в запрос и создавать пустую дочку, если элемент содержит другие элементы.
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
02.06.2022, 10:40
чуть позже придет понимание, что стандартный TreeView - не очень и надо пользоваться как все - VirtualTreeView
но потренироваться можно и тут
0
408 / 242 / 88
Регистрация: 28.04.2022
Сообщений: 1,207
02.06.2022, 12:58
К тому же есть готовые DBTreeView, практически только ID подставить.
0
22 / 4 / 1
Регистрация: 25.03.2012
Сообщений: 199
13.06.2022, 10:47  [ТС]
Gluck99, Прошу помощи.
Цитата Сообщение от Gluck99 Посмотреть сообщение
Тут, правда, придётся немного попотеть.
Потею, но толку мало. Вот что у меня получилось:
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
procedure TForm_TransLog.N47Click(Sender: TObject);
var
  tip,srok,Ed1,Ed2,Root_id: String;
  NodeGruppa,Node: TTreeNode;
  ID,i: Integer;
begin
  NK_id := DataModule1.FDQuery_NashaKompaniua_Table.FieldByName('id').AsString;
 
  if Form_BlankiDogovorov <> nil then
  begin
    if Form_BlankiDogovorov.Showing then
    begin
      Form_BlankiDogovorov.Show;
    end;
  end
  else
  if Form_BlankiDogovorov = nil then
  begin
    Form_BlankiDogovorov := TForm_BlankiDogovorov.Create(Application);
    with Form_BlankiDogovorov do
    begin
      Parent := Form_TransLog;
      Show;
 
      TreeView1.Items.Clear;
 
      with DataModule6.FDQuery_View_BlankiDogovorov_TreeView1 do
      begin
        Close;
        SQL.Clear;
        SQL.Add('SELECT id, NashaKompaniua_id, TipDogovora_id, SrokDeistviua_id, ParentID, NameRazdela,  NomerRazdela, Text_Razdela');
        SQL.Add('FROM View_BlankiDogovorov_TreeView1');
        SQL.Add('WHERE (NashaKompaniua_id = '''+NK_id+''') and');
        SQL.Add('(ParentID IS NULL)');
        SQL.Add('ORDER BY TipDogovora_id ASC, SrokDeistviua_id ASC, NomerRazdela ASC');
        Open;
      end;
 
      DataModule6.DataSource_View_BlankiDogovorov_TreeView1.DataSet.First;
      while not DataModule6.DataSource_View_BlankiDogovorov_TreeView1.DataSet.Eof do
      begin
        tip_id := DataModule6.FDQuery_View_BlankiDogovorov_TreeView1.FieldByName('TipDogovora_id').AsInteger;
        srok_id := DataModule6.FDQuery_View_BlankiDogovorov_TreeView1.FieldByName('SrokDeistviua_id').AsInteger;
 
 
        with DataModule6.FDQuery_View_TipDogovora_Poisk do
        begin
          Close;
          SQL.Clear;
          SQL.Add('SELECT * FROM View_TipDogovora_Poisk');
          SQL.Add('WHERE (id = '''+IntToStr(tip_id)+''')');
          Open;
        end;
 
        tip := DataModule6.FDQuery_View_TipDogovora_Poisk.FieldByName('TipDogovora').AsString;
 
        with DataModule6.FDQuery_View_SrokDogovora_Poisk do
        begin
          Close;
          SQL.Clear;
          SQL.Add('SELECT * FROM View_SrokDogovora_Poisk');
          SQL.Add('WHERE (id = '''+IntToStr(srok_id)+''')');
          Open;
        end;
 
        srok := DataModule6.FDQuery_View_SrokDogovora_Poisk.FieldByName('SrokDogovora').AsString;
 
        NodeGruppa := TreeView1.Items.Add(nil, tip+' - ('+srok+')');
 
        TreeView1.Items.BeginUpdate;
        NodeGruppa.ImageIndex := 3;
        NodeGruppa.SelectedIndex := 3;
        TreeView1.Items.EndUpdate;
 
        ID := DataModule6.FDQuery_View_BlankiDogovorov_TreeView1.FieldByName('id').AsInteger;
 
        with DataModule6.FDQuery_BlankiDogovorov_Parent do
        begin
          Close;
          SQL.Clear;
          SQL.Add('SELECT id, NashaKompaniua_id, TipDogovora_id, SrokDeistviua_id, ParentID, NameRazdela, NomerRazdela, Text_Razdela');
          SQL.Add('FROM BlankiDogovorov_Table');
          SQL.Add('WHERE (NashaKompaniua_id = '''+NK_id+''') and');
          SQL.Add('(TipDogovora_id = '''+IntToStr(tip_id)+''') and');
          SQL.Add('(SrokDeistviua_id = '''+IntToStr(srok_id)+''') and');
          SQL.Add('(ParentID = '''+IntToStr(ID)+''')');
          SQL.Add('ORDER BY TipDogovora_id ASC, SrokDeistviua_id ASC, NomerRazdela ASC');
          Open;
        end;
 
        TreeView1.Items.BeginUpdate;
        for i := 1 to DataModule6.FDQuery_BlankiDogovorov_Parent.RecordCount do
        begin
          Ed2 := DataModule6.FDQuery_BlankiDogovorov_Parent.FieldByName('NomerRazdela').AsString;
          Ed1 := DataModule6.FDQuery_BlankiDogovorov_Parent.FieldByName('Text_Razdela').AsString;
 
          Node := TreeView1.Items.AddChildObject(NodeGruppa, Ed2 +'. '+ Ed1 ,
                                  Pointer(DataModule6.FDQuery_BlankiDogovorov_Parent.FieldByName('id').AsInteger));
 
          Node.ImageIndex := -1;
          Node.SelectedIndex := -1;
 
          TreeView1.Items.AddChildObject(Node , '', nil);
 
          DataModule6.FDQuery_BlankiDogovorov_Parent.Next;
        end;
        TreeView1.Items.EndUpdate;
 
        DataModule6.DataSource_View_BlankiDogovorov_TreeView1.DataSet.Next;
      end;
    end;
  end;
end;
Прошу помочь сделать так, чтобы раскрывались все ветки
Миниатюры
Вывод данных с базы данных в TreeView   Вывод данных с базы данных в TreeView  
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
13.06.2022, 13:26
Цитата Сообщение от kabachok Посмотреть сообщение
Прошу помочь сделать так, чтобы раскрывались все ветки
Delphi
1
TreeView1.FullExpand
0
22 / 4 / 1
Регистрация: 25.03.2012
Сообщений: 199
05.12.2022, 22:39  [ТС]
Прошу помощи
Вывожу данные из базы данных в TreeView
Первым делом создаю все Root
С помощью OnExpanding, загружаю Node
При многократном закрытии/открытии Node, дети повторяют.
Что нужно сделать, чтобы не было повторов?
Вот код:
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
procedure TDataModule0.N3Click(Sender: TObject);
var
  vid,forma,Uslov,Ed1,Ed,ID: String;
  Node,ParentNode: TTreeNode;
  i: Integer;
begin
  NK_id := DataModule1.FDQuery_NashaKompaniua_Table.FieldByName('id').AsString;
 
  if Form_FormaDogovorPriemaRabota <> nil then
  begin
    if Form_FormaDogovorPriemaRabota.Showing then
    begin
      Form_FormaDogovorPriemaRabota.Show;
    end;
  end
  else
  if Form_FormaDogovorPriemaRabota = nil then
  begin
    Form_FormaDogovorPriemaRabota := TForm_FormaDogovorPriemaRabota.Create(Application);
    with Form_FormaDogovorPriemaRabota do
    begin
      Parent := Form_TransLog;
 
      Panel10.Caption := 'Трудовой договор';
 
      Show;
 
      DataModule7.FDQuery_View_VidDogovora.Active := True;
      DataModule7.FDQuery_View_FormaOtnoshenui.Active := True;
      DataModule7.FDQuery_View_Faset_05UsloviuaTruda.Active := True;
 
      TreeView1.Items.Clear;
 
      with DataModule7.FDQuery_View_FormaDogovorPriemaRabota_TreeView1 do
      begin
        Close;
        SQL.Clear;
        SQL.Add('SELECT id, NashaKompaniua_id, VidDogovora_id, FormaOtnoshenui_id, UsloviuaTruda_id, ParentID, NameRazdela,  NomerRazdela, Text_Razdela, Data_Registracui, Rabochui');
        SQL.Add('FROM View_FormaDogovorPriemaRabota_TreeView1');
        SQL.Add('WHERE (NashaKompaniua_id = '''+NK_id+''') and');
        SQL.Add('(ParentID IS NULL)');
        SQL.Add('ORDER BY VidDogovora_id ASC, FormaOtnoshenui_id ASC, UsloviuaTruda_id ASC, NomerRazdela ASC');
        Open;
      end;
 
      DataModule7.DataSource_View_FormaDogovorPriemaRabota_TreeView1.DataSet.First;
      while not DataModule7.DataSource_View_FormaDogovorPriemaRabota_TreeView1.DataSet.Eof do
      begin
        VidDog_id := DataModule7.FDQuery_View_FormaDogovorPriemaRabota_TreeView1.FieldByName('VidDogovora_id').AsInteger;
        FormOtn_id := DataModule7.FDQuery_View_FormaDogovorPriemaRabota_TreeView1.FieldByName('FormaOtnoshenui_id').AsInteger;
        Uslov_id := DataModule7.FDQuery_View_FormaDogovorPriemaRabota_TreeView1.FieldByName('UsloviuaTruda_id').AsInteger;
 
        with DataModule7.FDQuery_View_VidDogovora_Poisk do
        begin
          Close;
          SQL.Clear;
          SQL.Add('SELECT * FROM View_VidDogovora_Poisk');
          SQL.Add('WHERE (id = '''+IntToStr(VidDog_id)+''')');
          Open;
        end;
 
        vid := DataModule7.FDQuery_View_VidDogovora_Poisk.FieldByName('Vid_Dogovora').AsString;
 
        with DataModule7.FDQuery_View_FormaOtnoshenui_Poisk do
        begin
          Close;
          SQL.Clear;
          SQL.Add('SELECT * FROM View_FormaOtnoshenui_Poisk');
          SQL.Add('WHERE (id = '''+IntToStr(FormOtn_id)+''')');
          Open;
        end;
 
        forma := DataModule7.FDQuery_View_FormaOtnoshenui_Poisk.FieldByName('FormaOtnoshenui').AsString;
 
        with DataModule7.FDQuery1_View_Faset_05UsloviuaTruda_Poisk do
        begin
          Close;
          SQL.Clear;
          SQL.Add('SELECT * FROM View_Faset_05UsloviuaTruda_Poisk');
          SQL.Add('WHERE (Kod_Pozucui = '''+IntToStr(Uslov_id)+''')');
          Open;
        end;
 
        Uslov := DataModule7.FDQuery1_View_Faset_05UsloviuaTruda_Poisk.FieldByName('NamePozucui').AsString;
 
        //Выбираю всех root'ов, т.е. те записи, у которых ParentID IS NULL
        if DataModule7.FDQuery_View_FormaDogovorPriemaRabota_TreeView1.FieldByName('ParentID').IsNull then
        begin
          TreeView1.Items.BeginUpdate;
          NodeGruppa := TreeView1.Items.Add(nil, forma+', '+vid+', '+Uslov);
          NodeGruppa.ImageIndex := 3;
          NodeGruppa.SelectedIndex := 3;
          TreeView1.Items.EndUpdate;
        end;
 
        ID := DataModule7.FDQuery_View_FormaDogovorPriemaRabota_TreeView1.FieldByName('id').AsString;
 
        with DataModule7.FDQuery_FormaDogovorPriemaRabota_Table do
        begin
          Close;
          SQL.Clear;
          SQL.Add('SELECT id, NashaKompaniua_id, VidDogovora_id, FormaOtnoshenui_id, UsloviuaTruda_id, ParentID, NameRazdela, NomerRazdela, Text_Razdela, Data_Registracui, Rabochui');
          SQL.Add('FROM FormaDogovorPriemaRabota_Table');
          SQL.Add('WHERE (NashaKompaniua_id = '''+NK_id+''') and');
          SQL.Add('(ParentID = '''+ID+''') and');
          SQL.Add('(Rabochui = '''+'True'+''')');
          SQL.Add('ORDER BY VidDogovora_id ASC, FormaOtnoshenui_id ASC, UsloviuaTruda_id ASC, NomerRazdela ASC');
          Open;
        end;
 
        if DataModule7.FDQuery_FormaDogovorPriemaRabota_Table.RecordCount <> 0 then
        begin
          TreeView1.Items.AddChildObject(NodeGruppa, '', nil);
        end;
 
        DataModule7.DataSource_View_FormaDogovorPriemaRabota_TreeView1.DataSet.Next;
      end;
 
      DataModule7.FDQuery_View_FormaDogovorPriemaRabota_TreeView1.Active := False;
    end;
  end;
end;
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
procedure TForm_FormaDogovorPriemaRabota.TreeView1Expanding(Sender: TObject;
  Node: TTreeNode; var AllowExpansion: Boolean);
var
  StrK,forma,Dubl,vid,Uslov,forma_id,vid_id,Uslov_id,ID: String;
  i,j,m,n,z,TabID,a: Integer;
  Ed1,Ed2: String;
  ParentNode: TTreeNode;
begin
  NK_id := DataModule1.FDQuery_NashaKompaniua_Table.FieldByName('id').AsString;
 
  if Node.getFirstChild.Data = nil then
  begin
    Node.DeleteChildren;
    DataModule0.N3Click(Node);
  end;
 
  TreeView1.Selected := Node;
  TreeView1.SetFocus;
  TreeView1Click(Sender);
 
  StrK := Panel10.Caption;
 
  for i := 1 to Length(StrK) do
  begin
    if StrK[i] = ',' then
    begin
      j := Pos(',', StrK);
      forma := Copy(StrK, 1, j-1);
 
      Dubl := Copy(StrK,j+2);
 
      for m := 1 to Length(Dubl) do
      begin
        if Dubl[m] = ',' then
        begin
          n := Pos(',', Dubl);
          vid := Copy(Dubl,1,m-1);
          Uslov := Copy(Dubl,m+2);
        end;
      end;
    end;
  end;
 
  with DataModule7.FDQuery_FormaOtnoshenui_Table do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM FormaOtnoshenui_Table');
    SQL.Add('WHERE (FormaOtnoshenui = '''+forma+''')');
    Open;
  end;
 
  if DataModule7.FDQuery_FormaOtnoshenui_Table.FieldByName('FormaOtnoshenui').AsString = forma then
  begin
    forma_id := DataModule7.FDQuery_FormaOtnoshenui_Table.FieldByName('id').AsString;
  end;
 
  with DataModule7.FDQuery_VidDogovora_Table do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM VidDogovora_Table');
    SQL.Add('WHERE (Vid_Dogovora = '''+vid+''')');
    Open;
  end;
 
  if DataModule7.FDQuery_VidDogovora_Table.FieldByName('Vid_Dogovora').AsString = vid then
  begin
    vid_id := DataModule7.FDQuery_VidDogovora_Table.FieldByName('id').AsString;
  end;
 
  with DataModule7.FDQuery_Faset_05UsloviuaTruda_Table do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM Faset_05UsloviuaTruda_Table');
    SQL.Add('WHERE (NamePozucui = '''+Uslov+''')');
    Open;
  end;
 
  if DataModule7.FDQuery_Faset_05UsloviuaTruda_Table.FieldByName('NamePozucui').AsString = Uslov then
  begin
    Uslov_id := DataModule7.FDQuery_Faset_05UsloviuaTruda_Table.FieldByName('Kod_Pozucui').AsString;
  end;
 
  with DataModule7.FDQuery_FormaDogovorPriemaRabota_Table do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT id, NashaKompaniua_id, VidDogovora_id, FormaOtnoshenui_id, UsloviuaTruda_id, ParentID, NameRazdela, NomerRazdela, Text_Razdela, Data_Registracui, Rabochui');
    SQL.Add('FROM FormaDogovorPriemaRabota_Table');
    SQL.Add('WHERE (NashaKompaniua_id = '''+NK_id+''') and');
    SQL.Add('(VidDogovora_id = '''+vid_id+''') and');
    SQL.Add('(FormaOtnoshenui_id = '''+forma_id+''') and');
    SQL.Add('(UsloviuaTruda_id = '''+Uslov_id+''') and');
    if Panel11.Caption = '' then
    begin
      SQL.Add('(NomerRazdela IS NULL) and');
      SQL.Add('(Rabochui IS NULL)');
    end
    else
    if Panel11.Caption <> '' then
    begin
      SQL.Add('(NomerRazdela = '''+Panel11.Caption+''') and');
      SQL.Add('(Rabochui = '''+'True'+''')');
    end;
    SQL.Add('ORDER BY VidDogovora_id ASC, FormaOtnoshenui_id ASC, UsloviuaTruda_id ASC, NomerRazdela ASC');
    Open;
  end;
 
  TabID := DataModule7.FDQuery_FormaDogovorPriemaRabota_Table.FieldByName('id').AsInteger;
 
  TreeView1.Items.BeginUpdate;
 
  with DataModule7.FDQuery_View_FormaDogovorPriemaRabota_TreeView1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT id, NashaKompaniua_id, VidDogovora_id, FormaOtnoshenui_id, UsloviuaTruda_id, ParentID, NameRazdela, NomerRazdela, Text_Razdela, Data_Registracui, Rabochui');
    SQL.Add('FROM View_FormaDogovorPriemaRabota_TreeView1');
    SQL.Add('WHERE (NashaKompaniua_id = '''+NK_id+''') and');
    SQL.Add('(ParentID = '''+IntToStr(TabID)+''') and');
    SQL.Add('(Rabochui = '''+'True'+''')');
    SQL.Add('ORDER BY VidDogovora_id ASC, FormaOtnoshenui_id ASC, UsloviuaTruda_id ASC, NomerRazdela ASC');
    Open;
  end;
 
  DataModule7.DataSource_View_FormaDogovorPriemaRabota_TreeView1.DataSet.First;
  while not DataModule7.DataSource_View_FormaDogovorPriemaRabota_TreeView1.DataSet.Eof do
  begin
    begin
      Ed2 := DataModule7.FDQuery_View_FormaDogovorPriemaRabota_TreeView1.FieldByName('NomerRazdela').AsString;
      Ed1 := DataModule7.FDQuery_View_FormaDogovorPriemaRabota_TreeView1.FieldByName('NameRazdela').AsString;
 
      ParentNode := TreeView1.Items.AddChildObject(Node, Ed2 +'. '+ Ed1 , Pointer(DataModule7.FDQuery_View_FormaDogovorPriemaRabota_TreeView1.FieldByName('id').AsInteger));
 
      ParentNode.ImageIndex := -1;
      ParentNode.SelectedIndex := -1;
    end;
 
    ID := DataModule7.FDQuery_View_FormaDogovorPriemaRabota_TreeView1.FieldByName('id').AsString;
 
    with DataModule7.FDQuery_FormaDogovorPriemaRabota_Parent do
    begin
      Close;
      SQL.Clear;
      SQL.Add('SELECT id, NashaKompaniua_id, VidDogovora_id, FormaOtnoshenui_id, UsloviuaTruda_id, ParentID, NameRazdela, NomerRazdela, Text_Razdela, Data_Registracui, Rabochui');
      SQL.Add('FROM FormaDogovorPriemaRabota_Table');
      SQL.Add('WHERE (NashaKompaniua_id = '''+NK_id+''') and');
      SQL.Add('(ParentID = '''+ID+''') and');
      SQL.Add('(Rabochui = '''+'True'+''')');
      SQL.Add('ORDER BY VidDogovora_id ASC, FormaOtnoshenui_id ASC, UsloviuaTruda_id ASC, NomerRazdela ASC');
      Open;
    end;
 
    if DataModule7.FDQuery_FormaDogovorPriemaRabota_Parent.RecordCount <> 0 then
    begin
      TreeView1.Items.AddChildObject(ParentNode, '', nil);
    end;
 
    DataModule7.DataSource_View_FormaDogovorPriemaRabota_TreeView1.DataSet.Next;
  end;
 
  TreeView1.Items.EndUpdate;
end;
Миниатюры
Вывод данных с базы данных в TreeView  
0
5951 / 4527 / 1094
Регистрация: 29.08.2013
Сообщений: 28,119
Записей в блоге: 3
05.12.2022, 22:53
Цитата Сообщение от kabachok Посмотреть сообщение
Что нужно сделать, чтобы не было повторов?
запустить отладку и посмотреть где дублируется
0
22 / 4 / 1
Регистрация: 25.03.2012
Сообщений: 199
05.12.2022, 23:00  [ТС]
К сожалению я не умею пользоваться отладкой, пошаговой трассировкой
0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,339
05.12.2022, 23:52
Цитата Сообщение от kabachok Посмотреть сообщение
не умею пользоваться отладкой
Там не сложно. Ставишь курсор на строку, на которой надо остановиться при выполнении программы и жмёшь F5, затем запускаешь в режиме дебага. Как дойдёт до отмеченной строки - выполнение остановится и откроется редактор кода. Здесь можно навести курсор на переменную и узнать её содержимое. Нажав F8 можно выполнить следующую строку кода. При нажатии F7 выполняется с заходом в вызываемые функции, при нажатии F8 - без захода в функции. Если надоест выполнять по 1 строке, то нажать F9 и выполнение продолжится в обычном режиме.
0
 Аватар для Beltar
803 / 419 / 36
Регистрация: 05.05.2022
Сообщений: 2,911
06.12.2022, 00:30
А если нажать F4, то выполнение будет идти до позиции курсора.

Написать даже простейшую программу без трассировки не-воз-мож-но. Загрузить данные в дерево, тем более.

Что нужно сделать, чтобы не было повторов?
Очищать узел.

Запрос будет один, точнее, их два:
1) выбрать всех root'ов, т.е. те записи, у которых ParentID IS NULL. Создать их в treeview.
2) выбрать всех дочек конкретного родителя (узла) по клику мышкой на этом узле.
Я бы грузил одним запросом, уже хотя бы для того, чтобы при раскрытии ничего не дергалось. Возможно, это будет даже проще.
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
06.12.2022, 01:59
Цитата Сообщение от Beltar Посмотреть сообщение
Написать даже простейшую программу без трассировки не-воз-мож-но.
Написать можно. Отладить невозможно.
Цитата Сообщение от kabachok Посмотреть сообщение
К сожалению я не умею пользоваться отладкой, пошаговой трассировкой
Так учись, если тебе это действительно нужно.
0
22 / 4 / 1
Регистрация: 25.03.2012
Сообщений: 199
10.12.2022, 00:28  [ТС]
Спасибо, что заставили научиться работать с отладкой. В принципе, все понятно.
Проблему дубляжа, решил.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.12.2022, 00:28
Помогаю со студенческими работами здесь

Не получается осуществить вывод данных товаров из базы данных через цикл for
Изначально код принимал следующий вид &lt;!-- letest product section --&gt; &lt;section class=&quot;top-letest-product-section&quot;&gt; ...

Вывод данных из базы данных MySQL в PHP в виде дерева.
У нас в сети решили сделать портал-базу по рефератам. Все я сделал остались две траблы, про первую я здесь и пишу. Итак, имеется база с...

Xamarin android C#. Вывод данных из таблицы базы данных phpMyAdmin
Добрый день. Не могу найти ответ на вопрос &quot;В какой элемент Xamarin.Android выводить данных из таблицы базы данных и как выводить?&quot;...

Вывод данных из таблицы базы данных на View в проекте MVC
Добрый день! Дано: SQL-база с таблицами, &quot;начинающийся&quot; проект на VS по типу MVC. Необходимо вывести все данные из таблицы базы данных на...

Treeview для базы данных
Доброе время суток, понимаю, что тема избита, но не могу толком разобраться мне нужно отобразить в treeview delphi все таблицы из бд...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru