![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проверка условий в БД. [D7, MS Acces]
TimScorp © (2006-01-25 07:47:00)Уважаемые Дамы и Господа!
Сильно ногами не пинать.
Вопрос в следующем: имеем таблицу с 6 полями, типа адреса (город, мкр-н, улица, дом, корп, кв). Некоторые из них заполнены, некоторые нет (например есть город, улица и дом, остальные пустые). При поиске пользователю дается окно с 6 полями для ввода он вводит что-то из адреса (например: город или город и дом, остальные пустые), как мне сделать проверку совпадений и закинуть все совпадения в массив. Отображение в окне типа DBGrid не устраивает. А 41 (точно не помню но много) проверку с помощью if долго и муторно.
С уважением TimScorp.
TimScorp (2006-01-26 22:05:00) [1]to Вольный Стрелок
Во первых не я начал. (читай его пост выше)
Во вторых про обязательства никто не говорил ни слова.
В третьих я никого не оскорбил.
В четвертых я всегда слежу за своим языком.
С уважением TimScorp.
Вольный Стрелок (2006-01-26 19:38:00) [2]TimScorp © (26.01.06 19:14) [28]
Чем оскорблять людей, пытающихся тебе помочь, лучше бы поблагодарил.
А то ведь больше никто тебе после такого разжевывать не будет, помни об этом.
Они тратят твое время на ТВОИ проблемы. Они ничего тебе НЕ ОБЯЗАНЫ.
Ты пришел сюда В ГОСТИ.
Так что меньше говори, больше думай, и следи за языком.
TimScorp (2006-01-26 19:14:00) [3]to Desdechado
Сопливый, варежку закрыл и свалил отседа.
С уважением TimScorp
SpellCaster (2006-01-26 12:29:00) [4]Народ, о чем спор - в №12 всё отлично написано! Я сам тоже так делал, и в фильтр таблицы всё это пихал. Не надо пытаться спроектировать велосипед с использованием субпространственных гиперузлов :). Зачем нагружать все на SQL, если можно в Дельфях проще сделать?
ЮЮ (2006-01-26 12:12:00) [5]
> where ((:param1 is null) or (:param2 is not null and field1=:
> param3))
можно сократить до двух
where ((:param1 is null) or (field1 = :param2))
Os (2006-01-26 12:00:00) [6]А что нельзя step by step
Выбрал деревяный пользователь сначала город предоставили список улиц и т.д.
Desdechado (2006-01-26 11:58:00) [7]> А так работать будет?
а что, попробовать ломает?
еще вчера все мог бы сделать, а не сопли жевать
сорри за резкость, но достало
sniknik (2006-01-26 11:55:00) [8]изврат вот
where ((:param1 is null) or (:param2 is not null and field1=:param3))
...
ParamByName('param1').Value:= первый параметр;
ParamByName('param2').Value:= первый параметр;
ParamByName('param3').Value:= первый параметр;
...
p.s. хотя... счего это я взял, что используется ADO... нда ;(
sniknik (2006-01-26 11:43:00) [9]былобы MSSQL то можно было
DECLARE @param1 INT
SET @param1 = :param1
....
where ((@param1 is null) or (@param1 is not null and field1=@param1))
...
но в access-е ни переменную назначить ни вообше больше одного запроса в запросе ;) написать.
sniknik (2006-01-26 11:40:00) [10]Sergey13 © (26.01.06 11:23) [18]
> Так не пройдет или это изврат?
это глюк.
в ADO в отличие от BDE все одноименные параметры не работают. (не присвоиш ты так всем одно значение)
Sergey13 (2006-01-26 11:31:00) [11]2[19] TimScorp © (26.01.06 11:25)
> А так работать будет???
Попробуй и сообщи нам. НЕ на аксесе у меня работает.
TimScorp (2006-01-26 11:25:00) [12]to Sergey13
> 2[16] sniknik © (26.01.06 10:53)
> where ((:param1 is null) or (:param1 is not null and field1=:
> param1))
> and ((:param2 is null) or (:param2 is not null and field2=:
> param2))
> Так не пройдет или это изврат?
А так работать будет???
С уважением TimScorp.
Sergey13 (2006-01-26 11:23:00) [13]2[16] sniknik © (26.01.06 10:53)
where ((:param1 is null) or (:param1 is not null and field1=:param1))
and ((:param2 is null) or (:param2 is not null and field2=:param2))
Так не пройдет или это изврат?
TimScorp (2006-01-26 11:14:00) [14]to sniknik
> ... ну а сам то? хоть попытку то сделай... (p.s.мылом НЕЛЬЗЯ!
> !! ;)
пытался, пока не получается.
С уважением TimScorp.
sniknik (2006-01-26 10:53:00) [15]одним на все случаи не получится, надо формировать динамически.
(получилось бы в MSSQL где можно обьявить переменную и проверять двойное условие - или значение или NULL. в аксесс так не сделать, а изврат с задваиванием каждого параметра даже рассматривать не хочется)
> Если не трудно напишите запрос полностью. Можно на мыло.
... ну а сам то? хоть попытку то сделай... (p.s.мылом НЕЛЬЗЯ!!! ;)
TimScorp (2006-01-26 09:55:00) [16]to ЮЮ
to Digitman
Если не трудно напишите запрос полностью. Можно на мыло.
С уважением TimScorp.
Digitman (2006-01-26 09:45:00) [17]Не надо никаких циклов !
На форме задания условий поиска рядом с каждым из 6-ти полей ввода разместить чекбокс, в событии его изменения запрещать/разрешать ввод в поле удалять/добавлять соответствующее where-условие в SQL-предложение ... Или, если использовать параметрический запрос (что предпочтительней), добавлять/удалять соответствующий параметр в списке Query.Params
ЮЮ (2006-01-26 08:32:00) [18]Для отображения DataSet-а в виде выпадающего списка следует использовать TDB LookupCombobox (см. ListSource)
ЮЮ (2006-01-26 08:28:00) [19]
> вот тут то и возникает проблема вариантов ввода много.
Сказали же, по кусочкам, тогда только 6 проверок, которые, при желании, можно и в цикл вложить:
where := '';
If Trim(City.Text) <> '' then where := where + '(City = ' + QuatedStr(Trim(City.Text)) + ') AND ';
..
If Trim(Flat.Text) <> '' then where := where + '(Flat = ' + QuatedStr(Trim(Flat.Text)) + ') AND ';
SetLength(where, Length(where) - 5);
TimScorp (2006-01-26 07:50:00) [20]to Desdechado
> конструируешь запрос из кусочков
> если дом введен, добавляешь кусочек "AND дом LIKE :p3"
> кстати, случай поиска ПУСТОГО дома предусмотрен?
вот тут то и возникает проблема вариантов ввода много.
берем так: город, мкр, улица, дом, корпус, квартира
(+-данные введены пользователем, 0 - не введены)
Получаем варианты отбора
+00000 ++0000 +++000 ++++00 +++++0 ++++++
0+0000 +0+000 ++0+00 +++0+0 ++++0+
00+000 +00+00 ++00+0 +++00+
000+00 +000+0 ++000+
0000+0 +0000+
00000+
0++000 0+++00 0++++0 0+++++
0+0+00 0++0+0 0+++0+
0+00+0 0++00+
0+000+
00++00 00+++0 00++++
00+0+0 00++0+
00+00+
000++0 000+++
000+0+
0000++
Вот и получается 41 вариант условий, как его можно обойти????
С уважением TimScorp.