Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск через SQL, если база подключена через ADO, Опять банально - в DRKB снова непонятно 
:(
    Опции темы
Pakshin A. S.
  Дата 24.10.2004, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 2
Всего: 61



Короче, вот пример проектика "поиск по базе данных"
Он включает в себя три вида поиска: 1) строка целиком; 2) каждое слово из строки; 3) Смешанный поиск.
Из компонентов быз данных используется всего лишь три вещи: Query, DataBase, DBGrid (для вывода инфы).
Короче, там всё понятно.

Постарался реализовать
Цитата
а вот теперь думаю, что может можно как-то это через один столбик сделать?


P. S.
Использована таблица Paradox, но всё это через ADOQuery будет выглядеть так же... :D


Присоединённый файл ( Кол-во скачиваний: 21 )
Присоединённый файл  SearchDB.rar
PM   Вверх
Vorona
Дата 24.10.2004, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 12.10.2004
Где: Украина, Днепропе тровск

Репутация: нет
Всего: 2



Pakshin A. S.
Подскажи пожалуйста, что такое '%' и '*'. Это ASCII-коды? Если да, то чего?
А #39 - это пробел?
:)
PM MAIL WWW   Вверх
Pakshin A. S.
Дата 24.10.2004, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 2
Всего: 61



'%' - символ для SQL запроса, означающий, что после некоторого сочетания символов до знака % может стоять сколько угодно символов
Пример:
есть две записи
asdf
ased
Используя запрос с where Something Like 'as%'
Мы получим эти две записи.

'*' - символ, взятый из поиска файлов в Wind'е. Т. е. привычный заменитель сивола % для SQL...
#39 - одна ковычка '

ASCII код - число, напимер 39 - это код символа '
PM   Вверх
Pakshin A. S.
Дата 24.10.2004, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 2
Всего: 61



Цитата

Pakshin A. S.

Вроде бы уже и работает эта несчастная прога, только ищет почему-то только все слово, а не все слова на введенную букву
Я делаю через параметры, в свойстве SQL запроса еще до запуска проги пишу


Код
SELECT Termin
FROM Slovnyk
WHERE Termin LIKE :param



Потом в программе пишу


Код
dmodule.ADOQuery1.Active:=false;
dmodule.ADOQuery1.Parameters.ParamByName('param').Value:=Edtslovo.Text;
dmodule.ADOQuery1.Active:=true;

DbLstbx.DataField:='termin';
while not dmodule.ADOQuery1.Eof do
begin
DBLstBx.Items.Add(dmodule.ADOQuery1.Fields[0].AsString);
dmodule.ADOQuery1.Next;
end;



Наверное, надо что-то добавить в тексте запроса, но что?
Я уже все перепробовала, что только можно 

Код

dmodule.ADOQuery1.Active:=false;
dmodule.ADOQuery1.Parameters.ParamByName('param').Value:=Edtslovo.Text+'%';// вся фишка в проценте!
dmodule.ADOQuery1.Active:=true;

DbLstbx.DataField:='termin';
while not dmodule.ADOQuery1.Eof do
begin
DBLstBx.Items.Add(dmodule.ADOQuery1.Fields[0].AsString);
dmodule.ADOQuery1.Next;
end;


PM   Вверх
Vorona
Дата 24.10.2004, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 12.10.2004
Где: Украина, Днепропе тровск

Репутация: нет
Всего: 2



щас проверим :D
PM MAIL WWW   Вверх
Vorona
Дата 25.10.2004, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 12.10.2004
Где: Украина, Днепропе тровск

Репутация: нет
Всего: 2



Pakshin A. S.

Маленький вопросик:

имеем к примеру в базе списочек
-абрикос
-ананас
-апельсин

при использовании ORDER BY при введении буквы а оно почему-то переводит курсор на апельсин, а надо бы на абрикос

как быть? :)
PM MAIL WWW   Вверх
Pakshin A. S.
Дата 25.10.2004, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 2
Всего: 61



А если так?
Код

ORDER BY FieldName DESC

PM   Вверх
Pakshin A. S.
Дата 25.10.2004, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 2
Всего: 61



Код

SELECT * FROM SomeTable WHERE SomeField LIKE 'а%' ORDER BY SomeField


100% запрос!!! :stena
PM   Вверх
Alex
Дата 25.10.2004, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 17
Всего: 162



Так ну 1 что я вижу это то, что в строке подключения не задан Locale Identifier я бы написал так
Код
ADOConnection1.ConnectionString := 'Provider = Microsoft.Jet.4.0; Data Source = C:\Base; Locale Identifier = 1049';

Второе не совсем понятно как была создана таблица, установлена ли кодировка символов и COLLATE при создании поля.
Но на сколько мне известно COLLATE можно установить и при выполнении sql запроса.

Как это делается в InterBase и его клонах написано здесь http://www.ibase.ru/devinfo/ibrusfaq.htm

Для вашего случая я бы вам посоветовал написать ORDER BY SomeField COLLATE cp1251


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Vorona
Дата 25.10.2004, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 12.10.2004
Где: Украина, Днепропе тровск

Репутация: нет
Всего: 2



Pakshin A. S.

со * не проходит, у меня первое поле - счетчик, оно мне и выдает его
я пробовала нажать два раза на объект ADOQuery, там в окошке ( не знаю как оно называется) добавить все записи, а потом оставить только нужную, но тогда курсор все равно переезжает на апелисин, а не абрикос
все это странно
:)
PM MAIL WWW   Вверх
Pakshin A. S.
Дата 25.10.2004, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 2
Всего: 61



1) Alex - умный, попробуй как он советует...
2) Если правильно пнял, то нуна следующее:
Код
Select Field1,Field2,Field3 from SomeTable where Field1 Like 'а%' order by Field1 COLLATE cp1251


Вообще это всё походит на уроки SQL. В разделе "базу данных" есть замечательный учебник. Советую его почитать на досуге, если хочешь реально овлательно навыками создания баз даннух и работы с ними через язык SQL-запросов!
:D
PM   Вверх
Alex
Дата 25.10.2004, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 17
Всего: 162



Цитата(Pakshin @ 25.10.2004, 22:04)

1) Alex - умный, попробуй как он советует...

:D Да ладно тебе, просто человек сам наступал на эти грабли


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Veniamin
Дата 12.5.2008, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 3.3.2005

Репутация: нет
Всего: нет



Добого времени суток! Подскажите пожалуйста. Пишу программу работы с БД в Acess, связь через ADO. Записи главной таблицы разнесены по вкладкам TabSheet, на каждой вкладке сгрупппированы по параметрам. Необходимо реализовать поиск следующим образом: с помощью RadioButton-ов выбирается параметр поиска, или же можно CheckBox-ами. Есть Edit, в который вводится слово для поиска. Как реализовать, чтоб в DBGrid-е курсор ставился не только на первую найденную запись, а можно было по нажатию кнопки, к примеру, переходить к следующей записи и т.д. удовлетворяющей параметру поиска. Или же выбирается параметр поиска (столбец  таблицы), затем в Edit-е пишется слово для поиска, и выводятся все найденные слова. Locate выводит лишь одну запись:
Код

procedure TMainForm.FindEditChange(Sender: TObject);
begin
 if RadioButton1.Checked then
   DM.MainTable.Locate('кабинет',FindEdit.Text,[]);
 if RadioButton2.Checked then
   DM.MainTable.Locate('телефон',FindEdit.Text,[]);
 if RadioButton3.Checked then
   DM.MainTable.Locate('статус',FindEdit.Text,[]);
end;

 
С Table.Filtered у меня не получилось, при вводе целого слова в DBGrid-е все поля исчезают smile 

Код

procedure TMainForm.FindEdit2Change(Sender: TObject);
begin
  if Length(FindEdit2.Text)>0 then begin
    DM.MainTable.Filtered:=true;
    {отключаем условия на других вкладках}
    RadioButton1.Checked:=false;
    RadioButton2.Checked:=false;
    RadioButton3.Checked:=false;
    end
  else DM.MainTable.Filtered:=false;

  if RadioButton4.Checked then
  DM.MainTable.Filter:='[системная плата]>'''+FindEdit2.Text+'''';
  if RadioButton5.Checked then
   DM.MainTable.Filter:='процессор>'''+FindEdit2.Text+'''';
  if RadioButton6.Checked then
   DM.MainTable.Filter:='память>'''+FindEdit2.Text+'''';
  if RadioButton7.Checked then
   DM.MainTable.Filter:='видеокарта>'''+FindEdit2.Text+'''';
  if RadioButton8.Checked then
   DM.MainTable.Filter:='[сетевая карта]>'''+FindEdit2.Text+'''';
  if RadioButton9.Checked then
   DM.MainTable.Filter:='[жёсткий диск]>'''+FindEdit2.Text+'''';
  if RadioButton10.Checked then
   DM.MainTable.Filter:='[оптический привод]>'''+FindEdit2.Text+'''';
end;


Или можно это  реализовать как-то с помощью SQL-запроса? Т.е. пользователь вводит слово для поиска в Edit, указывает галочкой или несколькими нужный параметр, это передаётся в SQL-запрос заготовку, затем в DBGrid-е отображается результаты поиска записей удовлетворяющих параметрам? smile 
PM MAIL   Вверх
Данкинг
Дата 12.5.2008, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(Veniamin @ 12.5.2008,  23:36)
Как реализовать, чтоб в DBGrid-е курсор ставился не только на первую найденную запись, а можно было по нажатию кнопки, к примеру, переходить к следующей записи и т.д. удовлетворяющей параметру поиска. 

Кидаешь AdoQuery, в который запросом выводишь нужную инфу (т.е. все записи, в которых встречается FindEdit.Text). Его можно привязать к DBGrid'у. Только лучше взять так:

Код

trim(FindEdit.Text);



--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Veniamin
Дата 12.5.2008, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 3.3.2005

Репутация: нет
Всего: нет



Т.е. для каждого столбца таблицы будет свой ADOQuery? А если к примеру не RadioButton-ами указывать  параметры поиска, а CheckBox-ами, то запросов будет больше? Можно ли как-то уменьшить число запросов? Или всё делается одним запросом?

p.s. Всё разобрался сам. Нужен всего один запрос, просто для каждого RadioButton-а в процедуре нажатия кнопки запрос переписывается заново, а результат вывожу в другой форме, не затрагивая основной DBGrid. Например:
Код

procedure TMainForm.Button1Click(Sender: TObject);
begin
    if RadioButton1.Checked=true then
    begin
      Uncheck; //процедура снятия Radiobutton-ов на других вкладках
      DM.FindQuery.Active:=false;
      DM.FindQuery.SQL.Clear;
      DM.FindQuery.SQL.Add('SELECT * FROM [главная таблица]');
      DM.FindQuery.SQL.Add('WHERE кабинет LIKE'''+FindEdit.Text+'''');
      DM.FindQuery.Active:=true;
      FindResultForm.ShowModal;
      RadioButton1.Checked:=false;
    end;
  if RadioButton2.Checked=true then
    begin
      Uncheck;
      DM.FindQuery.Active:=false;
      DM.FindQuery.SQL.Clear;
      DM.FindQuery.SQL.Add('SELECT * FROM [главная таблица]');
      DM.FindQuery.SQL.Add('WHERE телефон LIKE'''+FindEdit.Text+'''');
      DM.FindQuery.Active:=true;
      FindResultForm.ShowModal;
      RadioButton2.Checked:=false;
    end;




Это сообщение отредактировал(а) Veniamin - 13.5.2008, 16:58
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0592 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.