2015-10-14 2 views
-4

это финал, но уже не фильтрует
кто имеет представление о моей проблеме фильтраДелая ADOQuery фильтра с ListBox элементами

begin 
adoquery1.SQL.CLEAR; 
adoquery1.SQL.Add('select * FROM gunsonu '); 
adoquery1.SQL.Add('where TARIH like :TRH'); 
adoquery1.Parameters.ParamByName('TRH').Value:=(PlannerDatePicker1.text); 

for i := 0 to form3.ListBox1.Items.Count-1 do 
adoquery1.SQL.Add(' and VLIM <> '+QuotedStr(form3.ListBox1.items[i])); 
end; 
adoquery1.Open; 
frxReport1.ShowReport(true); 
+0

Когда вы говорите «cant», вы имеете в виду, что ваш код выполняется, но adoquery1 не возвращает никаких строк? Наиболее повод для этого состоит в том, что ваши элементы списка не содержат никаких «%» подстановочных знаков. Если это не так, это работает так же, как у вас есть знак «=» вместо «как». – MartynA

+0

Кроме того, если столбцы, которые вы пытаетесь сопоставить с элементами списка, являются столбцами символов, вы должны окружать «form3.ListBox1.items [i]» на «QuotedStr()» – MartynA

+0

Я пытаюсь использовать его, но он уже является фильтром пустым: ( начинают adoquery1.SQL.CLEAR; adoquery1.SQL.Add ('SELECT * FROM gunsonu '); adoquery1.SQL.Add (' где Тарих как: ТРГ'); adoquery1.Parameters.ParamByName ('TRH'). Значение: = (PlannerDatePicker1.text); для i: = 0 to form3.ListBox1.Items.Count-1 do adoquery1.SQL.Add ('и VLIM =' + QuotedStr (form3.ListBox1.Items [я])); конец; adoquery1.Open; frxReport1.ShowReport (true); конец; –

ответ

1

Лучшим способом для настройки запросов из приложения Delphi против ISN MS SQL Server» t сохранить модификацию кода в приложении, которое создает запрос до его запуска, возвращает результаты, на которые вы надеетесь. Одна из проблем, связанных с быстрым циклом компиляции/запуска Delphi, заключается в том, что она поощряет проб и ошибок, а это не может заменить работу.

Это лучше отделить SQL-построения задачи из кодирования одной по двум причинам:

  1. Клиентские утилиты SQL Server (например, SQL Server Management Studio или старый ISQL/W «Query Analyzer ») являются лучшими инструментами для задачи Sql-construction, они имеют доступ к плану выполнения сервера, профилировщику и т. д. Но если у вас нет одного из доступных на протяжении многих лет, Delphi включил какой-то« проводник данных » «утилита для запуска запросов на разных серверах - в последних версиях XE есть Firedac один под FireDac | Explorer из меню IDE.

  2. Используя один из этих инструментов, у вас есть запрос Sql, который фактически отправляется на сервер прямо на экране перед вами. Частым источником ошибок при попытке установить Sql в коде Delphi, особенно для новичков, является то, что запрос Sql, отправленный на сервер, не обязательно является тем, что вы предполагаете. Судя по примерам, которые появляются в qs на SO, они часто пронизаны синтаксическими или семантическими ошибками, особенно когда Sql должен содержать кавычки (окна Watch and Evaluate в Delphi IDE не обеспечивают хорошую форму для просмотра Sql). Создавая запрос в инструменте запросов Sql, вы получаете возможность точно увидеть, что такое запрос, и получить обратную связь от инструмента о синтаксических ошибках и т. Д.

  3. С помощью этих инструментов проще экспериментировать с наилучшим способом для параметризации вашего запроса.

В чем смысл 3? Одна вещь состоит в том, что параметризованные запросы обычно лучше оптимизируются сервером, чем специальные, хотя, по общему признанию, не все запросы могут быть выражены в параметризованной форме (например, вы не можете параметризовать, какой столбец или таблицу вы запрашиваете) , Другое дело, что это помогает минимизировать воздействие Sql-Injection (см. https://en.wikipedia.org/wiki/SQL_injection).

После того, как ваш запрос работает так, как вы ожидаете, на клиентском инструменте Sql, таком как те, что указаны выше, настало время написать код для его выполнения из вашего приложения Delphi, а не раньше.

Смежные вопросы