Форум: "Начинающим";
Текущий архив: 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