pva
28-11-2008, 13:58
начится так. Вот минипрограмка, которая отображает запросы SQL в виде дерева. Для запуска:
1. Соберите (Borland C++ Builder 6.0)
2. Тыкните на tree_table.udl и введите настройки соединения
3. Отредактируйте файлик tree_table.sql с запросами. Файл состоит из 2-х списков, ограниченных тэгами <root>..</root>. Внутри тэг <key>..</key> задаёт название, <sql>..</sql> запрос. Текст мезду тегами воспринимается "буквально", т.е. без пропуска пробелов и переводов строк. Первый список задаёт корни дерева, второй - все остальные ветки. Запрос должен возвращать поля:
1. Ключ следующей записи <key> во втором списке <root>, либо пустая строчка, если не раскрывать
2. ИД записи (используется declare @parent_id integer; set @parent_id=ИД; перед запросом, взятым по ключу <key>)
3. Картинка, соотвествующая ветке (игнорируется)
4. Текст, соответсвующий ветке
В тексте запроса во втором списке <root> можно применять переменную @parent_id. Перед <key> и <sql> можно оставлять комментарий
<root>
<key>Тип поиска 1</key>
<sql>
select
'table2.table1_id' as next,
id as id,
'1.bmp' as image,
text as text
from
table1
order by
text
</sql>
<key>Тип поиска 2</key>
<sql>
select
'table2.table3_id' as next,
id as id,
'1.bmp' as image,
text as text
from
table3
order by
text
</sql>
</root>
<root>
<key>table2.table1_id</key>
комментарий
<sql>
select
'table4.table2_id' as next,
id as id,
'2.bmp' as image,
text as text
from
table2
where
table1_id = @parent_id
order by
text
</sql>
<key>table3.table1_id</key>
<sql>
select
'' as next,
id as id,
'3.bmp' as image,
text as text
from
table3
where
table1_id = @parent_id
order by
roomOrd
</sql>
<key>table4.table2_id</key>
<sql>
select
'' as next,
id as id,
'4.bmp' as image,
text as text
from
table4
where
table2_id = @parent_id
order by
text
</sql>
</root>
Всё замечательно, но теперь вопрос: хочу сделать возможность двигаться по различным направлениям, а не по одному только. Например: пусть есть пользователи, у которых группа, должность, и рабочее место. Чтобы можно было:
1. выбрать "должность", "группа" или "рабочие места" (как в верхнем выпадающем списке в программе выше)
2. допустим выбрали должность. И выбрали из списка какую
3. выбрать "группа" или "рабочие места"
4. допустим выбрали "группа" и из списка групп с такой должностью выбрали одну группу.
5. осталось "рабочие места" - выбрали рабочее место
6. получили список пользователей
Как соединять запросы SQL? Нужна идея, желательно хитрая
1. Соберите (Borland C++ Builder 6.0)
2. Тыкните на tree_table.udl и введите настройки соединения
3. Отредактируйте файлик tree_table.sql с запросами. Файл состоит из 2-х списков, ограниченных тэгами <root>..</root>. Внутри тэг <key>..</key> задаёт название, <sql>..</sql> запрос. Текст мезду тегами воспринимается "буквально", т.е. без пропуска пробелов и переводов строк. Первый список задаёт корни дерева, второй - все остальные ветки. Запрос должен возвращать поля:
1. Ключ следующей записи <key> во втором списке <root>, либо пустая строчка, если не раскрывать
2. ИД записи (используется declare @parent_id integer; set @parent_id=ИД; перед запросом, взятым по ключу <key>)
3. Картинка, соотвествующая ветке (игнорируется)
4. Текст, соответсвующий ветке
В тексте запроса во втором списке <root> можно применять переменную @parent_id. Перед <key> и <sql> можно оставлять комментарий
<root>
<key>Тип поиска 1</key>
<sql>
select
'table2.table1_id' as next,
id as id,
'1.bmp' as image,
text as text
from
table1
order by
text
</sql>
<key>Тип поиска 2</key>
<sql>
select
'table2.table3_id' as next,
id as id,
'1.bmp' as image,
text as text
from
table3
order by
text
</sql>
</root>
<root>
<key>table2.table1_id</key>
комментарий
<sql>
select
'table4.table2_id' as next,
id as id,
'2.bmp' as image,
text as text
from
table2
where
table1_id = @parent_id
order by
text
</sql>
<key>table3.table1_id</key>
<sql>
select
'' as next,
id as id,
'3.bmp' as image,
text as text
from
table3
where
table1_id = @parent_id
order by
roomOrd
</sql>
<key>table4.table2_id</key>
<sql>
select
'' as next,
id as id,
'4.bmp' as image,
text as text
from
table4
where
table2_id = @parent_id
order by
text
</sql>
</root>
Всё замечательно, но теперь вопрос: хочу сделать возможность двигаться по различным направлениям, а не по одному только. Например: пусть есть пользователи, у которых группа, должность, и рабочее место. Чтобы можно было:
1. выбрать "должность", "группа" или "рабочие места" (как в верхнем выпадающем списке в программе выше)
2. допустим выбрали должность. И выбрали из списка какую
3. выбрать "группа" или "рабочие места"
4. допустим выбрали "группа" и из списка групп с такой должностью выбрали одну группу.
5. осталось "рабочие места" - выбрали рабочее место
6. получили список пользователей
Как соединять запросы SQL? Нужна идея, желательно хитрая