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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.049 c
6-1145525827
Dadd
2006-04-20 13:37
2006.09.17
Как Убрать alert() из JavaScript в TwebBrowser и фреймах ?


15-1156590485
TUser
2006-08-26 15:08
2006.09.17
Не монтируются разделы на диске


1-1155040004
ZX48
2006-08-08 16:26
2006.09.17
RaveReports


2-1155816839
.ruslan
2006-08-17 16:13
2006.09.17
DBGridEh и нереальное но...


15-1156740957
Rouse_
2006-08-28 08:55
2006.09.17
Петруха с ДР Тебя !!!