Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск по БД через SQL 
:(
    Опции темы
Palladin
Дата 20.4.2006, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

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



Вообщем делаю курсач, всё сделано, но одна функция не пашет:

короче при нажатии на кнопку "Поиск" появляется новая форма в которой есть dbgrid и 4 edit-a
есть возможность искать по одному из полей(это работаетsmile) а вот, я ещё хочу сделать так чтобы пользователь повводил всё что помнит, может он введёт записи только в первые два edit-a, а может и во все, и чтоб по тому что он ввёл шёл поиск

Вот код поиска по одному из полей:

Код

procedure TForm5.Button2Click(Sender: TObject);
begin
form1.ADOQuery1.Active:=false;
form1.ADOQuery1.SQL.clear;
form1.ADOQuery1.SQL.Add('SELECT *');
form1.ADOQuery1.SQL.Add('FROM BOOK');
if length(edit1.Text)>0 then
form1.ADOQuery1.SQL.add('Where [Шифр книги] LIKE'''+edit1.Text+'''');
form1.ADOQuery1.Active:=true;
edit1.clear;
end;



Это работает, а вот при нажатии на кнопку поиск по всем полям что-то не выходит, ошибки пишетsmile((((
вот то что я написал в коде поиск по всем полям



Код

procedure TForm5.Button6Click(Sender: TObject);
begin
form1.ADOQuery1.Active:=false;
form1.ADOQuery1.SQL.clear;
form1.ADOQuery1.SQL.Add('SELECT *');
form1.ADOQuery1.SQL.Add('FROM BOOK');
if length(edit4.Text)>0 then
form1.ADOQuery1.SQL.add('Where Издательство LIKE'''+edit1.Text+'''');
form1.ADOQuery1.Active:=true;

form1.ADOQuery1.Active:=false;
form1.ADOQuery1.SQL.clear;
form1.ADOQuery1.SQL.Add('SELECT *');
form1.ADOQuery1.SQL.Add('FROM BOOK');
if length(edit3.Text)>0 then
form1.ADOQuery1.SQL.add('Where Название LIKE'''+edit1.Text+'''');
form1.ADOQuery1.Active:=true;

form1.ADOQuery1.Active:=false;
form1.ADOQuery1.SQL.clear;
form1.ADOQuery1.SQL.Add('SELECT *');
form1.ADOQuery1.SQL.Add('FROM BOOK');
if length(edit2.Text)>0 then
form1.ADOQuery1.SQL.add('Where Автор LIKE'''+edit1.Text+'''');
form1.ADOQuery1.Active:=true;

form1.ADOQuery1.Active:=false;
form1.ADOQuery1.SQL.clear;
form1.ADOQuery1.SQL.Add('SELECT *');
form1.ADOQuery1.SQL.Add('FROM BOOK');
if length(edit1.Text)>0 then
form1.ADOQuery1.SQL.add('Where [Шифр книги] LIKE'''+edit1.Text+'''');
form1.ADOQuery1.Active:=true;
end;




Помогите здесь подправить smile  


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Fast
Дата 21.4.2006, 05:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(RooR @  20.4.2006,  23:49 Найти цитируемый пост)
Помогите здесь подправить smile   


Извини придётся всё переделывать  smile 

Вот как всё должно быть  smile
Код

procedure TForm5.Button6Click(Sender: TObject);
var
mFilter, nFilter, xFilter : String;
begin
With Form1 do
begin
ADOQuery1.Active := False;
ADOQuery1.SQL.Clear;
mFilter := 'Select * From BOOK Where ';
nFilter := '';
if Edit1.Text <> '' then
nFilter := nFilter + ' AND Издательство LIKE''' + Edit1.Text + '''';
if Edit2.Text <> '' then
nFilter := nFilter + ' AND Название LIKE''' + Edit2.Text + '''';
if Edit3.Text <> '' then
nFilter := nFilter + ' AND Автор LIKE''' + Edit3.Text + '''';
if Edit4.Text <> '' then
nFilter := nFilter + ' AND [Шифр книги] LIKE''' + Edit4.Text + '''';
Delete(nFilter,1,5);
xFilter := mFilter + nFilter;
ShowMessage(xFilter); // Это используется чтобы посмотреть как выглядет твой запрос ПОТОМ УДАЛИ!!!!
ADOQuery1.SQL.Text := xFilter;
ADOQuery1.ExecSQL;
end
end;


 
PM MAIL   Вверх
Palladin
Дата 21.4.2006, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

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



К сожалению здесь что-то не так, поиск не отображается в dbedite, при нажатии на кнопку поиск по всем полям, весь dbgrid очищается, какбудто конект проподает к adoconnection smile  


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
sexton
Дата 21.4.2006, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sexton=Пономарь (eng)
**


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

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



Имхо Open, а не ExecSQl... ExecSQL вроде не возвращает курсор для отображения

Это сообщение отредактировал(а) sexton - 21.4.2006, 18:42
PM MAIL WWW ICQ   Вверх
Palladin
Дата 21.4.2006, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

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



Нет Open тоже не катит, ошибку выдаёт, ошибка синтаксиса и т.п. smile  


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
x77
Дата 22.4.2006, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ну блин....   ну дурные проблемы ведь. 

гляди. открой пустой проект. кинь на форму обычный Query (в DatabaseName поставь "DBDEMOS"), DataSource, привязанный к этому квери, DBGrid, привязанный к датасорсу, кинь на форму четыре TEdit и одну педаль сиречь TButton. в Query1.SQL напиши 'select * from biolife'. вот код всего проекта:

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, DBTables, DB, StdCtrls, Grids, DBGrids;

const
  // количество полей, по которым мы будем фильтровать
  FilterNum = 4; 

  // имена этих полей
  FieldNames: array [1..FilterNum] of string =
    ('SpeciesNo', 'Category', 'Common_Name', 'Species Name');

  // основной запрос, к которому будет добавляться динамический сформированный фильтр
  SelectClause: string =
    'select * from biolife';

type
  TForm1 = class(TForm)
    Query1: TQuery;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  // собственно, будущий фильтр
  WhereClause: string;
  i: integer;
  Edit: TEdit;
begin
  WhereClause := '';
  // перебираем фильтрумые поля, см (1) в конце.
  for i := 1 to FilterNum do begin
    // находим Edit для i-го поля, подразумевая что все едиты названы стандартно
    Edit := (FindComponent ('Edit' + IntToStr (i)) as TEdit);
    // обязательная проверка на nil - т.е. мы убеждаемся, что мы свой едит нашли
    if (Edit <> nil) and (Edit.Text <> '') then begin
      // если фильтр не пустой, то надо добавить OR к предыдущему условию
      if WhereClause <> '' then
        WhereClause := WhereClause + ' OR ';
      // добавляем к фильтру слеюующее условие
      WhereClause := WhereClause + '(' + FieldNames [i] + ' like ''%' + Edit.Text + '%'')';
    end;
  end;
  // если фильтр пустой, ничего не введено, то тупое присвоение 
  // ему "WHERE" - даст ошибку. поэтому опять проверям.
  if WhereClause <> '' then
    WhereClause := ' WHERE ' + WhereClause;
  // при изменении SQL квери закрывается автоматом, поэтому закрывать 
  // её руками - смысла нет. сразу присваиваем то, что нам надо
  Query1.SQL.Text := SelectClause + WhereClause;
  // БАНЗАЙ!!!
  Query1.Active := TRUE;
end;

end.


(1) на самом деле, это сляпано на глазок, и это не лучший способ. лучше, если выставить TEdit'ам свойство Tag равным нужному индексу в массиве полей, и делать перебор всех контролов, проверять, что это едит, брать его тэг, и по тэгу получать имя поля.

единственный возможный глюк в этом коде - Багланд умудрились засунуть в таблицу поле с пробелом (!) в его имени. у меня лично не работает фильтр по Species Name, даже по "Sepices Name" не работает, я фиг его знает, как эти дятлы додумались до такого. так делать нельзя никогда smile

второй момент, у меня используется OR - т.е. если хоть одно из введённых юзверем значений совпадёт с нужным полем - то запись с этим полем отобразиться. но могут быть и другие условия, AND, например smile

успехов smile разберись с этим кодом и сделай по аналогии. 


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Fast
Дата 22.4.2006, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(RooR @  21.4.2006,  17:34 Найти цитируемый пост)
оиск по всем полям, весь dbgrid очищается, какбудто конект проподает к adoconnection

Так может быть просто нету записей которые удовлетворяют условию!!!!!!!!!!
А вообще Select * From обычно делают через ADOdataset !!!
Попробуй так !!!
Код

procedure TForm5.Button6Click(Sender: TObject);
var
mFilter, nFilter, xFilter : String;
begin
With Form1 do
begin
ADOQuery1.Active := False;
ADOQuery1.SQL.Clear;
mFilter := 'Select * From BOOK Where ';
nFilter := '';
if Edit1.Text <> '' then
nFilter := nFilter + ' AND Издательство =#' + Edit1.Text + '#';
if Edit2.Text <> '' then
nFilter := nFilter + ' AND Название =#' + Edit2.Text + '#';
if Edit3.Text <> '' then
nFilter := nFilter + ' AND Автор =#' + Edit3.Text + '#';
if Edit4.Text <> '' then
nFilter := nFilter + ' AND [Шифр книги] =#' + Edit4.Text + '#';
Delete(nFilter,1,5);
xFilter := mFilter + nFilter;
ShowMessage(xFilter); // Это используется чтобы посмотреть как выглядет твой запрос ПОТОМ УДАЛИ!!!!
ADOQuery1.SQL.Text := xFilter;
ADOQuery1.ExecSQL;
end
end;


Если не будет работать выполняй это действие через AdoDataSet а не через AdoQuery  

Это сообщение отредактировал(а) Fast - 22.4.2006, 01:19
PM MAIL   Вверх
x77
Дата 22.4.2006, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Fast, у тебя всегда прошивается 'where', т.е. если юзверь ничего не выбрал, запрос будет выглядеть как 'select * from ... where' - и он всегда даст ошибку. там нужна проверка. 


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Fast
Дата 22.4.2006, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(x77 @  22.4.2006,  01:33 Найти цитируемый пост)
Fast, у тебя всегда прошивается 'where', т.е. если юзверь ничего не выбрал, запрос будет выглядеть как 'select * from ... where' - и он всегда даст ошибку. там нужна проверка. 

А да что то я не обратив внимание  smile 
Щас исправлю  smile

Добавлено @ 02:08 
Вот так  smile 

Код

procedure TForm5.Button6Click(Sender: TObject);
var
mFilter, nFilter, xFilter : String;
begin
With Form1 do
begin
ADOQuery1.Active := False;
ADOQuery1.SQL.Clear;
mFilter := 'Select * From BOOK Where ';
nFilter := '';
if Edit1.Text <> '' then
nFilter := nFilter + ' AND Издательство =#' + Edit1.Text + '#';
if Edit2.Text <> '' then
nFilter := nFilter + ' AND Название =#' + Edit2.Text + '#';
if Edit3.Text <> '' then
nFilter := nFilter + ' AND Автор =#' + Edit3.Text + '#';
if Edit4.Text <> '' then
nFilter := nFilter + ' AND [Шифр книги] =#' + Edit4.Text + '#';
if nFilter := '' then                            // Если ничего не ввели !!!
ShowMessage('Вы неввели параметры запроса')
else
begin
Delete(nFilter,1,5);
xFilter := mFilter + nFilter;
ShowMessage(xFilter); // Это используется чтобы посмотреть как выглядет твой запрос ПОТОМ УДАЛИ!!!!
ADOQuery1.SQL.Text := xFilter;
ADOQuery1.ExecSQL;
end;
end;
end;
  

Это сообщение отредактировал(а) Fast - 22.4.2006, 02:11
PM MAIL   Вверх
Palladin
Дата 24.4.2006, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

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



Блин всёровно не пашет, ошибки за ошибками, весь день убил на это, чёто не выходит, может у когонить есть ссылка на материал по данному поводу 


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Fast
Дата 24.4.2006, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А тебе обязательно использовать SQL ?

Добавлено @ 01:41 
Или скинь сейчас сорцы я посмотрю  smile  
PM MAIL   Вверх
TheCetus
Дата 24.4.2006, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Fast, в 10-й строке лучше написать следующим образом:
mFilter := 'Select * From BOOK Where 1=1 ';
тогда если пользователь не введет ни одного условия ошибки вылетать не будет...
в твоем же случае запрос  примет вид
'Select * From BOOK Where ' , что несомненно приведет к ошибке 
PM MAIL   Вверх
Fast
Дата 24.4.2006, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(TheCetus @  24.4.2006,  08:30 Найти цитируемый пост)
Fast, в 10-й строке лучше написать следующим образом:
mFilter := 'Select * From BOOK Where 1=1 ';
тогда если пользователь не введет ни одного условия ошибки вылетать не будет...
в твоем же случае запрос  примет вид
'Select * From BOOK Where ' , что несомненно приведет к ошибке  


Код

if nFilter := '' then                           
ShowMessage('Вы неввели параметры запроса')
else


Я это не просто так написал  smile  
PM MAIL   Вверх
Palladin
Дата 25.4.2006, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

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



Мне не обязательсно SQL, я пробовал через фильтр, по одному полю ищет прекрасно, а вот когда по нескольким то фигня какаята, нехочет искать, то отобразит не то что нужно, то вообще всё уберёт и т.п.  Я готов выслушать любые предложения по поводу поиска smile  


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0935 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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