|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
|||
|
|||
Нет, у меня 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
|
|||
|
|||
Цитата:
Вот этот код: Код:
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
|
|||
|
|||
Привожу полный код процедуры:
Код:
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
|
|||
|
|||
"Дочерние записи" всех уровней надо создавать в рекурсивной процедуре.
|
Этот пользователь сказал Спасибо Vocabulary за это полезное сообщение: | ||
vivazz (06.03.2012)
|
#20
|
|||
|
|||
Приведите пример кода для 2-3 вложений
|
#21
|
|||
|
|||
Пример кода для любого уровня вложний:
Код:
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; |
Этот пользователь сказал Спасибо Vocabulary за это полезное сообщение: | ||
vivazz (02.03.2012)
|
#22
|
|||
|
|||
Пока не пойму как код работает. Это отдельная процедура, которая будет идти после создания родителя? и вызываться до тех пор пока не закончатся родители?
|
#23
|
|||
|
|||
Эта процедура (FillTree) заполняет TreeView от начала до конца.
Но, для того чтобы ее идею применить в вашем проекте надо вначале сделать структуру таблиц, которая бы отвечала требованиям. В структуре таблиц вашей базы нет ничего чтобы указывало на принадлежность формы обучения к факультету (слова: "И ДР." ни о чем не говорят). Это не позволит составить первый и второй уровень дерева. "Тренироваться" на одной таблице, когда в плане формирование дерева из трех таблиц - затея бессмысленная. После опубликования примера кода стало понятно, что уровни дерева в вашей БД - это разные таблицы, а пример "заточен" на данные из одной таблицы. Отсюда вывод: пример не подходит. Для формирования дерева из таблиц БД нужно просто три вложенных цикла: 1 - факультеты 2 - группы внутри 3 - студенты внутри группы Чтобы сформировать дерево в этих условиях в структуре таблиц нужно иметь ссылки из одной таблицы на строки из другой. группы (формы обучения) должны иметь ссылку на строку из табл. факультеты, студенты, в свою очередь, должны иметь ссылку на группу (но вроде бы она есть в виде кода формы обучения). Под ссылками подразумеваются целочисленные коды (или, как принято говорить, идентификаторы строк). Последний раз редактировалось Vocabulary, 02.03.2012 в 10:49. |
Этот пользователь сказал Спасибо Vocabulary за это полезное сообщение: | ||
vivazz (02.03.2012)
|
#24
|
||||
|
||||
Vocabulary
После столь развернутого объяснения я бы вам рекомендовал изменить свой статус с Новичка на Магистра. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#25
|
|||
|
|||
Для Вида:
Факультет -Группы Факультет -Группы У меня получилось. А вот еще одно вложение никак не получается сделать. Тут не обязательно делать идентификаторы, можно обойтись без них, но для этого нужно правильно составить добавление еще одних дочерних записей для Группы...вот это пока у меня не получается |