Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.013 c
4-1135913329
mss
2005-12-30 06:28
2006.03.19
Определить сколько сетевое карта


3-1138094464
~SerJant~
2006-01-24 12:21
2006.03.19
FIBVirtualStringTree


2-1141484258
rolex
2006-03-04 17:57
2006.03.19
Нужно ли выгружать переменные?


2-1141120783
VitV
2006-02-28 12:59
2006.03.19
Interbase. Путь к рисунку.


1-1140030805
Vovanchik
2006-02-15 22:13
2006.03.19
Программное сжатие картинки...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский