Проблема с поиском по базе Delphi Access
AdoQuery1.Close;
AdoQuery1.SQL.Clear;
AdoQuery1.SQL.Add('Select * from App where (Sklad= :SK) and (Data BETWEEN :data_in AND :data_out) and (N_Zakaza= :zakaz_n) and (FIO_z= :FIO_z) and (FIO_p= :FIO_p) and (Adres= :Adres) and (Tel= :Tel)');
AdoQuery1.Parameters.ParamByName('SK').Value:=SK;
AdoQuery1.Parameters.ParamByName('data_in').Value:=Edit1.Text;
AdoQuery1.Parameters.ParamByName('data_out').Value:=Edit2.Text;
AdoQuery1.Parameters.ParamByName('zakaz_n').Value:=Edit3.Text;
AdoQuery1.Parameters.ParamByName('FIO_z').Value:=Edit4.Text;
AdoQuery1.Parameters.ParamByName('FIO_p').Value:=Edit5.Text;
AdoQuery1.Parameters.ParamByName('Adres').Value:=Edit6.Text;
AdoQuery1.Parameters.ParamByName('Tel').Value:=Edit7.Text;
AdoQuery1.Open;
DataSource1.DataSet:=Form3.AdoQuery1;
Я думаю суть понятна. Вот если выполнить код то получается пока не будет во все Edit введены данные запрос не пройдет, а мне нужно чтобы даже с одним введенным запрос проходил, искал много, рассматривал вариант с [] но что то не выходит помогите.
if Edit2.Text <> '' then AdoQuery1.Parameters.ParamByName('data_in').Value: =Edit2.Text;
и т.д.
Нужно проверять, если в едите текст или нет.
if Edit2.Text <> '' then AdoQuery1.Parameters.ParamByName('data_in').Value: =Edit2.Text;
и т.д.
Нужно проверять, если в едите текст или нет.
Конечно этот я вариант првоерял, он сам запрос выполняет и если не заданы параметры выдает ошибку((( Я писал проверки но не помогает, ошибка так как не заданы параметры, уедь если проверку не проходит то и параметр не задан(((
(Правда к Data BETWEEN он не подойдет, но к остальным параметрам вполне.)
(Правда к Data BETWEEN он не подойдет, но к остальным параметрам вполне.)
Если указано одно поле то все работает как надо а как только включаю все отсев не проходит но и ошибки нет, просто ждет ввода во все поля вот код как я понял
begin
AdoQuery1.Close;
AdoQuery1.SQL.Clear;
AdoQuery1.SQL.Add('Select * from App where (Sklad= :SK) and (N_Zakaza LIKE :zakaz_n) and (FIO_z LIKE :FIO_z) and (FIO_p LIKE :FIO_p) and (Adres LIKE :Adres) and (Tel LIKE :Tel)');
AdoQuery1.Parameters.ParamByName('SK').Value:=SK;
//AdoQuery1.Parameters.ParamByName('data_in').Value:=Edit1.Text; and (Data BETWEEN :data_in AND :data_out)
//AdoQuery1.Parameters.ParamByName('data_out').Value:=Edit2.Text;
AdoQuery1.Parameters.ParamByName('zakaz_n').Value:=Edit3.Text;
AdoQuery1.Parameters.ParamByName('FIO_z').Value:=Edit4.Text;
AdoQuery1.Parameters.ParamByName('FIO_p').Value:=Edit5.Text;
AdoQuery1.Parameters.ParamByName('Adres').Value:=Edit6.Text;
AdoQuery1.Parameters.ParamByName('Tel').Value:=Edit7.Text;
AdoQuery1.Open;
DataSource1.DataSet:=Form3.AdoQuery1;
end;
Не использую % так как он в принципе мне не нужен мне нужен точный отбор.
Жду идей, кто знает хорошо sql или ... уже сам не знаю...:confused:
Прошу прощения ошибку не выдает просто ждет ввода во все поля, а мне нужно чтобы если хоть в одном было что то введено он отсортировывал...
только так:
else
AdoQuery1.Parameters.ParamByName('data_in').Value:='%%';
//Дальше запрос с LIKE оператором
или формировать запрос таким образом:
if Edit3.Text<>'' then
begin
query:=query+' where (N_Zakaza = :zakaz_n);
AdoQuery1.Parameters.ParamByName('zakaz_n').Value: =Edit3.Text;
end
//Ну в таком духе вобщем сначала формируем запрос потом его выполняем, щас сорь проверить не могу код на валидность
Ну и есть ANY в sql т.е.
только так:
else
AdoQuery1.Parameters.ParamByName('data_in').Value:='%%';
//Дальше запрос с LIKE оператором
Этот вариант работает!! Спасибо большое!, вариант с ANY не работает, только в этом варианте как быть с Полями даты если они пустые выдает ошибку неверное значение тоесть AdoQuery1.Parameters.ParamByName('data_in').Value:='%%'; ему не нравиться
AdoQuery1.Close;
AdoQuery1.SQL.Clear;
AdoQuery1.SQL.Add('Select * from App where (Sklad= :SK) and (Data BETWEEN :data_in AND :data_out) and (N_Zakaza LIKE :zakaz_n) and (FIO_z LIKE :FIO_z) and (FIO_p LIKE :FIO_p) and (Adres LIKE :Adres) and (Tel LIKE :Tel)');
AdoQuery1.Parameters.ParamByName('SK').Value:=SK;
if Edit1.Text <> '' then AdoQuery1.Parameters.ParamByName('data_in').Value:=Edit1.Text
else AdoQuery1.Parameters.ParamByName('data_in').Value:='01.01.1900';
if Edit2.Text <> '' then AdoQuery1.Parameters.ParamByName('data_out').Value:=Edit2.Text
else AdoQuery1.Parameters.ParamByName('data_out').Value:='30.12.2900';
if Edit3.Text <> '' then AdoQuery1.Parameters.ParamByName('zakaz_n').Value:=Edit3.Text
else AdoQuery1.Parameters.ParamByName('zakaz_n').Value:='%%';
if Edit4.Text <> '' then AdoQuery1.Parameters.ParamByName('FIO_z').Value:=Edit4.Text
else AdoQuery1.Parameters.ParamByName('FIO_z').Value:='%%';
if Edit5.Text <> '' then AdoQuery1.Parameters.ParamByName('FIO_p').Value:=Edit5.Text
else AdoQuery1.Parameters.ParamByName('FIO_p').Value:='%%';
if Edit6.Text <> '' then AdoQuery1.Parameters.ParamByName('Adres').Value:=Edit6.Text
else AdoQuery1.Parameters.ParamByName('Adres').Value:='%%';
if Edit7.Text <> '' then AdoQuery1.Parameters.ParamByName('Tel').Value:=Edit7.Text
else AdoQuery1.Parameters.ParamByName('Tel').Value:='%%';
AdoQuery1.Open;
DataSource1.DataSet:=Form3.AdoQuery1;
Просто поля даты если не введены ставим не %% а минимальные и максимальные даты))) все легко и просто как всегда! Спасибо всем, а особенно arrjj:):):):)
Изврат мне подходит)))) вполне нормальный изврат кстати;)
Ведь был уже намек на BETWEEN...
Надо бы просто изменить SQL, вот так например:
и для верности в конце вашего примера я бы добавил:
ADOQuery1.Refresh;
не помню есть ли в ADO - > Fullrefresh
и нет пояснений, как используются транзакции, возможно дело в них