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

Вниз

Поговорим о поиске в БД!   Найти похожие ветки 

 
7D7   (2006-08-03 06:33) [0]

Здравствуйте! Возникла у меня проблема с БД(содал при помощи Database Desktop,BDE Admin., DataSourse,Table и DBGrid на драйвере ПАРАДОКС). Мне нужно сделать поисковик! Допустим, когда я хочу найти в базе данных все крассные карандаши, то

procedure TForm1.Button1Click(Sender: TObject);
begin
Table1.SetKey;
Table1.FieldByName("Color").AsString:=Edit1.Text;
Table1.GotoKey;
end;

программа наведет фокус на найденный карандаш, а мне надо что бы она выводила все найденные карандаши! Слышал,что это можно осуществить методом деления Отрезков пополам! Знающие люди помогите! Что это за метод и как он осуществляется в Делфи? Может кто знает другие пути для поиска?Буду рад всем советам!


 
ORMADA ©   (2006-08-03 07:34) [1]

товарисчЪ юзай Query пиши правильный скуль , смотри хелп и вперёд
забудь про Table!


 
Сергей М. ©   (2006-08-03 08:37) [2]


> Слышал,что это можно осуществить методом деления Отрезков
> пополам


Это слегка из другой оперы)

Твоя же задача решается проще - установкой фильтра

см. свойства TTable.Filter , TTable.Filtered


 
Кирей   (2006-08-03 10:57) [3]

1 вариант:
Table1.filter:="Color=красный"
Table1.Filtered:=true;

2 вариант:
query1.sql.add("Select * from "имя таблицы" where color="красный"");
query1.Open;


 
Desdechado ©   (2006-08-03 11:04) [4]

query.SQL.Text:="SELECT * FROM Карандаши WHERE цвет="красный"";
query.Open;


 
Sergey13 ©   (2006-08-03 11:07) [5]

> [3] Кирей   (03.08.06 10:57)
> [4] Desdechado ©   (03.08.06 11:04)
Я все таки надеюсь, что
query.SQL.Text:="SELECT * FROM Table WHERE что="КАРАНДАШ" and цвет="красный"";


 
Desdechado ©   (2006-08-03 11:19) [6]

Sergey13 ©   (03.08.06 11:07) [5]
Все зависит от предметной области. Может, карандаш - это отдельная сущность. Тогда мой вариант.
А может, просто один из множества видов товара. Тогда твой.


 
7D7   (2006-08-04 03:49) [7]

Опа! Скока советов))! Пасибки! Пойду пробовать!


 
Sergey13 ©   (2006-08-04 08:26) [8]

> [6] Desdechado ©   (03.08.06 11:19)

Я все таки надеюсь, что нет у автора сущностей типа "ластик", "обложка для тетрадки" или "дневник для 3 класса". 8-)


 
Johnmen ©   (2006-08-04 09:17) [9]


> "дневник для 3 класса"


Есть. Полный двоек...


 
Lexmark ©   (2006-08-06 06:51) [10]

Шутку понял)))))


 
7D7   (2006-08-16 02:26) [11]

Здравствуйте! У меня появился еще один вопрос. Создаю вот эту базу(которую описал выше), в свойстве query1.SQL пишу:

SELECT * From имя табл.

далее на форму вешаю  два Edit и button:

procedure TForm1.Button1Click(Sender: TObject);
begin
query1.SQL.Add("WHERE predmet="+(edit1.text)+"color="(edit2.Text));
query1.Open;
end;


но это неверно! Ругается "Missing operator or semicolon". Так вот, подскажите пожалуйста, как сделать чтобы при вводе в Edit1 и Edit2(эдиты являются условием поиска) по нажатию кнопки происходила выборка в базе. Делаю так все ок:

query1.SQL.Add("WHERE predmet="карандаш" and color="red"");

заранее благодарен!


 
Virgo_Style ©   (2006-08-16 07:59) [12]

текст запроса-результата какой?

p.s. для нового вопроса, вообще-то, следовало завести новую ветку.


 
Sergey13 ©   (2006-08-16 08:20) [13]

> query1.SQL.Add("WHERE predmet="+(edit1.text)+"color="(edit2.Text));
>
> query1.SQL.Add("WHERE predmet="карандаш" and color="red"");

Разница заметна?
И вообще, на будущее, в подобных запросах лучше работать через параметры.


 
Virgo_Style ©   (2006-08-16 08:56) [14]

Sergey13 ©   (16.08.06 8:20) [13]
действительно.

И еще, на будущее... есть у меня подозрение, что Button1 может быть Click много раз, а WHERE из запроса не вычищается... Если поля для поиска неизменны, то параметры тут действительно самое оно.


 
Плохиш ©   (2006-08-16 11:04) [15]


> 7D7   (16.08.06 02:26) [11]

Забыть то, что написано в [3] и читать до полного просветления то, что написано в [4] и [5].

> Virgo_Style ©   (16.08.06 07:59) [12]
> текст запроса-результата какой?

Давай я тебе скажу :-)
1 строка: select...
2 строка: select...


 
Desdechado ©   (2006-08-16 11:23) [16]

> query1.SQL.Add("WHERE predmet="+(edit1.text)+"color="+(edit2.Text));
Это не компилируется, т.к. пропущен плюс.
А скобки, обрамляющие эдиты, там лишние.


 
evvcom ©   (2006-08-16 12:23) [17]

Еще пропущены пробелы между значениями edit и дальнейшим текстом, еще кавычки для строки, а еще уже в [13] и [14] сказали. Параметры избавляют от подобных проблем!


 
7D7   (2006-08-17 02:59) [18]

