Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Конструктор запросов [D6, IB6.x, MSSQL, dBase, FoxPro, Paradox]


msguns ©   (2004-11-11 17:37:00) 

Приходится частенько сталкиваться с необходимостью модификации уже готовых запросов в ран-тайме. Например при кодировании поисков, сортировок и т.д. в отображаемых датасетах. К сожалению, в используемых классах (потомки TDataSet) нет никаких средств для облегчения (типа коллекций ключей WHERE или ORDER BY) доступа к "телу" запроса и приходится его (запрос) тупо парсировать на предмет коррекции предикатов. А есть еще параметры, которые при модификации св-ва SQL сбрасываются и их надо по-новой выставлять из предварительно сохраненных и т.д.
В общем, идея, думаю, понятна.

Предлагаю поделиться опытом в этой области.


msguns   (2004-11-11 18:40:00) [1]

>Vlad ©   (11.11.04 18:11) [4]
>by ©   (11.11.04 18:22) [6]

Да-да, что-то типа этого и я делаю, НО...
Трабла в том, что при разработке хочется вставлять готовые работающие запросы (я их делаю в IBExpert`e, хоть кому-то и кажется это недостойным джидая) со всевозможными where и order by (и не только). Т.е. в момент опена формы у меня уже есть готовый сиквель. Для того, чтобы пользоваться упомянутой методикой, получается, надо все запросы изначально готовить в виде объектов классов, т.е. заполнять программно. Что, ИМХО, совсем не есть хорошо, т.к. пропадает всякая наглядность кода.
Пихать всю выборку на сервер в виде ХП и вьюнов тоже не желательно, т.к. мне же потом с этой базой дружить, а если там на 12 таблов будет 100 вьюшек и 120 хапуг, то как мне потом разруливать всем этим хозяйством случись быть апдэйте структурам.


by   (2004-11-11 18:22:00) [2]

Я делал подобное как Vlad, но только без класса.
Есть переменные типа sSelect, sFrom, sWhere, sOrderBy и перед открытием запроса срабатывает процедура makeSQL, которая и собирает текст запроса при каждом его открытии.


Ega23   (2004-11-11 18:14:00) [3]

Насколько я понял, проблема в фильтрации и сортировки набора данных? Или что?


Vlad   (2004-11-11 18:11:00) [4]


> msguns ©   (11.11.04 17:37)  

была недавно похожая задача, правда подразумевалось что запрос у меня простой, т.е. без вложенных select'ов
Не знаю лучший способ я выбрал или нет, но сделал класс, в котором были свойства:
SelectText, WhereText, OrderByText, GroupByText, а так же свойство типа TList - набор параметров (я использовал только параметризированные запросы). Каждый параметр - record, содержащий поля: имя, тип, значение, метод сравнения (<,>,=, <>, in,between, etc). Значение параметра задал как Variant, для того чтобы можно было использовать как одно значение, так и несколько (VarArray) на случай конструкций where field in (...)
Ну и соотв. методы AddParam, DelParam, CreateSql, вобщем в таком духе..
Может способ и не лучший, но во всяком случае избавляет от необходимости парсинга запроса.


}|{yk   (2004-11-11 18:06:00) [5]

Ну бывает ми просто стринг.


msguns   (2004-11-11 18:03:00) [6]

>}|{yk ©   (11.11.04 17:48) [1]

А зачем блоб-то ? У тебя что, запросы-небоскребы, в простой стринг (32К) не влазят ? Или парадокс/dbf ?


}|{yk   (2004-11-11 17:48:00) [7]

Ну я сам текст первичного запроса кидаю в блоб-поле, а потом по ситуации.


Наверх

Титульная страница Поиск, карта сайта Написать письмо