Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Нужна идея - SQL Browser (http://forum.oszone.net/showthread.php?t=124393)

pva 28-11-2008 13:58 966277

Нужна идея - SQL Browser
 
начится так. Вот минипрограмка, которая отображает запросы 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 968858

пока остановился на условной трансляции 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 1016747

остановил выбор всё же на тэгах типа 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 в каждой строчке? Если догадается, что это условие не меняется, то оставлю запрос как есть, если это не оптимизируется, то буду допридумывать, чтобы уходил уже оптимизированный запрос


Время: 14:50.

Время: 14:50.
© OSzone.net 2001-