Я еще нуб в делфи, объясните подробнее про "параметры"?

Desdechado

снкс за помощь.


 
UMU ©   (2006-08-17 10:48) [19]

...и кавычки не забывай


> query1.SQL.Add("WHERE predmet=""+(edit1.text)+ "
> "

and   color=
> "

"+(edit2.
> Text)) +"
> "

";


 
UMU ©   (2006-08-17 10:52) [20]

каряво получилось  8-)

query1.SQL.Add("WHERE predmet=
""+(edit1.text)+ ""and   color="" +(edit2.Text))  

+""";


 
Sergey13 ©   (2006-08-17 10:55) [21]

> [18] 7D7   (17.08.06 02:59)

В localsql.hlp загляни. В предметном указателе набери "Parameter substitutions".


 
Desdechado ©   (2006-08-17 11:39) [22]

> объясните подробнее про "параметры"
для примера (остальное в справке):
with(query) do begin
 SQL.Text:="SELECT * FROM Table WHERE name=:P0 and color=:P1";
 ParamByName("P0").AsString:=Trim(Edit1.Text);
 ParamByName("P1").AsString:=Trim(Edit2.Text);
 Open;
end;


 
MsGuns ©   (2006-08-17 11:57) [23]

Для начала надо определиться, КАК искать - для отображения или позиционирования.

Если для отображения, т.е. выводить в грид только подмножество записей БД, удовлетворящих некоторым статическим или динамическим условиям, то надо забыть про TXXTable и использовать TXXQuery, где в Where (Join ON) прописывать статические условия, а в Filter - динамические (т.е. те, которые юзер вводит в контролы для выбора)

Для позиционирования используется несколько видов поиска:
- Поиск ближайших (реализуется через FindXXX для полей активного индекса либо сканированием НД от текущего вверх или вниз с отключением режима отображения DisableControls и запоминания в букмарке стартовой записи для возврата в случае необнаружения)
- Поиск первого (реализуется методом TDataSet.Locate)
- Поиск в список (реализуется либо сканированием и отбором строк, удавлетворяющих условию поиска, в спец. список, либо, что лучше, создание запроса из исходного запроса с добавлением новых условий в предикат WHERE (JOIN) Найденные записи помещаются в грид, показываемый в отд.форме (модальной или fsStayOnTop), по клику на котором делается поиск и позиционирование записи в основном гриде.


 
7D7   (2006-08-18 17:15) [24]

принцип действия понятен
with(query) do begin
SQL.Text:="SELECT * FROM Table WHERE name=:P0 and color=:P1";
ParamByName("P0").AsString:=Trim(Edit1.Text);
ParamByName("P1").AsString:=Trim(Edit2.Text);
Open;
end;

Только не могу разобраться что писать(именно в моем случае) вместо ParamByName? Когда его прописваю, то пишет Undeclared identifier.


> (остальное в справке):

у меня с английским проблемы)))


 
unknown ©   (2006-08-18 17:32) [25]


> 7D7   (18.08.06 17:15) [24]

Ругается, как подсказывает мой телепатор, на строчку with(query) do begin
Не приходило в голову вместо query подставить имя своего компонента???


 
7D7   (2006-08-18 19:02) [26]

)) ну  я не совсем уже идиот! естественноя я подставлял свой компонет!


 
Desdechado ©   (2006-08-18 19:04) [27]

>  подставлял свой компонет
И какой?


 
7D7   (2006-08-18 19:16) [28]

Все понял! Я немного ступил. В строке
SQL.Text:="SELECT * FROM Table WHERE name=:P0 and color=:P1";
я писал
SQL.Text:="SELECT * FROM Table WHERE name:=P0 and color:=P1";

во тормознул ппц! А я тут уже перепробовал и так и сяк!
Кстати еще вопрос: (:=)- это значит присваивание;
                            (=:)-а вот что это значит?
Скорее всего не (=:), а  (:P).


 
7D7   (2006-08-18 19:17) [29]


> И какой?

Query1


 
Desdechado ©   (2006-08-18 19:21) [30]

двоеточие - это признак параметра
тип твоего Query1?


 
D7D   (2006-08-19 03:13) [31]


> тип твоего Query1?

Всмысле?


 
Desdechado ©   (2006-08-19 12:19) [32]

Query1: TQuery ?
Query1: TIBQuery ?
Query1: TADOQuery ?

у них немного отличаются свойства, поэтому может ругаться, если тупо копипастить мой пример


 
Lexmark ©   (2006-08-26 20:20) [33]

что обозначает оператор ParamByName в данном случае:

SQL.Text:="SELECT * FROM Table WHERE name=:P0 and color=:P1";
ParamByName("P0").AsString:=Trim(Edit1.Text);


 
Desdechado ©   (2006-08-27 16:07) [34]

Lexmark ©   (26.08.06 20:20) [33]
То же, что и в других подобных случаях. Если не выдергивать из контекста и читать справку, все будет понятно.


 
Virgo_Style ©   (2006-08-27 16:30) [35]

контекст - это
with(query) do



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

Форум: "Начинающим";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.058 c
4-1148029888
Wolfram
2006-05-19 13:11
2006.09.17
Как программно отключить жесткий диск?


2-1154572394
7D7
2006-08-03 06:33
2006.09.17
Поговорим о поиске в БД!


15-1156866396
Дураг
2006-08-29 19:46
2006.09.17
Способы борьбы с информационным ступором.


2-1156567266
Pupkin
2006-08-26 08:41
2006.09.17
Ошибка "List index out of bounds"


15-1156059538
PSPF2003
2006-08-20 11:38
2006.09.17
Снотворное без рецепта





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский