Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 01.03.2012, 11:05
vivazz vivazz вне форума
Прохожий
 
Регистрация: 05.05.2011
Сообщения: 14
Репутация: 10
По умолчанию

Нет, у меня 3 таблицы, Факультеты, Студенты и Форма обучения в ней есть и название группы.
FACULTET :
COD_FACULTETA, NAME_FACULTETA,ABBR_FACULTETA
STUDENT:
NOMER_STUD_BILETA, COD_FORMY_OBUCHENIYA И Т.Д.
FORMA_OBUCHENIYA:
COD_FORMY_OBUCHENIYA, NAME_FORMY_OBUCHENIYA, NAME_GROUP
Ответить с цитированием
  #17  
Старый 01.03.2012, 11:09
vivazz vivazz вне форума
Прохожий
 
Регистрация: 05.05.2011
Сообщения: 14
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
А на кой вам в коде переменная к? У вас-же после заполнения дерева будет количество элементов в TreeView1.Items.Count
И кстати, а как у вас реализована свзяь между таблицами Факультет,Группа,Студент. Или все в одной таблице?
Если там стоит переменная i, то у меня в 3 родителя добавляется по 1 дочерней записи имя которой такое же как у родителя, а мне нужно в каждого родителя записать все дочерние записи. Через перем. k получается записать только для одного родителя все дочерние записи.
Вот этот код:
Код:
        while (not dm1.q2.Eof) do
        begin
          TreeView1.Items.AddChildObject(TreeView1.Items.Item[k],
          dm1.q2.FieldByName('NAME_FACULTETA').AsString, Pointer(
          dm1.q2.FieldByName('COD_FACULTETA').AsInteger));    //(это для примера опять идут факультеты, т.к. ничего в бд не заполнено)
          inc(k);
          dm1.q2.Next;
        end;
Почему-то не выполняется для второго родителя и никак не пойму почему
Вот так вроде получилось, правильно ли?
Код:
        k:=0;
        //while not dm1.q2.Eof do
        //begin
        for i1 :=1  to dm1.q2.RecordCount do
          begin
          TreeView1.Items.AddChildObject(TreeView1.Items.Item[i],
          dm1.q2.FieldByName('NAME_FACULTETA').AsString, Pointer(
          dm1.q2.FieldByName('COD_FACULTETA').AsInteger));    //(это для примера опять идут факультеты, т.к. ничего в бд не заполнено)
          inc(k);
          dm1.q2.Next;
          end;
        //end;
        i:=i+k+1;
        q.Next;
Оказывается код немного не так работал как я его представлял...
я думал он работает так:
Создается родитель
потом для него создаются дочерние записи столько, сколько их в таблице
и т.д.
а получалось
создается родитель
создается дочерняя запись
создается родитель
создается дочерняя запись для первого родителя...
Вот как бы теперь еще одну подгруппу сделать, чтобы было
ФакультетВМ
---ФакультетВМ
------ФакультетВМ
------др.фак.
др.Фак.

Последний раз редактировалось vivazz, 01.03.2012 в 12:16.
Ответить с цитированием
  #18  
Старый 01.03.2012, 14:16
vivazz vivazz вне форума
Прохожий
 
Регистрация: 05.05.2011
Сообщения: 14
Репутация: 10
По умолчанию

Привожу полный код процедуры:
Код:
procedure TForm1.LoadTreeview1;
var
i,i1,k,k1 : integer;
begin
  flag:=false;
  i:=0;
  k1:=0;
  TreeView1.Items.Clear;
  with dm1.q do
  begin
    Active:=false;
    SQL.Clear;
    SQL.Add('SELECT * FROM FACULTET ORDER BY COD_FACULTETA');
    Active:=true;
    First;
    while not Eof do
    begin
      TreeView1.Items.Add(nil, FieldByName('NAME_FACULTETA').AsString);
      with dm1 do
      begin
        q2.Active:=false;
        q2.SQl.Clear;
        q2.SQL.Add('SELECT * FROM FACULTET ORDER BY COD_FACULTETA');
        //q2.SQL.Add('SELECT * FROM FACULTET WHERE NAME_FACULTETA=:Facultet');
        //q2.SQL.Add('ORDER BY COD_FACULTETA');
        //q2.Params.ParamByName('Facultet').asString := FieldByName('NAME_FACULTETA').AsString;
        q2.Active:=true;
        q2.First;
        k:=0;
        while dm1.q2.RecordCount<>k do
          begin
            TreeView1.Items.AddChildObject(TreeView1.Items.Item[i],
            dm1.q2.FieldByName('NAME_FACULTETA').AsString, Pointer(
            dm1.q2.FieldByName('COD_FACULTETA').AsInteger));
            inc(k);
            dm1.q2.Next;
          end;
        i:=i+k+1;
        q.Next;
      end;
    end;
  end;
  flag:=true;
end;
Нужно сделать еще для каждой дочерней записи свои дочерние записи
Ответить с цитированием
  #19  
Старый 02.03.2012, 07:58
Vocabulary Vocabulary вне форума
Новичок
 
Регистрация: 17.09.2009
Сообщения: 85
Репутация: 9
По умолчанию

"Дочерние записи" всех уровней надо создавать в рекурсивной процедуре.
Ответить с цитированием
Этот пользователь сказал Спасибо Vocabulary за это полезное сообщение:
vivazz (06.03.2012)
  #20  
Старый 02.03.2012, 08:20
vivazz vivazz вне форума
Прохожий
 
Регистрация: 05.05.2011
Сообщения: 14
Репутация: 10
По умолчанию

Приведите пример кода для 2-3 вложений
Ответить с цитированием
  #21  
Старый 02.03.2012, 08:48
Vocabulary Vocabulary вне форума
Новичок
 
Регистрация: 17.09.2009
Сообщения: 85
Репутация: 9
По умолчанию

Пример кода для любого уровня вложний:
Код:
procedure TForm4.FillTree;
var
  TN : TTreeNode;

  procedure FillNode(aTN : TTreeNode; IDN : Integer);
  var
    TN : TTreeNode;
    qr: TIBQuery;
  begin
    qr := TIBQuery.Create(Self);
    qr.Database := DM.IBDatabase1;
    try
      qr.SQL.Text := 'select * from catalog where IDParent = '+IntToStr(IDN);
      qr.Open;
      while not qr.Eof do begin
        TN := Tree.Items.AddChildObject(aTN, qr.FieldValues['Name'],
                               TObject(qr.FieldByName('ID').AsInteger));
        FillNode(TN, qr.FieldValues['ID']);
        qr.Next;
      end;
    finally
      qr.Close;
      qr.Free;
    end;
  end;

begin
  Tree.Items.Clear;
  Tree.Items.BeginUpdate;
  try
    DM.qrTree.SQL.Text := 'select * from catalog where IDParent = 0';
    DM.qrTree.Open;

    while not DM.qrTree.Eof do begin
      TN := Tree.Items.AddObject(nil, DM.qrTree.FieldValues['Name'],
                            TObject(DM.qrTree.FieldByName('ID').AsInteger));
      FillNode(TN, DM.qrTree.FieldValues['ID']);
      TN.Expand(True);
      DM.qrTree.Next;
    end;
    DM.qrTree.Transaction.Commit;
    DM.qrTree.Close;
  finally
    Tree.Items.EndUpdate;
  end;
end;
Надеюсь, компоненты из IBX не сложно заменить на компоненты из ADO.
Ответить с цитированием
Этот пользователь сказал Спасибо Vocabulary за это полезное сообщение:
vivazz (02.03.2012)
  #22  
Старый 02.03.2012, 10:19
vivazz vivazz вне форума
Прохожий
 
Регистрация: 05.05.2011
Сообщения: 14
Репутация: 10
По умолчанию

Пока не пойму как код работает. Это отдельная процедура, которая будет идти после создания родителя? и вызываться до тех пор пока не закончатся родители?
Ответить с цитированием
  #23  
Старый 02.03.2012, 10:45
Vocabulary Vocabulary вне форума
Новичок
 
Регистрация: 17.09.2009
Сообщения: 85
Репутация: 9
По умолчанию

Эта процедура (FillTree) заполняет TreeView от начала до конца.
Но, для того чтобы ее идею применить в вашем проекте надо вначале сделать структуру таблиц, которая бы отвечала требованиям.
В структуре таблиц вашей базы нет ничего чтобы указывало на принадлежность формы обучения к факультету (слова: "И ДР." ни о чем не говорят). Это не позволит составить первый и второй уровень дерева.

"Тренироваться" на одной таблице, когда в плане формирование дерева из трех таблиц - затея бессмысленная.

После опубликования примера кода стало понятно, что уровни дерева в вашей БД - это разные таблицы, а пример "заточен" на данные из одной таблицы.
Отсюда вывод: пример не подходит. Для формирования дерева из таблиц БД нужно просто три вложенных цикла:
1 - факультеты
2 - группы внутри
3 - студенты внутри группы
Чтобы сформировать дерево в этих условиях в структуре таблиц нужно иметь ссылки из одной таблицы на строки из другой.
группы (формы обучения) должны иметь ссылку на строку из табл. факультеты, студенты, в свою очередь, должны иметь ссылку на группу (но вроде бы она есть в виде кода формы обучения).
Под ссылками подразумеваются целочисленные коды (или, как принято говорить, идентификаторы строк).

Последний раз редактировалось Vocabulary, 02.03.2012 в 10:49.
Ответить с цитированием
Этот пользователь сказал Спасибо Vocabulary за это полезное сообщение:
vivazz (02.03.2012)
  #24  
Старый 02.03.2012, 11:00
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Vocabulary
После столь развернутого объяснения я бы вам рекомендовал изменить свой статус с Новичка на Магистра.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #25  
Старый 02.03.2012, 11:17
vivazz vivazz вне форума
Прохожий
 
Регистрация: 05.05.2011
Сообщения: 14
Репутация: 10
По умолчанию

Для Вида:
Факультет
-Группы
Факультет
-Группы
У меня получилось.

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


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:51.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter