powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вопрос по dxDBTreeView
25 сообщений из 27, страница 1 из 2
Вопрос по dxDBTreeView
    #39328363
MBlack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здорова товарищи...

У меня следующая ситуация....

Усть компонент dxDBTreeView, на нем выводится данные из таблицы, в виде дерева....

К каждому пункту дерева привязаны, данные из другой таблицы...

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

Как мне сделать, так чтобы выводились записи, не только когда я щелкну по узлу, но и тогда, когда я щелкну на родите, то выходили все записи, относящихся к его потомкам....

таблицы две такие с такими полями

table1 (id, name, p_id)
table2 (id, id_table1, name, e.t.s)
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39328398
MBlack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отобразить данные в DBGrid не только выбранного узла дерева, но и всех дочерних веток этого узла
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39328487
MBlack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не ужели не кто не сталкивался с этим
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39328530
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где именно записи выводятся, после того, как щелкаем по таблице-дереву? Типа, рядом второй список лежит или что?
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39328543
MBlack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть компонент dxDBTreeView, в нем выводится записи из бД, в виде дерева...

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

Но мне нужно чтоб, допустим я щелкнул по узлу, чтоб выводились записи, не толька выбранного узла дерева, но и всех дочерних веток этого узла...
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39328546
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBlack,

Так.... я правильно понял, что речь идет ОБ ОДНОМ дереве, но где вместо того, чтобы выводить полную древовидную структуру, надо ограничиться ДВУМЯ уровнями вложенности?

Например, в базе есть записи с подзаписями, где есть свои под-под-записи. А надо всё это "свернуть" к двухуровневой форме.

Тогда будет иметь значение и тип базы данных, в которой все это хранится.
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39328548
MBlack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня выводится полная древовидная структура, с неограниченной вложенностью
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39328549
Dmitri Krizhanovski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBlack,

Было бы правильно, чтобы ты привел пример того, как ты выводишь записи.

А ты их выводишь по OnClick или по OnExpand?
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39328550
MBlack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Получаетсяч, мне нужно вывести, все ID, родителя и его узлов.., и сделать запрос...

Вот ID ника не получаетсчя вывести
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39328552
MBlack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я делвю обычный фильтр, можно конечно запросом, но незнаю решил фильтром

Код: pascal
1.
2.
3.
4.
   FTaskOrgDSet.Filtered := false;
   FTaskOrgDSet.Filter := 'ID_ITEMS = '+FDSetItemsOrg.FieldByName('ID').AsString + ' AND DATE_REGISTR = '+QuotedStr(DateToStr(frmMain.CalendarMain.CalendarDate));
   CurrFilter := FTaskOrgDSet.Filter;
   FTaskOrgDSet.Filtered := true;



Данный код я посадил на событие OnChange компонента dxDBTreeView
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39328560
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо в фильтре написать 'AND ID IN (123, 456, 789)' (если поддерживается компонентами). Либо это же выражение развернуть на 'AND ID = 123 AND ID = 456 AND ID = 789'.

Сами ID можно получить из дерева по перебору вида:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
filter := 'DATE = lalala';
node := tree_Items.FocusedNode; // перебор с выделенного
//node := tree_Items.FocusedNode.getFirstChild; // перебор с детей
//node := tree_Items.Root.getFirstChild; // перебор по всему дереву
while node <> nil do
begin
  itemID := NVL(node.Values[tree_ItemsR_ID.ItemIndex], -1);
  filter := filter + Format(' AND ID = %d', [itemID]);
  node := node.GetNext;
end;
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39328601
MBlack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так что то у меня не получается. Так как некоторых свойств, нету у компонента dxDBTreeView/
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39328608
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBlack,

код был для трилиста. Вот код для тривью (возможно, надо будет добавить проверку на "выделен был нод или нет"):
Код: pascal
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.
procedure TForm84.dxDBTreeView1Change(Sender: TObject; Node: TTreeNode);
var
  filter: string;

  procedure ProcessNodes(const ANode: TdxDBTreeNode; var AFilter: string);
  var
    id: Integer;
    child: TdxDBTreeNode;
    I: Integer;
  begin
    // значение от основного нода
    id := ANode.KeyFieldValue;
    if AFilter <> '' then
    begin
      AFilter := AFilter + ' AND ';
    end;
    AFilter := AFilter + Format('id = %d ', [id]);

    // значения от всех его детей
    child := ANode.getFirstChild as TdxDBTreeNode;
    while child <> nil do
    begin
      ProcessNodes(child, AFilter);
      child := ANode.GetNextChild(child) as TdxDBTreeNode;
    end;
  end;

begin
  if Node = nil then
  begin
    Exit;
  end;

  // начальные условия в фильтре
  filter := 'DATA = 123';

  // дополнительные условия в зависимости от выбранного нода
  ProcessNodes(Node as TdxDBTreeNode, filter);

  Label1.Caption := filter;
end;
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Вопрос по dxDBTreeView
    #39631148
Timon77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите поправить этот код для использование его с cxDBTreelist...

JaDiMBlack,

код был для трилиста. Вот код для тривью (возможно, надо будет добавить проверку на "выделен был нод или нет"):
Код: pascal
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.
procedure TForm84.dxDBTreeView1Change(Sender: TObject; Node: TTreeNode);
var
  filter: string;

  procedure ProcessNodes(const ANode: TdxDBTreeNode; var AFilter: string);
  var
    id: Integer;
    child: TdxDBTreeNode;
    I: Integer;
  begin
    // значение от основного нода
    id := ANode.KeyFieldValue;
    if AFilter <> '' then
    begin
      AFilter := AFilter + ' AND ';
    end;
    AFilter := AFilter + Format('id = %d ', [id]);

    // значения от всех его детей
    child := ANode.getFirstChild as TdxDBTreeNode;
    while child <> nil do
    begin
      ProcessNodes(child, AFilter);
      child := ANode.GetNextChild(child) as TdxDBTreeNode;
    end;
  end;

begin
  if Node = nil then
  begin
    Exit;
  end;

  // начальные условия в фильтре
  filter := 'DATA = 123';

  // дополнительные условия в зависимости от выбранного нода
  ProcessNodes(Node as TdxDBTreeNode, filter);

  Label1.Caption := filter;
end;
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39631223
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timon77,

Код: pascal
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.
procedure TForm8.dbTreeChange(Sender: TObject);
var
  filter: string;

  procedure ProcessNodes(const ANode: TcxTreeListNode; var AFilter: string);
  var
    id: Integer;
    child: TcxTreeListNode;
    checked: Boolean;
    I: Integer;
  begin
    // обработка одной записи

    // сама запись
    if (ANode <> ANode.TreeList.Root) then
    begin
      id := ANode.Values[dbTreeID.ItemIndex];
      checked := ANode.Values[dbTreeCHECK.ItemIndex]; // Properties должна быть CheckBox с ImmediatePost = True
      if checked then
      begin
        if AFilter <> '' then
        begin
          AFilter := AFilter + ' AND ';
        end;
        AFilter := AFilter + Format('id = %d ', [id]);
      end;
    end;

    // все ее дети
    child := ANode.getFirstChild;
    while child <> nil do
    begin
      ProcessNodes(child, AFilter);
      child := child.getNextSibling;
    end;
  end;

begin
  // обновляет фильтр на основе отмеченных галочек

  // начальные условия в фильтре
  filter := 'DATA = 123';

  // доп условие в фильтре по выделенным строкам
  ProcessNodes(dbTree.Root, filter);

  Label1.Caption := filter;
end;
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39631941
Timon77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JaDi
Код: pascal
1.
      id := ANode.Values[dbTreeID.ItemIndex];



Спасибо за код, но у меня проблема: dbTreeID .ItemIndex компилятор мне понимает
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39631944
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timon77,

dbTreeID -- это имя колонки трилиста, в которой хранится ID записи и значение которого будет подставляться в итоговый фильтр.
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39631948
Timon77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JaDi,

Огромное спасибо, все заработало как надо
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39631975
Timon77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JaDi,

Я немного поспешил с выводами, но процедура работает не так как мне надо.
Мне необходимо, что бы фильтр наполнялся выделенным родителем и всеми его потомками. checked я не использую.
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39631977
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timon77,

достаточно заменить
Код: pascal
1.
checked := ANode.Values[dbTreeCHECK.ItemIndex];


на
Код: pascal
1.
checked := ANode.Selected;
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39631983
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Плюс принудительное добавление добавить. Типа вот этого кода (не проверял, но может и заработает):

Код: pascal
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.
procedure TForm8.dbTreeChange(Sender: TObject);
var
  filter: string;

  procedure ProcessNodes(const ANode: TcxTreeListNode; var AFilter: string; const AForceToAdd: Boolean);
  var
    id: Integer;
    child: TcxTreeListNode;
    checked: Boolean;
    I: Integer;
  begin
    // обработка одной записи

    // сама запись
    if (ANode <> ANode.TreeList.Root) then
    begin
      id := ANode.Values[dbTreeID.ItemIndex];
      checked := ANode.Selected or AForceToAdd; // Properties должна быть CheckBox с ImmediatePost = True
      if checked then
      begin
        if AFilter <> '' then
        begin
          AFilter := AFilter + ' AND ';
        end;
        AFilter := AFilter + Format('id = %d ', [id]);
      end;
    end;

    // все ее дети
    child := ANode.getFirstChild;
    while child <> nil do
    begin
      ProcessNodes(child, AFilter, checked);
      child := child.getNextSibling;
    end;
  end;

begin
  // обновляет фильтр на основе отмеченных галочек

  // начальные условия в фильтре
  filter := 'DATA = 123';

  // доп условие в фильтре по выделенным строкам
  ProcessNodes(dbTree.Root, filter);

  Label1.Caption := filter;
end;
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39632038
Timon77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JaDi,

Спасибо за код, но ....
Если писать
Код: pascal
1.
checked := ANode.Selected;


то в фильтр пишется только id выделеного нода без потомков, а если меняем на
Код: pascal
1.
checked := ANode.Selected or AForceToAdd;


то в фильтр пишется все id которые присутствуют в treelist
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39632050
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо использовать:
Код: pascal
1.
checked := ANode.Values[dbTreeCHECK.ItemIndex] or AForceToAdd;


где dbTreeCHECK -- колонка, в которой хранятся значения галочек. В данном случае там должен быть тип boolean и значения true/false.
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39632062
Timon77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JaDi,

У меня задача стоит такая, на форме имеется cxDBTreeList и cxGrid
В трилисте каталог запчастей по категориям, при выборе определенного пункта, фильтр cxGrid отображает необходимое, соответственно я chekbox не использую.
...
Рейтинг: 0 / 0
Вопрос по dxDBTreeView
    #39632082
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что вот здесь 21346558
ProcessNodes(dbTree.Root, filter);
Третьим параметром надо было ставить false -- тогда выделять будет не все записи в дереве
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вопрос по dxDBTreeView
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]