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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.03.2010, 14:22
Аватар для segas
segas segas вне форума
Новичок
 
Регистрация: 08.02.2009
Сообщения: 97
Репутация: 10
Восклицание treeView

Доброго времени суток уважаемые форумчани
Подскажите пожалуйста как вывести парадоксавскую таблицу при помощи treeView уже очень долго парюсь над этой задачей и разными способами проповал, но все что то никак не выходит
Вот сама таблица пользователь.rar
Состоит из полей(ИД, ФАМИЛИЯ, ПРЕДПРИЯТИЕ, ЦЕХ, ОТДЕЛ, Должность)
1 уровень ПРЕДПРИЯТИЕ
2 уровень ЦЕХ
3 уровень ОТДЕЛ
4 уровень ФАМИЛИЯ (Должность)
Подскажите пожалуйста как быть
Ответить с цитированием
  #2  
Старый 26.03.2010, 14:29
Аватар для segas
segas segas вне форума
Новичок
 
Регистрация: 08.02.2009
Сообщения: 97
Репутация: 10
Подмигивание

Если можно то желательно с коментариями
Заранее благодарен.
Ответить с цитированием
  #3  
Старый 26.03.2010, 16:25
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, для начала, неплохо было бы почитать о том, как проектировать БД. Т.е. твою одну таблицу надо привести к 3й НФ. Т.е. это должно быть 5 таблиц.

А выводить просто - тебе надо написать процку, которая будет находить нужный родительский узел, а потом просто добалять в него потомков. Для внутренней идентификации можно попробовать использовать свойство Data для указания типа узла (предприятие, отдел и т.д.).

Если по простому, то где-то так:
Код:
function TForm1.FindTypedNode(AType : Integer; ACaption : String) : TTreeNode;
var
  I : Integer;
begin
  Result := Nil;
  For I := 0 To TreeView1.Items.Count-1 Do
    If (Integer(TreeView1.Items[i].Data) =  AType) And 
       (ACaption = TreeView1.Items[i].Caption) Then
      Begin
        Result := TreeView1.Items[i];
        Break;
      End;
end;

function TForm1.CreateTypedNode(AParent : TTreeNode; AType : Integer; ACaption  :String) : TTreeNode;
begin
  Result := TreeView1.Items.AddChild(AParent,ACaption);
  Result.Data := Pointer(AType);
end;

procedure TForm1.AddNode(APredpr, ACeh, AOtdel, AFIO);
var
  APNode : TTreeNode;
  ACNode : TTreeNode;
  AONode : TTreeNode;
  AFNode : TTreeNode;
begin
  APNode := FindTypedNode(1,APredpr);
  If APNode = Nil Then APNode := CreateTypedNode(Nil,1,APredpr);

  ACNode := FindTypedNode(2,ACeh);
  If ACNode = Nil Then ACNode := CreateTypedNode(APNode,2,ACeh);

  AONode := FindTypedNode(3,AOtdel);
  If AONode = Nil Then AONode := CreateTypedNode(ACNode,3,AOtdel);

  AFNode := FindTypedNode(4,AFIO);
  If AFNode = Nil Then AFNode := CreateTypedNode(AONode,4,AFIO);
end;

Код довольно "грязный" и не оптимальный, но идея должна быть понятна.
Ответить с цитированием
  #4  
Старый 26.03.2010, 17:11
Аватар для segas
segas segas вне форума
Новичок
 
Регистрация: 08.02.2009
Сообщения: 97
Репутация: 10
Вопрос

А можно как нибудь на весь модуль глянуть?
и желательно с комментариями , если конечно же не трудно...
Просто я новичек в этом деле и не все еще понимаю

И еще вопросик, а без нормализации никак?
прост в дальнейшем у каждого сотрудника необходимо будет вывести оборудование закрепленное за ним, а там уйма таблиц
Ответить с цитированием
  #5  
Старый 26.03.2010, 22:11
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Да я только этот код то и написал. Даже не в дельфе, так что проверь именя свойств.

Без нормализации можно, но посуди сам. У тебя, например, 100 сотрудников. Так вот, у тебя будет повторено 100 раз название предприятия... А то, что будет еще 4 таблички - так это фигня, на самом деле. Вообще, уходи ты с этого парадокса... на FireBird, например.

Но пример написан под существующую таблицу. Это просто отдельная фкнуция, так что ее просто надо вызвать в нужном месте. Из обязательности, только то, что дерево называется TreeView1, и то, можно переделать на параметр...
Ответить с цитированием
  #6  
Старый 27.03.2010, 04:55
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Я люблю TreeView, очень хороший контрол.
А топикстартеру советую почитать вот эту 03088 статью в DRKB
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #7  
Старый 27.03.2010, 15:59
Аватар для segas
segas segas вне форума
Новичок
 
