Динамическое построение WHERE-части запроса

Обсуждение возникших проблем, предложений и ошибок UniDAC компонентов
Закрыто
Akella
Сообщения: 217
Зарегистрирован: Пн 02 апр 2012 14:41

Динамическое построение WHERE-части запроса

Сообщение Akella » Ср 11 апр 2012 21:54

Приветствую.
Я почитал в справке про макросы, но это немного не то, как я понял.

Хочется чего-то светлого, большого такого, с помощью чего можно строить часть запроса (where) динамически (включать/отключать/добавлять/удалять секции), не заботясь о том, нужно ли добавлять/удалять само слово where, есть ли уже та или иная секция в where или нету. Может это уже реализовано, но я об этом не знаю?

Я работаю с fibplus компонентами и там есть такое понятие как conditions.

Вот пример моего кода с использованием conditions:

Код: Выделить всё

  with dm.tAds do
  begin
    close;
    Conditions.CancelApply;
    Conditions.Clear;

    Conditions.AddCondition('dt_start', sDtFilertFieldName + ' >= :date_start', (not VarIsNull(dtStart.EditValue)));
    Conditions.AddCondition('dt_end', sDtFilertFieldName + '  0);

    Conditions.Apply;

    if ParamExist('date_start', iParam) then
      ParamByName('date_start').AsDateTime := dtStart.EditValue;

    if ParamExist('date_end', iParam) then
      ParamByName('date_end').AsDateTime := dtEnd.EditValue;

    if ParamExist('AD_NUM', iParam) then
      ParamByName('AD_NUM').AsInteger := edNumAd.EditValue;

    open;
end;// with

...
как видите, я нигде не проверяю есть ли уже в запросе where или нету

есть такой функционал у TUniQuery?

спасибо

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Сообщение AndreyZ » Чт 12 апр 2012 09:38

Здравствуйте,

Вы можете использовать метод TUniQuery.AddWhere . Например:

Код: Выделить всё

UniQuery.SQL.Text := 'select * from table';
UniQuery.AddWhere('id > :id1');
UniQuery.AddWhere('id < :id2');
UniQuery.ParamByName('id1').AsInteger := 10;
UniQuery.ParamByName('id2').AsInteger := 50;
UniQuery.Open;
Также, для динамического построения запросов Вы можете использовать следующие методы : SetOrderBy, FilterSQL, DeleteWhere, BaseSQL, FinalSQL, RestoreSQL. За более подробной информацией обратитесь пожалуйста к документации UniDAC.

Akella
Сообщения: 217
Зарегистрирован: Пн 02 апр 2012 14:41

Сообщение Akella » Чт 12 апр 2012 11:03

спасибо, это, наверное, то что нужно :!:

Akella
Сообщения: 217
Зарегистрирован: Пн 02 апр 2012 14:41

Сообщение Akella » Пт 13 апр 2012 14:20

А если я добавил 3 условия, то как можно удалить только второе?

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Сообщение AndreyZ » Вт 17 апр 2012 13:07

UniDAC не имеет данной функциональности, Вы можете удалить только весь блок WHERE используя метод DeleteWhere.

Akella
Сообщения: 217
Зарегистрирован: Пн 02 апр 2012 14:41

Сообщение Akella » Вт 17 апр 2012 13:28

Да, я это уже понял :(

Закрыто