Войти

Показать полную графическую версию : Нужна идея - SQL Browser


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? Нужна идея, желательно хитрая

pva
01-12-2008, 12:10
пока остановился на условной трансляции SQL с тасканием за собой параметров трансляции. Типа того:

select <top>top <top_value></top>
<count>count(*)</count>
<no_count>
'' as next,
id as id,
'4.bmp' as image,
text as text
</no_count>
from
table4
where
<field1>field1=<field1_value></field1>
<field2><field1>and</field1> field2=<field2_value></field2>

В качестве меток транслятора пока подобие тегов, хотя можно было директивы сишного препроцессора. Или может урезанное подобие php лучше сделать, или ещё как? Критерий: чтобы читалось легко.

pva
23-01-2009, 12:14
остановил выбор всё же на тэгах типа html,xml. Причёсываю "язык". Возник такой вопрос: сколько раз sql-сервер сделает проверку @parentId is null и @like is null в следующием коде, который вываливает табличку из 1000 строчек:

declare @parentId integer; --set @parentId=397;
declare @like varchar(10);

select top 11
'waresGroup.parentId' as next,
str(id,8,0) as id,
'1.bmp' as image,
name
from
waresGroup
where
((@parentId is null and parentId is null) or parentId=@parentId) and enabled=1
and (@like is null or name like @like)
union
select top 11
'' as next,
'W' + str(id,8,0),
'2.bmp' as image,
name
from
wares
where
((@parentId is null and waresGroupId is null) or waresGroupId=@parentId) and enabled=1
and (@like is null or name like @like)

один раз или 1000 в каждой строчке? Если догадается, что это условие не меняется, то оставлю запрос как есть, если это не оптимизируется, то буду допридумывать, чтобы уходил уже оптимизированный запрос




© OSzone.net 2001-2012