Регистрация: 08.02.2009
Сообщения: 97
Репутация: 10
Подмигивание

Вообщем я реализовал следующим образом
Код:
procedure TForm1.FormCreate(Sender: TObject);
var i1,i2,i3,i4,i5:integer;
    j1,j2,j3,j4:integer;
    k2,k3,k4,k5:integer;
    rc1,rc2,rc3,rc4:integer;
    s:string;

begin //построение дерева
TreeView1.Items.BeginUpdate;//запрет обновления
TreeView1.Items.Clear;   //очистка списка
k2:=0;k3:=0;k4:=0;k5:=0;
Query1.Active:=true; //подключение баз
Query1.First;

//--------------Первый уровень-------------
Query1.Filtered:=true;
rc1:=Query1.RecordCount;
for i1:=1 to rc1 do
   begin // ++i1
   s:=Query1PREDPRIATIE.AsString;
   TreeView1.Items.Add(nil,s);
   j1:=i1+k2+k3+k4+k5;
//--------------Второй уровень-------------

   rc2:=Query2.RecordCount;
   if rc2>0 then
      begin  // ++rc2
      Query2.First;
      for i2:=1 to rc2 do
       begin    //  ++i2
         s:=Query2CEX.AsString;
         TreeView1.Items.AddChild(TreeView1.Items.Item[j1-1],s);
         k2:=k2+1;
         j2:=i1+k2+k3+k4+k5;Query2.Next;
       end;
   //--------------Третий уровень-------------

   rc3:=Query3.RecordCount;
   if rc3>0 then
     begin  // ++rc3
      Query3.First;
      for i3:=1 to rc3 do
         begin    //  ++i3
         s:=Query3OTDEL.AsString;
      // if QuStrName.AsString<>'' then s:=s+' ('+QuStrName.AsString+')';
         TreeView1.Items.AddChild(TreeView1.Items.Item[j2-1],s);
         k3:=k3+1;
         j3:=i1+k2+k3+k4+k5;Query3.Next;
         End;
//--------------Четвертый уровень-------------

     rc4:=Query4.RecordCount;
     if rc4>0 then
      begin  // ++rc4
      Query4.First;
      for i4:=1 to rc4 do
       begin    //  ++i4
       s:=Query4FAMILIA.AsString;
       TreeView1.Items.AddChild(TreeView1.Items.Item[j3-1],s);
       k4:=k4+1;
       j4:=i1+k2+k3+k4+k5;Query4.Next;
//     Query1.Next;  Query2.Next;Query3.Next;
       end;
      end;
     end;
 End;

end;

TreeView1.Items.EndUpdate;//разрешение обновления
Только выводит он не все( цех раскрывается только 1 (последний) ) отдел от последнего цеза нормально выводит сотрудников

подскажите где ошибся
Ответить с цитированием
  #8  
Старый 28.03.2010, 16:56
Аватар для segas
segas segas вне форума
Новичок
 
Регистрация: 08.02.2009
Сообщения: 97
Репутация: 10
По умолчанию

Никто не знает?
Ответить с цитированием
  #9  
Старый 28.03.2010, 19:43
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Честно говоря, за такой код руки надо отрывать. И никто не хочет в нем разбираться. Я же тебе дал процедуры создания узлов дерева. Там просто проходишь по всем записям и вызываешь эту процку с соотв. параметрами. Она тебе дерево и построит.
Ответить с цитированием
  #10  
Старый 01.04.2010, 12:54
Аватар для segas
segas segas вне форума
Новичок
 
Регистрация: 08.02.2009
Сообщения: 97
Репутация: 10
Подмигивание

Цитата:
Сообщение от lmikle
Честно говоря, за такой код руки надо отрывать. И никто не хочет в нем разбираться. Я же тебе дал процедуры создания узлов дерева. Там просто проходишь по всем записям и вызываешь эту процку с соотв. параметрами. Она тебе дерево и построит.


Вообщем реализовал следующим образом:

Код:
 TreeView1.Items.Clear;
 Query1.First;
 ndApt:=TreeView1.Items.Add(nil,Query1PREDPRIATIE.Value);
 
Query2.First;
    for i:=1 to Query2.RecordCount do begin
    nd1:=TreeView1.Items.AddChild(ndApt, Trim(Query2CEX.Value));

   Query3.First;
       for j:=1 to Query3.RecordCount do begin
       nd2:=TreeView1.Items.AddChild(nd1, Trim(Query3OTDEL.Value));

       Query4.First;
         for k:=1 to Query3.RecordCount do begin
         nd3:=TreeView1.Items.AddChild(nd2, Trim(Query4FAMILIA.Value));

       Query4.Next;
       end;

     Query3.Next;
     end;
 Query2.Next;
 end;
Query1.Next;

А Этот код тоже считается "ГРЯЗНЫМ"?
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter