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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Код: 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
17.10.2016, 22:32
    #39328560
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по dxDBTreeView
Надо в фильтре написать '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
18.10.2016, 01:26
    #39328601
MBlack
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по dxDBTreeView
Так что то у меня не получается. Так как некоторых свойств, нету у компонента dxDBTreeView/
...
Рейтинг: 0 / 0
18.10.2016, 02:02
    #39328608
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по dxDBTreeView
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
Период между сообщениями больше года.
16.04.2018, 20:55
    #39631148
Timon77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по dxDBTreeView
Помогите поправить этот код для использование его с 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
17.04.2018, 00:35
    #39631223
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по dxDBTreeView
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
17.04.2018, 18:42
    #39631941
Timon77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по dxDBTreeView
JaDi
Код: pascal
1.
      id := ANode.Values[dbTreeID.ItemIndex];



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

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

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

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

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


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

Код: 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
17.04.2018, 20:27
    #39632038
Timon77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по dxDBTreeView
JaDi,

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


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


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


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

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


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