Запрос ADOQuery в Делфи не видит параметр и не выполняется

Мне нужно сделать запрос на выборку записей по условию что поле с именами Дизайнеров не пустое и выводиться должны заказы за текущий месяц (т.е. у меня двойное условие). Вроде прописала все, но ошибку выдает.
procedure TForm1.Button1Click(Sender: TObject);
var  data1, data2: TDateTime;
     Im: string;
begin
VypolnDizajner.Active:=false;
VypolnDizajner.SQL.Text := 'SELECT Data, Дизайнер, ВидПолиграфии, Описание, Стоимость, Себестоимость,Прибыль FROM ZakazPoligraf WHERE Im>'' and  Data between :data1 and :data2';
VypolnDizajner.Parameters.ParamByName('Im').Value := Tzakaz.FieldByName('Дизайнер').AsString;
VypolnDizajner.Parameters.ParamByName('data1').Value := DateTimePicker1.DateTime;
VypolnDizajner.Parameters.ParamByName('data2').Value := DateTimePicker2.DateTime;
VypolnDizajner.Active:=true;
end;
6 ответов

Примерная реализация фильтра по дизайнерам в прицепленной форме. (для замены формы необходимо закрыть проект в Дельфи, заменить в папке с проектом два файла из прицепа и затем вновь открыть проект)


WHERE Im>'' and
это что за синтаксис? так делать нельзяво первых параметр начинается с двоеточия во вторых параметр - это ПАРАМЕТР, а у вас тут имя колонкито есть сделать FIO= :param можно, а :param=FIO нельзя


не совсем поняла((( так мне и нужно сравнивать значения из этого столбца. но я не знаю как это записать. помогите разобратьсяя использую ComboBox, ,т.к. мне нужно отредактировать данные! а с DBLookupComboBox этого сделать нельзя и база всеравно не конектится по тому Unit что вы сбросиливот исправила, но не работает всеравно
procedure TForm1.Button1Click(Sender: TObject);
var  data1, data2: TDateTime;
     Imya: string;
begin
VypolnDizajner.Active:=false;
VypolnDizajner.SQL.Text := 'SELECT Data, Дизайнер, ВидПолиграфии, Описание, Стоимость, Себестоимость,Прибыль FROM ZakazPoligraf WHERE :Imya>'' and  Data between :data1 and :data2';
VypolnDizajner.Parameters.ParamByName('Imya').Value := Tzakaz.FieldByName('Дизайнер').AsString;
VypolnDizajner.Parameters.ParamByName('data1').Value := DateTimePicker1.DateTime;
VypolnDizajner.Parameters.ParamByName('data2').Value := DateTimePicker2.DateTime;
VypolnDizajner.Active:=true;
end;


так мне и нужно сравнивать значения из этого столбца.
А столбца этого при сравнении не видно... Его надо включать в сравнение:
procedure TForm1.Button1Click(Sender: TObject);
var  data1, data2: TDateTime;
     Imya: string;
begin
  VypolnDizajner.SQL.Text := 'SELECT Data, Дизайнер, ВидПолиграфии, Описание, Стоимость, Себестоимость,'+
      'Прибыль FROM   ZakazPoligraf WHERE Дизайнер = :Imya and Data between :data1 and :data2';
  VypolnDizajner.Parameters.ParamByName('Imya').Value := ComboBox1.Text;
  VypolnDizajner.Parameters.ParamByName('data1').Value := DateTimePicker1.DateTime;
  VypolnDizajner.Parameters.ParamByName('data2').Value := DateTimePicker2.DateTime;
  VypolnDizajner.Open;
end;
Tzakaz.FieldByName('Дизайнер').AsString
При выборе из Комбобокса ФИО в этом датасете (Tzakaz) ничего не происходит, т.к. после заполнения никакой связи между Tzakaz и комбобоксом нет. Поэтому применение датасета для передачи значения не оправдано (в нашем случае его указатель всегда в конце набора данных).


с этим разобралась уже. У меня теперь проблема в том что я не правильно ,видимо , ставлю условие. Мне нужно выводить в таблицу работы нескольких дизайнеров, при выборе конкретного дизайнера у меня выводятся те заказы которые он обработал. Но в таблице у меня есть и такие заказы которые дизайнер не обрабатывал (т.е. поле 'Дизайнер' не заполнено). вот какое условие я ставлю, но оно не работает:
procedure TForm1.CheckBox1Click(Sender: TObject);
var  data1, data2: TDateTime;
     imya, im: string;
begin
VypolnDizajner.SQL.Text := 'SELECT Дизайнер, Data, ВидПолиграфии, Описание, Стоимость, Себестоимость,Прибыль FROM ZakazPoligraf WHERE Дизайнер=:im Data between :data1 and :data2 order by Data asc';
Tdizajner.FieldByName('fio1').AsString:= imya;
if (imya >'') then
VypolnDizajner.Parameters.ParamByName('im').Value := imya;
VypolnDizajner.Parameters.ParamByName('data1').Value := DateTimePicker1.DateTime;
VypolnDizajner.Parameters.ParamByName('data2').Value := DateTimePicker2.DateTime;
VypolnDizajner.Active:=true;
end;


вообще бы зачем каждый раз заново заполнять SQL.text ?? он же не меняется. один раз заполнили и оставьте в покоеа в приведенном куске
 Tdizajner.FieldByName('fio1').AsString:= imya;
это вообще что?? imya - локальная переменная. на момент выполнения содержит какой-то мусор. этот мусор вы пытаетесь запихать в ADOTable Tdizajner (очень плохое название. с большой Т в делфи принято именовать классы) перед этим кстати нужно сначала Tdizajner.Edit; а после Tdizajner.Post... потом если imya>'' (вот тоже вопрос - а почему не использовать <> ???) мы тот же мусор суем в параметркстати, если перестать переписывать SQL каждый раз, то ОН ТАМ ОСТАНЕТСЯ. и если в следующий раз imya='' (ну случайно например) то параметр останется старым. так что неплохо бы его очищать
if (imya = '') then
  VypolnDizajner.Parameters.ParamByName('im').Clear
else
  VypolnDizajner.Parameters.ParamByName('im').Value := imya;