Как ПРАВИЛЬНО работать с Conditions.Enable/Disable?

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

Как ПРАВИЛЬНО работать с Conditions.Enable/Disable?

Сообщение Akella » Сб 29 фев 2020 16:06

Не смог найти в справке и в документации некоторые ответы на мои вопрос. Например, как правильно использовать UniQuery.Conditions.Enable/Disable у функционала условий.

Не до конца понятно: если несколько раз добавляешь условия, то нужно ли перед этим вызывать Disable?

Достаточно ли просто того, что я вызову UniQuery.Conditions.Enable перед UniQuery.Open? Или обязательно/желательно выполнить такую проверку:
UniQuery.Conditions.Count > 0 then
UniQuery.Conditions.Enable;
UniQuery.Conditions.Enable нужно вызывать только после построения всех условий и перед Open или Conditions.Enable нужно/можно вызывать перед началом добавления условий?

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

Re: Как ПРАВИЛЬНО работать с Conditions.Enable/Disable?

Сообщение Akella » Сб 29 фев 2020 16:21

Ещё вопрос.
Нормально ли вызывать UniQuery.Conditions.Enable несколько раз подряд перед тем, как вызвать Open?

Почему такой вопрос.
Предыстория.
Есть код добавления условий с параметрами.

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

    if DateTimePicker1.DateTime <> 0 then
      qData.Conditions.Add('lcd_min','A.LCD >= :LCDMIN', True);
      
    if DateTimePicker2.DateTime <> 0 then
      qData.Conditions.Add('lcd_max','A.LCD <= :LCDMAX', True);
Как я понял, то в SQL-запрос датасета параметры попадают только после вызова UniQuery.Conditions.Enable.
Таким образом получается, что условие приходится добавлять как бы дважды. Первый раз добавляешь условие с параметром, а потом нужно ещё и параметр заполнить.

т.е. выполнить ещё одну проверку

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

    if Assigned(qData.Params.FindParam('LCDMIN')) then
      qData.ParamByName('LCDMIN').AsDateTime := DateTimePicker1.DateTime;
      
    if Assigned(qData.Params.FindParam('LCDMAX')) then
      qData.ParamByName('LCDMAX').AsDateTime := DateTimePicker2.DateTime;
я к тому, что было бы удобней так:

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

if DateTimePicker1.DateTime <> 0 then
begin
     qData.Conditions.Add('lcd_min','A.LCD >= :LCDMIN', True);
     qData.ParamByName('LCDMIN').AsDateTime := DateTimePicker.DateTime;
end;
Теперь возвращаемся к вопросу про множественный вызов метода Enable. А можно ли делать так:

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

qData.Close;

if DateTimePicker1.DateTime <> 0 then
begin
      qData.Conditions.Add('lcd_min','A.LCD >= :LCDMIN', True);
      UniQuery.Conditions.Enable;
     qData.ParamByName('LCDMIN').AsDateTime := DateTimePicker.DateTime;
end;

if DateTimePicker2.DateTime <> 0 then
begin
      qData.Conditions.Add('lcd_max','A.LCD <= :LCDMAX', True);
      UniQuery.Conditions.Enable;
      qData.ParamByName('LCDMAX').AsDateTime := DateTimePicker2.DateTime;     
end;      

UniQuery.Open;

ViktorV
Devart Team
Сообщения: 199
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Как ПРАВИЛЬНО работать с Conditions.Enable/Disable?

Сообщение ViktorV » Вт 03 мар 2020 15:41

Akella писал(а):
Сб 29 фев 2020 16:06
Не смог найти в справке и в документации некоторые ответы на мои вопрос. Например, как правильно использовать UniQuery.Conditions.Enable/Disable у функционала условий.

Не до конца понятно: если несколько раз добавляешь условия, то нужно ли перед этим вызывать Disable?

Достаточно ли просто того, что я вызову UniQuery.Conditions.Enable перед UniQuery.Open? Или обязательно/желательно выполнить такую проверку:
UniQuery.Conditions.Count > 0 then
UniQuery.Conditions.Enable;
UniQuery.Conditions.Enable нужно вызывать только после построения всех условий и перед Open или Conditions.Enable нужно/можно вызывать перед началом добавления условий?
Вы можете вызвать метод TUniQuery.Conditions.Enable без указанной вами проверки.

ViktorV
Devart Team
Сообщения: 199
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Как ПРАВИЛЬНО работать с Conditions.Enable/Disable?

Сообщение ViktorV » Вт 03 мар 2020 15:42

Akella писал(а):
Сб 29 фев 2020 16:21
Ещё вопрос.
Нормально ли вызывать UniQuery.Conditions.Enable несколько раз подряд перед тем, как вызвать Open?

Почему такой вопрос.
Предыстория.
Есть код добавления условий с параметрами.

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

    if DateTimePicker1.DateTime <> 0 then
      qData.Conditions.Add('lcd_min','A.LCD >= :LCDMIN', True);
      
    if DateTimePicker2.DateTime <> 0 then
      qData.Conditions.Add('lcd_max','A.LCD <= :LCDMAX', True);
Как я понял, то в SQL-запрос датасета параметры попадают только после вызова UniQuery.Conditions.Enable.
Таким образом получается, что условие приходится добавлять как бы дважды. Первый раз добавляешь условие с параметром, а потом нужно ещё и параметр заполнить.

т.е. выполнить ещё одну проверку

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

    if Assigned(qData.Params.FindParam('LCDMIN')) then
      qData.ParamByName('LCDMIN').AsDateTime := DateTimePicker1.DateTime;
      
    if Assigned(qData.Params.FindParam('LCDMAX')) then
      qData.ParamByName('LCDMAX').AsDateTime := DateTimePicker2.DateTime;
я к тому, что было бы удобней так:

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

if DateTimePicker1.DateTime <> 0 then
begin
     qData.Conditions.Add('lcd_min','A.LCD >= :LCDMIN', True);
     qData.ParamByName('LCDMIN').AsDateTime := DateTimePicker.DateTime;
end;
Теперь возвращаемся к вопросу про множественный вызов метода Enable. А можно ли делать так:

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

qData.Close;

if DateTimePicker1.DateTime <> 0 then
begin
      qData.Conditions.Add('lcd_min','A.LCD >= :LCDMIN', True);
      UniQuery.Conditions.Enable;
     qData.ParamByName('LCDMIN').AsDateTime := DateTimePicker.DateTime;
end;

if DateTimePicker2.DateTime <> 0 then
begin
      qData.Conditions.Add('lcd_max','A.LCD <= :LCDMAX', True);
      UniQuery.Conditions.Enable;
      qData.ParamByName('LCDMAX').AsDateTime := DateTimePicker2.DateTime;     
end;      

UniQuery.Open;
Для корректной работе с параметрами используемых в TDACondition достаточно единожды вызвать метод TDAConditions.Enable. Обратите внимание, при вызове метода метод TDAConditions.Disable все предварительно установленные значения параметров используемых в TDACondition сбросятся.

Ответить