Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Базы данных > MySQL
Перезагрузить страницу Нужно реализовать поиск базы данных
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Serega_Mexanik Serega_Mexanik вне форума
Member
 
Сообщений: 215
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 12.12.2005
По умолчанию Нужно реализовать поиск базы данных - 21.03.2008, 20:09

Доброго времени суток. Мои познания в SQL <=0 за сим не судите меня строго... у меня такая ситуация:

есть БД в ней табличка ADOTable1 в которой грубо говоря 20 полей и штук 50 записей... Нужно реализовать поиск.
Типа я ввожу в Edit какую-то фразу, идет поиск, и выдаеться на мою форму .

И что делать, если искомый текст не занимает все поле, а является частью этого поля ?

Заранее благодарен
Ответить с цитированием
  (#2 (permalink)) Старый
FataLL FataLL вне форума
Member
 
Аватар для FataLL
 
Сообщений: 1,783
Сказал(а) спасибо: 2
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 04.11.2004
По умолчанию 23.03.2008, 08:44

Причём тут SQL, если работаешь с ADOTable? Ищи средствами Table

1. Поиск
Код:
TLocateOptions Opts;

Opts.Clear();
Opts << loPartialKey; // Частичное совпадение!!!
Variant locvalues[2];
locvalues[0] = Variant("Иванов");
locvalues[1] = Variant("Муж");

// Поиск первого мужика из Ивановых, Ивановских, Ивановенковых и т.д.
// Вернёт true, если найдёт и установит курсор на эту запись
CustTable->Locate("FIO;Sex", VarArrayOf(locvalues, 1), Opts);
2.
Код:
ADOTable1->Close();
ADOTable1->Filter = "(FIO LIKE 'Иванов%') AND (Sex = 'Муж')";
ADOTable1->Filtered = true;
ADOTable1->Open();
Только во втором случае будет сразу несколько записей, удовлетворяющих условию фильтра (ну, или 0, если не найдёт). Ты хотя бы пролопать свойства и методы компонента, названия говорят сами за себя. Я думаю, даже если не знать английский вообще, слово Filter можно прочитать и догадаться о его смысле...
Ответить с цитированием
  (#3 (permalink)) Старый
Serega_Mexanik Serega_Mexanik вне форума
Member
 
Сообщений: 215
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 12.12.2005
По умолчанию 23.03.2008, 21:02

в первом варианте - ничего не происходит.
видно, что если задан массив 'искомого', а Opts = { }
за сим - ничего не происходит.

а во втором варианте - просто ничего не отфилтровываеццо....
Ответить с цитированием
  (#4 (permalink)) Старый
FataLL FataLL вне форума
Member
 
Аватар для FataLL
 
Сообщений: 1,783
Сказал(а) спасибо: 2
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 04.11.2004
По умолчанию 24.03.2008, 15:16

Прежде чем что-то заявлять, надо блеснуть своим кривым кодом, амиго... Показывай, посмотрим
Ответить с цитированием
  (#5 (permalink)) Старый
Serega_Mexanik Serega_Mexanik вне форума
Member
 
Сообщений: 215
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 12.12.2005
По умолчанию 25.03.2008, 22:35

вариант №1

TLocateOptions Opts;

Opts.Clear();
//Opts<<loPartialKey;
//Opts.operator <<(loPartialKey);
Opts << loPartialKey;

Variant locvalues[2];
locvalues[0] = Variant("Иванов");
locvalues[1] = Variant("00");

ADOTable1->Locate("FIO;Number", VarArrayOf(locvalues, 1), Opts);

вариант №2

/*
ADOTable1->Close(); //ADOTable1->Filter = "(FIO LIKE 'Иванов%') AND (Number = 'Муж')";
ADOTable1->Filter = "(FIO = 'Иванов%') AND (Number = '00%')";
ADOTable1->Filtered = true;
ADOTable1->Open();
*/
Form2->Show();

нашел вот вариант №3
// хочу при введении в эдит, чтобы курсорчик премещался в гриде на ту запись которую я ввел в эдит
TLocateOptions SearchOptions;
ADOTable1->Locate("FIO",Edit1->Text,SearchOptions<<loCaseInsensitive);
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
FataLL FataLL вне форума
Member
 
Аватар для FataLL
 
Сообщений: 1,783
Сказал(а) спасибо: 2
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 04.11.2004
По умолчанию 27.03.2008, 06:47

Невольно вспоминается анекдот про то, что тысяча мартышек с карандашами рано или поздно напишут "Войну и мир". Так и у тебя. Меняя местами и заменяя операторы рано или поздно всё заработает.

Вариант №1
Какого результата ты ждёшь? loPartialKey ты убрал, т.е. тебя интересует полное совпадение с условием поиска. Номер у тебя в базе текстовый? Есть хоть один "00"? У Иванов с номером 00 в базе есть?

Вариант №2
Ты не замечаешь, что вот этот бред
Код:
ADOTable1->Filter = "(FIO = 'Иванов%').....
от этого кода
Код:
ADOTable1->Filter = "(FIO LIKE 'Иванов%')...
"малость" отличается? Неужели ты считаешь, что "LIKE" и "=" это одно и то же? А вопрос тебя не гложет, зачем ввели оператор LIKE, если вместо четырёх символов можно поставить один? А ты знаешь, что такое процент (%)? Для чего он нужен (а я ведь объяснил, что происходит при использовании процента и LIKE)? С какого перепугу ты вот так запросто начал его совать куда попало? Что это за чушь?
Код:
ADOTable1->Filter = .... (Number = '00%')";
И есть у меня слабая надежда, что перед тем, как сказать "ничего не отфильтровываеццо", ты хотя бы убрал комментарий...

Вот уж не ожидал, что разработчику базы данных надо сначала объяснить сравнение переменных и действия основных операторов. В топку! Учебник в зубы!! Хотя бы для приличия вводный курс прочитай, а потом вопросы задавай!
Ответить с цитированием
  (#7 (permalink)) Старый
Serega_Mexanik Serega_Mexanik вне форума
Member
 
Сообщений: 215
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 12.12.2005
По умолчанию 01.04.2008, 20:59

блин попустил меня - маледец. Нечего сказать. Думаешь, я совсем уже, что коментарии не убрал...

Я хочу введя в Edit текст - потом его искать по двум полям. Как такое организовать, после фильтра твоего - ничего не происходит, даже если задать фильтр програмно...

ADOTable1->Close();
ADOTable1->Filter = "(FIO LIKE 'Иванов%') AND (Number = '00%')";
ADOTable1->Filtered = true;
ADOTable1->Open();
Ответить с цитированием
  (#8 (permalink)) Старый
FataLL FataLL вне форума
Member
 
Аватар для FataLL
 
Сообщений: 1,783
Сказал(а) спасибо: 2
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 04.11.2004
По умолчанию 02.04.2008, 12:55

Это не после моего фильтра ничего не происходит, а после твоего, чуешь разницу? Я тебе привёл его для примера, а не для того, чтобы ты его начал тулить куда не попадя с надеждой, что всё заработет само собой. Неужели трудно почитать букварь? Там всё доходчиво описано и разжёвано. Какие трудности со вставкой введённой строки в строку поиска? Ты можешь написать код, который в зависимости от введённого, выводил бы "Здравствуй, Петя!", "Здравствуй, Вася!", "Здравствуй, Света!"... Можешь или нет?
Ответить с цитированием
  (#9 (permalink)) Старый
Serega_Mexanik Serega_Mexanik вне форума
Member
 
Сообщений: 215
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 12.12.2005
По умолчанию 02.04.2008, 15:14

вот прога с твоим фильтром... и не работаит ...
Ответить с цитированием
  (#10 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,274
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 02.04.2008, 23:20

Там написано
Код:
Number = '00%'
Это - фильтр на точное совпадение с текстом '00%', какого в базе нет.
Надо поставить или без знака %
Код:
Number = '00'
или с оператором like вместо =
Код:
Number like '00%'
И так, и так - работает
Ответить с цитированием
Пользователь сказал cпасибо:
avsoft (16.09.2012)
  (#11 (permalink)) Старый
FataLL FataLL вне форума
Member
 
Аватар для FataLL
 
Сообщений: 1,783
Сказал(а) спасибо: 2
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 04.11.2004
По умолчанию 04.04.2008, 05:21

Alexiski

Зря подсказал. Человек совсем не хочет думать. Он так и не удосужился почитать про оператор LIKE и узнать, что такое %, хотя я ему явно указал на ошибку. В следующий раз он тебя спросит как сложить два числа, а когда ответишь, заявит, что ничего не работает и пришлёт очередную бредятину.
Ответить с цитированием
  (#12 (permalink)) Старый
Serega_Mexanik Serega_Mexanik вне форума
Member
 
Сообщений: 215
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 12.12.2005
По умолчанию 05.04.2008, 11:44

Все получилось, все работает ))

Код:
//search

ADOTable1->Close();
//ADOTable1->Filter = "FIO LIKE '"+Edit1->Text+"%"+"'"; //только по ФИО
ADOTable1->Filter = "(FIO LIKE '"+Edit1->Text+"%"+"') OR (Number LIKE '"+Edit1->Text+"%"+"')"; // по ФИО или номкру
ADOTable1->Filtered = true;
ADOTable1->Open();
Ответить с цитированием
Пользователь сказал cпасибо:
avsoft (16.09.2012)
Ads
  (#13 (permalink)) Старый
Solree Solree вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.05.2010
По умолчанию 22.05.2010, 14:21

Чтобы не создавать новую тему напишу здесь.

Код:
TLocateOptions Opts;
        Opts << loCaseInsensitive;
        for (int Search=0;Search<DBGrid1->Columns->Count;Search++)
        {
                if (ADOTable1->Locate(DBGrid1->Columns->Items[Search]->Title->Caption,Edit1->Text,Opts)==true)
                {
                        Label1->Caption="Малаца";
                        break;
                }
                if (Search==(DBGrid1->Columns->Count)-1)
                {
                        Label1->Caption="Нима такого";
                }
        }
Если то, что надо найти находится в колонке, с которой начинается цикл - то все нормально. Но если нужное находится где-то дальше, то при изменении параметра поиска в Locate выдает ошибку "Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом". Как использовать эту функцию для такого поиска? Или посоветуйте другой способ.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OleDbDataAdapter:Извлечение данных из базы данных imported_Maximys .NET 0 15.07.2011 04:33
Как реализовать поиск элемента stasey91 Вопросы начинающих программистов 0 23.05.2011 02:06
Си:Поиск по файлу как реализовать kokos С/С++ 1 18.05.2011 14:48
Нужно чтоб в выбираемые поля вставлял значения из базы данных tvorog Java 0 12.05.2010 07:57
Выбор последних данных из базы данных Kryuch Delphi 21 28.05.2006 00:37
Копирование данных из одной базы данных в другую LordMatrix C++ Builder 2 22.05.2006 18:01
Кодировка базы как реализовать Kelt MySQL 0 14.03.2005 09:52
Как реализовать чтение из базы данных VL-88 SQL 2 08.01.2005 17:33
Выгрузка базы в XML файл и поиск по нему XKiller C++ Builder 1 17.07.2004 04:49
Нужно сделать заголовки столбцов Stringgrid содержимым полей базы данных katalenka Delphi 2 30.04.2004 16:12
Нужно из базы данных извлечь значения и передать их во Flash Anonymous Flash и ActionScript 1 08.11.2003 12:25
Сжатие базы .db как реализовать Kutushut Perl 2 20.08.2003 14:42



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов