Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с поиском по базе Delphi Access

66K
11 февраля 2011 года
dnk_arty
9 / / 11.02.2011
Здравствуйте! Такая проблема, организовал поисковую форму, вот пытаюсь составить sql запрос чтобы по определенным данным происходил поиск, только вот в чем проблема, если в sql указать поиск по параметрам и если хоть в одном из них не будет введено значение то запрос не пройдет (не выводит ни каких данных), так мне нужно чтобы если пользователь захотел отсееть не только по дате но и по номеру сразу и т.д.. Вот код

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 введены данные запрос не пройдет, а мне нужно чтобы даже с одним введенным запрос проходил, искал много, рассматривал вариант с [] но что то не выходит помогите.
19K
11 февраля 2011 года
Alegun
269 / / 10.09.2010
А что если вот так:
 
Код:
if Edit1.Text <> '' then AdoQuery1.Parameters.ParamByName('data_in').Value: =Edit1.Text;
if Edit2.Text <> '' then AdoQuery1.Parameters.ParamByName('data_in').Value: =Edit2.Text;
и т.д.

Нужно проверять, если в едите текст или нет.
66K
11 февраля 2011 года
dnk_arty
9 / / 11.02.2011
Цитата: Alegun
А что если вот так:
 
Код:
if Edit1.Text <> '' then AdoQuery1.Parameters.ParamByName('data_in').Value: =Edit1.Text;
if Edit2.Text <> '' then AdoQuery1.Parameters.ParamByName('data_in').Value: =Edit2.Text;
и т.д.

Нужно проверять, если в едите текст или нет.



Конечно этот я вариант првоерял, он сам запрос выполняет и если не заданы параметры выдает ошибку((( Я писал проверки но не помогает, ошибка так как не заданы параметры, уедь если проверку не проходит то и параметр не задан(((

277
11 февраля 2011 года
arrjj
1.7K / / 26.01.2011
Почитайте про sql оператор LIKE
(Правда к Data BETWEEN он не подойдет, но к остальным параметрам вполне.)
66K
11 февраля 2011 года
dnk_arty
9 / / 11.02.2011
Цитата: arrjj
Почитайте про sql оператор LIKE
(Правда к 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:

6
11 февраля 2011 года
George
4.1K / / 05.01.2007
Так а какую ошибку то выдает, с этого ж начать надо.
66K
11 февраля 2011 года
dnk_arty
9 / / 11.02.2011
Цитата: George
Так а какую ошибку то выдает, с этого ж начать надо.



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

66K
11 февраля 2011 года
dnk_arty
9 / / 11.02.2011
Ничего не выводит вообще(((:(
6
12 февраля 2011 года
George
4.1K / / 05.01.2007
Я вот не уверен и попробовать щас не могу, но что если при пустых полях ввода в параметр подсовывать строку типа '%' или '%%'? Т.е. перед сортировкой проверять и в параметр засовывать либо значение из поля ввода либо то, что я предложил выше. Попробуйте?
277
12 февраля 2011 года
arrjj
1.7K / / 26.01.2011
Ну раз хотите без % (хотя с %выражение% хотябы в 2-х полях выборка будет в 99/100 случаях конкретна) то возвращаемся к варианту
 
Код:
if Edit1.Text <> '' then AdoQuery1.Parameters.ParamByName('data_in').Value:=Edit1.Text;

только так:
 
Код:
if Edit1.Text <> '' then AdoQuery1.Parameters.ParamByName('data_in').Value:=Edit1.Text;
else
AdoQuery1.Parameters.ParamByName('data_in').Value:='%%';
//Дальше запрос с LIKE оператором

или формировать запрос таким образом:
 
Код:
String query='Select * from App';
if Edit3.Text<>'' then
begin
query:=query+' where (N_Zakaza = :zakaz_n);
AdoQuery1.Parameters.ParamByName('zakaz_n').Value: =Edit3.Text;
end
//Ну в таком духе вобщем сначала формируем запрос потом его выполняем, щас сорь проверить не могу код на валидность

Ну и есть ANY в sql т.е.
 
Код:
if Edit3.Text='' then Edit3.Text='ANY' //так для всех а потом твой код из первого поста
66K
12 февраля 2011 года
dnk_arty
9 / / 11.02.2011
[QUOTE=arrjj;344849]Ну раз хотите без % (хотя с %выражение% хотябы в 2-х полях выборка будет в 99/100 случаях конкретна) то возвращаемся к варианту
 
Код:
if Edit1.Text <> '' then AdoQuery1.Parameters.ParamByName('data_in').Value:=Edit1.Text;

только так:
 
Код:
if Edit1.Text <> '' then AdoQuery1.Parameters.ParamByName('data_in').Value:=Edit1.Text;
else
AdoQuery1.Parameters.ParamByName('data_in').Value:='%%';
//Дальше запрос с LIKE оператором


Этот вариант работает!! Спасибо большое!, вариант с ANY не работает, только в этом варианте как быть с Полями даты если они пустые выдает ошибку неверное значение тоесть AdoQuery1.Parameters.ParamByName('data_in').Value:='%%'; ему не нравиться
277
12 февраля 2011 года
arrjj
1.7K / / 26.01.2011
С датой попробуй вместо between использовать >= и <= (хотя не факт что заработает ну или укажи например для наименьшей даты если пустое поле или не формат даты то там 1941 год а для наибольшей 2012:) но это изврат полный)
66K
12 февраля 2011 года
dnk_arty
9 / / 11.02.2011
Все решил окончательно вот код

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:):):):)
66K
12 февраля 2011 года
dnk_arty
9 / / 11.02.2011
Цитата: arrjj
С датой попробуй вместо between использовать >= и <= (хотя не факт что заработает ну или укажи например для наименьшей даты если пустое поле или не формат даты то там 1941 год а для наибольшей 2012:) но это изврат полный)



Изврат мне подходит)))) вполне нормальный изврат кстати;)

66K
12 февраля 2011 года
dnk_arty
9 / / 11.02.2011
Тему можно закрыть.
69K
17 февраля 2011 года
dragon_art
1 / / 17.02.2011
Цитата: dnk_arty

 
Код:
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)');



Ведь был уже намек на BETWEEN...
Надо бы просто изменить SQL, вот так например:

 
Код:
Select * from App where (Sklad= :SK) and (Data>=:data_in) AND (Data<=:data_out) and (N_Zakaza= :zakaz_n) and (FIO_z= :FIO_z) and (FIO_p= :FIO_p) and (Adres= :Adres) and (Tel= :Tel)'


и для верности в конце вашего примера я бы добавил:
ADOQuery1.Refresh;
не помню есть ли в ADO - > Fullrefresh
и нет пояснений, как используются транзакции, возможно дело в них
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог