Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2010, 19:38   #1
Wikly
 
Регистрация: 06.05.2010
Сообщений: 8
По умолчанию Иерархическая структура таблицы базы mdb

Доброго времени суток всем.

В процессе написания программы для работы с базой данных возникла такая проблема.

Имеется таблица со следующими полями и данными:

ID ParentID Name
1 0 Мониторы
2 1 Samsug
3 0 Процессоры
4 3 Athlon 100 mhz
5 0 Сетевые платы
6 5 Ethernet xxxx
7 5 Etherne 1xxx1

В программе эта таблица представлена в виде дерева - иерархии типа так:

-Компьютер
- Мониторы
- Samsung
- Процессоры
- Athlon 100 mhz
- Сетевые платы
- Ethernet xxxx
- Ethernet 1xxx1

-----------------------

Необходимо сделать таблицу такого вида

N Тип устройства Модель устройства
1 Мониторы Samsung
2 Процессоры Athlon 100 mhz
3 Сетевые платы Ethernet xxxx
Ethernet 1xxx1
4 ... ...

Вот и не пойму как можно сформировать такой список из той таблицы.
Думаю нужно сравнивать ParentID с ID и подставлять значение Name в нужную строку и в нужную колонку. т.е. если ParentID = 5 то значение Name нужно поставить напротив значения у которого ID = 5. но вот как это реализовать в коде программы даже не представлю...

Все работы с базой данных mdb произвожу с использованием ADO.

Может кто знает или сталкивался с таким вопросом подскажите как это можно реализовать. может есть примерные исходники для решения этой задачи.. Буду очень признателен. а то сроки горят...

Заранее благодарен.
Wikly вне форума Ответить с цитированием
Старый 07.05.2010, 10:29   #2
Dark_Spirit
Форумчанин
 
Аватар для Dark_Spirit
 
Регистрация: 05.02.2009
Сообщений: 324
По умолчанию

это первый запрос, назовём zp1
Код:
SELECT ob.id, ob.name
FROM ob
WHERE (((ob.parentid)=0));
это второй

Код:
SELECT zp1.id, zp1.name, ob.name
FROM zp1, ob
WHERE (((ob.parentid)=zp1.id));
во втором используется результат первого запроса, это всё можно создать в access-e
Тяжело быть бестолковым.....
Dark_Spirit вне форума Ответить с цитированием
Старый 07.05.2010, 11:40   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Странная структура БД для данной задачи. Зачем тут вообще дерево делать? Я бы сделал 2 таблицы:
1) Тип устройства (ИД, Наименование)
2) Устройство (ИД, Тип, Наименование)
Запрос в данном случае будет что-то вроде:
Код:
select устройство.ИД, тип_устройства.Наименование, устройство.Наименование
from устройство, тип_устройства
where (устройство.Тип = тип_устройства.ИД)
Лучше через inner join его конечно записать, но помнится у меня с объединениями проблемы какие-то были в Access.
Если нужна будет возможность более глубокой иерархии типа:
Код:
- Принтеры
  - Струйные
    - Samsung ...
    - ...
  - Лазерные
    - ...
    - ...
То легко переделываем первую таблицу под это, а запрос на выборку даже менять не придется. А вот вариант Dark_Spirit с такой иерархией работать не будет. Там всё достаточно сильно усложнится.
В общем, если возможно, лучше перепроектировать БД нормально под предметную область, т.к. сейчас данный момент реализован нехорошо.
pu4koff вне форума Ответить с цитированием
Старый 07.05.2010, 12:39   #4
Wikly
 
Регистрация: 06.05.2010
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Dark_Spirit Посмотреть сообщение
это первый запрос, назовём zp1
Код:
SELECT ob.id, ob.name
FROM ob
WHERE (((ob.parentid)=0));
это второй

Код:
SELECT zp1.id, zp1.name, ob.name
FROM zp1, ob
WHERE (((ob.parentid)=zp1.id));
во втором используется результат первого запроса, это всё можно создать в access-e
а можно по подробнее.. ну запрос я отправил, а далее не пойму
чего делать
Wikly вне форума Ответить с цитированием
Старый 07.05.2010, 12:50   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Так пойдёт?
Код:
SELECT t.ID, (select Name from Таблица1 where Таблица1.ID = t.ParentID) as Type, t.Name
FROM Таблица1 t
WHERE (parentID <> 0)
pu4koff вне форума Ответить с цитированием
Старый 07.05.2010, 14:57   #6
Wikly
 
Регистрация: 06.05.2010
Сообщений: 8
По умолчанию

пойдёт. а куда данные записываются? и как их отобразить в dbGrid
Наверное тупой вопрос, просто я впервые работаю с базами данных

Последний раз редактировалось Wikly; 07.05.2010 в 15:11.
Wikly вне форума Ответить с цитированием
Старый 07.05.2010, 15:15   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Никуда они не записываются. Это простой запрос на выборку. Кидаем в делфях на форму ADOQuery (или какой уж там компонент для этого предназначен), прописываем в CommandText этот запрос и привязываем к DBGrid'y. Инфы в сети навалом. Срисуйте какую-нибудь книжку с торрента по делфям и смотрите там примеры.
pu4koff вне форума Ответить с цитированием
Старый 07.05.2010, 22:55   #8
Wikly
 
Регистрация: 06.05.2010
Сообщений: 8
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
То легко переделываем первую таблицу под это, а запрос на выборку даже менять не придется. А вот вариант Dark_Spirit с такой иерархией работать не будет. Там всё достаточно сильно усложнится.
В общем, если возможно, лучше перепроектировать БД нормально под предметную область, т.к. сейчас данный момент реализован нехорошо.
Может подскажешь тогда, как эти две таблицы связать в treeView чтоб дерево отображалось? Буду очень признателен...

А то я пол инета обшарил нашел только такой способ:

Код:
  begin
IF TreeView1.Selected <> nil Then
   Begin
   ID:=Integer(TreeView1.Selected.Data);
   ADOQuery1.Close;
   ADOQuery1.SQL.Clear;
   DeclarePar1;
   ADOQuery1.SQL.Add('Select * From '+KompID+' Where ID=:ID');
   ADOQuery1.Parameters.ParamByName( 'ID').Value:=ID;
   ADOQuery1.Open;
   RID:= ADOQuery1.FieldByName('ID').AsInteger;
   ADOQuery1.Append;
   ADOQuery1.FieldByName('ParentID').Value:=RID;
   ADOQuery1.FieldByName('NAME').AsString:=NameAddDev;
   ADOQuery1.Post;
   ADOQuery1.Edit;
   ADOQuery1.FieldByName('NAME').AsString:=NameAddDev;
   if Stoimost <> 0 then
   ADOQuery1.FieldByName('DATA').AsString:=DataAdd;
   ADOQuery1.Post;
 TreeView1.Items.AddChildObject(TreeView1.Selected,   //AddChildObject
 NameAddDev
 ,Pointer(ADOQuery1.FieldByName('ID').AsInteger));
   TreeView1.Repaint;
   End;
  fin:
end;
ну это процедура добавления элемента в дерево...

Я и сам думаю что можно сделать интереснее. но вот как это сделать не представлю.. Может имеются подобные исходники???

Последний раз редактировалось Wikly; 07.05.2010 в 23:02.
Wikly вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Древовидная структура таблицы в гриде AK BULLETS Общие вопросы Delphi 3 21.03.2010 02:51
Структура Базы Данных jeka5555 PHP 12 30.03.2009 07:46
Структура таблицы Proof БД в Delphi 8 29.12.2008 20:24
структура таблицы базы данных с именем WORKER Vollmond36 Помощь студентам 1 01.12.2008 22:20