Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.19;
Скачать: CL | DM;

Вниз

Проверка условий в БД.   Найти похожие ветки 

 
TimScorp   (2006-01-25 07:47) [0]

Уважаемые Дамы и Господа!

Сильно ногами не пинать.
Вопрос в следующем: имеем таблицу с 6 полями, типа адреса (город, мкр-н, улица, дом, корп, кв). Некоторые из них заполнены, некоторые нет (например есть город, улица и дом, остальные пустые). При поиске пользователю дается окно с 6 полями для ввода он вводит что-то из адреса (например: город или город и дом, остальные пустые), как мне сделать проверку совпадений и закинуть все совпадения в массив. Отображение в окне типа DBGrid не устраивает. А 41 (точно не помню но много) проверку с помощью if долго и муторно.

С уважением TimScorp.


 
Digitman ©   (2006-01-25 09:05) [1]


> закинуть все совпадения в массив


А зачем ?

После выполнения соответствующего селективного SQL-запроса результирующий НД будет содержать только те записи, которые удовлетворяют условиям поиска. Остается только воспользоваться методами навигации по НД для доступа к любой из интересующих записей в нем.


> 41 (точно не помню но много) проверку


Откуда 41-то ? Если полей всего 6 ?
Для каждой записи в таблице в ходе исполнения SQL-запроса будет выполнено не более 6-ти "проверок", по числу полей в таблице, и если значения полей в проверяемой записи соответствуют условиям отбора, запись будет помещена в результирующий НД.


 
TimScorp ©   (2006-01-25 09:18) [2]

to Digitman

Мне они нужны в массиве.

принцип в том что потом отобранные данные будут в ListBox"е и пользователь сам должен выбрать какой из адресов ему нужен, после чего будет выводится форма с данными результатами, таблица типа DBGrid не устраивает!


> Откуда 41-то ? Если полей всего 6 ?
> Для каждой записи в таблице в ходе исполнения SQL-запроса
> будет выполнено не более 6-ти "проверок", по числу полей
> в таблице, и если значения полей в проверяемой записи соответствуют
> условиям отбора, запись будет помещена в результирующий
> НД.


Если без SQL запроса а просто по базе пошагово идти и пользоваться if-ом то около 41.

Пример (+ - введеное значение пользователем, 0 - не введенное):

+00000
0+0000
00+000
000+00
0000+0
00000+

и т.д.

С уважением TimScorp.


 
Digitman ©   (2006-01-25 10:32) [3]


> потом отобранные данные будут в ListBox"е


Они и так там будут, без твоего явного участия в его заполнении.
Достаточно использовать DBListBox.


> Если без SQL запроса а просто по базе пошагово идти и пользоваться
> if-ом то около 41


Зачем изобретать велосипед и создавать себе трудности ?
Борланд все уже за тебя сделал, осталось грамотно воспользоваться соотв.возможностями.

Например, TTable имеет св-во Filter, позволяющее задать условие фильтрации записей, и св-во Filtered, вкючающее/отключающее фильтрацию.
Все что тебе нужно - установить должным образом св-во Filter и установить Filtered = True.
А чтобы отфильтрованный НД был показан юзеру, назначь

DBListBox.Dataset = Table


 
Johnmen ©   (2006-01-25 10:39) [4]

>Если без SQL запроса

:)
Взаимодействие с базами данных осуществляется только запросами. Либо явными, либо нет...


 
Desdechado ©   (2006-01-25 11:34) [5]

зачем "по базе пошагово"? комсомолец, что ли?

SELECT * FROM tabl
WHERE город LIKE :p1 AND улица LIKE :p2 AND дом LIKE :p3 AND корпус LIKE :p4 AND подъезд LIKE :p5 AND квартира LIKE :p6
ORDER BY фамилия


 
msguns ©   (2006-01-25 13:00) [6]

>Сильно ногами не пинать.

Щас запинают ;)


 
TimScorp ©   (2006-01-25 18:50) [7]

to Desdechado


> SELECT * FROM tabl
> WHERE город LIKE :p1 AND улица LIKE :p2 AND дом LIKE :p3
> AND корпус LIKE :p4 AND подъезд LIKE :p5 AND квартира LIKE
> :p6
> ORDER BY фамилия


а если введен токо город и дом при этом он найдет в базе данные если в базе еще есть улица и квартира а введенных данных нет???

to Digitman

ОК. так попробую. вопрос следующий мне нужно потом эти данные выводить не в таблице а иметь доступ к каждому полю в отдельности. Также есть вторая таблица связанная с первой допустим по фамилии. В основной таблице есть один адрес, в связанной на одну и ту же фамилию может быть много адресов, вот их мне пото нужно написать в Memo поле. Так как быть если можно поподробней. если можешь напиши timscorp@mail.ru

С уважением TimScorp.


 
Desdechado ©   (2006-01-25 19:04) [8]

> а если введен токо город и дом при этом он найдет в базе данные если в
> базе еще есть улица и квартира а введенных данных нет???
а теперь с толком, с расстановкой и со знаками препинания


 
TimScorp ©   (2006-01-25 19:15) [9]

to Desdechado

С толком.

В БД есть такие поля как город, мкр, улица, дом, корп, квартира.

Допустим адрес: Ашхабад, ул. Андалиба д. 15, кв. 7

Теперь пользователю предлагается окно в котором он должен ввести условия для поиска: В окне поля для ввода: город, мкр, улица, дом, корп, квартира. Он может ввести:
1. в поле город - Ашхабад (все остальные поля пустые) - программа должна найти вышеуказанный адрес.
2. в поле город - Ашхабад в поле дом - 15 (остальные четыре поля пустые) - должна найти адрес.
3. в поле до 15 в поле квартира 7 - тоже должна найти

и т.д.

Вот тут как проверять???

С уважением TimScorp.


 
Desdechado ©   (2006-01-25 21:09) [10]

конструируешь запрос из кусочков
если дом введен, добавляешь кусочек "AND дом LIKE :p3"
кстати, случай поиска ПУСТОГО дома предусмотрен?


 
TimScorp ©   (2006-01-26 07:50) [11]

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.


 
ЮЮ ©   (2006-01-26 08:28) [12]


> вот тут то и возникает проблема вариантов ввода много.

Сказали же, по кусочкам, тогда только 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);


 
ЮЮ ©   (2006-01-26 08:32) [13]

Для отображения DataSet-а в виде выпадающего списка следует использовать TDBLookupCombobox (см. ListSource)


 
Digitman ©   (2006-01-26 09:45) [14]

Не надо никаких циклов !

На форме задания условий поиска рядом с каждым из 6-ти полей ввода разместить чекбокс, в событии его изменения запрещать/разрешать ввод в поле удалять/добавлять соответствующее where-условие в SQL-предложение ... Или, если использовать параметрический запрос (что предпочтительней), добавлять/удалять соответствующий параметр в списке Query.Params


 
TimScorp ©   (2006-01-26 09:55) [15]

to ЮЮ
to Digitman

Если не трудно напишите запрос полностью. Можно на мыло.

С уважением TimScorp.


 
sniknik ©   (2006-01-26 10:53) [16]

одним на все случаи не получится, надо формировать динамически.
(получилось бы в MSSQL где можно обьявить переменную и проверять двойное условие - или значение или NULL. в аксесс так не сделать, а изврат с задваиванием каждого параметра даже рассматривать не хочется)

> Если не трудно напишите запрос полностью. Можно на мыло.
... ну а сам то? хоть попытку то сделай... (p.s.мылом НЕЛЬЗЯ!!! ;)


 
TimScorp ©   (2006-01-26 11:14) [17]

to sniknik


> ... ну а сам то? хоть попытку то сделай... (p.s.мылом НЕЛЬЗЯ!
> !! ;)


пытался, пока не получается.

С уважением TimScorp.


 
Sergey13 ©   (2006-01-26 11:23) [18]

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:25) [19]

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:31) [20]

2[19] TimScorp ©   (26.01.06 11:25)
> А так работать будет???
Попробуй и сообщи нам. НЕ на аксесе у меня работает.


 
sniknik ©   (2006-01-26 11:40) [21]

Sergey13 ©   (26.01.06 11:23) [18]
> Так не пройдет или это изврат?
это глюк.
в ADO в отличие от BDE все одноименные параметры не работают. (не присвоиш ты так всем одно значение)


 
sniknik ©   (2006-01-26 11:43) [22]

былобы 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:55) [23]

изврат вот

where ((:param1 is null) or (:param2 is not null and field1=:param3))
...
ParamByName("param1").Value:= первый параметр;
ParamByName("param2").Value:= первый параметр;
ParamByName("param3").Value:= первый параметр;
...

p.s. хотя... счего это я взял, что используется ADO... нда ;(


 
Desdechado ©   (2006-01-26 11:58) [24]

> А так работать будет?
а что, попробовать ломает?
еще вчера все мог бы сделать, а не сопли жевать

сорри за резкость, но достало


 
Os ©   (2006-01-26 12:00) [25]

А что нельзя step by step
Выбрал деревяный пользователь сначала город предоставили список улиц и т.д.


 
ЮЮ ©   (2006-01-26 12:12) [26]


> where ((:param1 is null) or (:param2 is not null and field1=:
> param3))

можно сократить до двух
where ((:param1 is null) or (field1 = :param2))


 
SpellCaster   (2006-01-26 12:29) [27]

Народ, о чем спор - в №12 всё отлично написано! Я сам тоже так делал, и в фильтр таблицы всё это пихал. Не надо пытаться спроектировать велосипед с использованием субпространственных гиперузлов :). Зачем нагружать все на SQL, если можно в Дельфях проще сделать?


 
TimScorp ©   (2006-01-26 19:14) [28]

to Desdechado

Сопливый, варежку закрыл и свалил отседа.

С уважением TimScorp


 
Вольный Стрелок ©   (2006-01-26 19:38) [29]

TimScorp ©   (26.01.06 19:14) [28]
Чем оскорблять людей, пытающихся тебе помочь, лучше бы поблагодарил.
А то ведь больше никто тебе после такого разжевывать не будет, помни об этом.
Они тратят твое время на ТВОИ проблемы. Они ничего тебе НЕ ОБЯЗАНЫ.
Ты пришел сюда В ГОСТИ.
Так что меньше говори, больше думай, и следи за языком.


 
TimScorp ©   (2006-01-26 22:05) [30]

to Вольный Стрелок

Во первых не я начал. (читай его пост выше)
Во вторых про обязательства никто не говорил ни слова.
В третьих я никого не оскорбил.
В четвертых я всегда слежу за своим языком.

С уважением TimScorp.



Страницы: 1 вся ветка

Текущий архив: 2006.03.19;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.126 c
2-1141491587
jenya
2006-03-04 19:59
2006.03.19
Исключение "символа" из получившейся строки :0


15-1140674894
7BB
2006-02-23 09:08
2006.03.19
Оберон, Модула


2-1141028538
nap<>
2006-02-27 11:22
2006.03.19
Indy 10


1-1140089973
tesseract
2006-02-16 14:39
2006.03.19
1с и TPropertyPage


1-1139820130
AlanB
2006-02-13 11:42
2006.03.19
Очистка значения Edit.Text в цикле