Поиск в Базе Данных (.db) на Delphi
У меня такой вопрос!
У меня курсовая Телефонный справочник и я сделал таблицу Table 1.db где заголовки Фамилия Имя Адрес и Телефон. В Administrator BDE сделал базу данных "Телефонный справочник". Сделал кнопку "Поиск" !
А теперь вопрос а как сделать поиск по моей базе, я уже искал много где примеров, но не получается! Вот текст моей программы(если он поможет):
unit Kursovaja;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids, Db, DBTables, ExtCtrls, DBCtrls, StdCtrls, Buttons,
MPlayer, Menus, ActnList, QRPrntr;
type
TForm1 = class(TForm)
Table1: TTable;
Query1: TQuery;
DBNavigator1: TDBNavigator;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
fam:string[50];
begin
fam:=InputBox('Поиск','Введите фамилию для поиска и нажмите ОК','');
if fam <> '' then
begin
with Form1.Query1 do begin
Close;
SQL.Clear;
SQL.Add('SELECT Фамилия, Имя, Адрес');
SQL.Add('FROM ":Телефонный справочник:Table 1.db"');
SQL.Add('WHERE');
SQL.Add('(Фамилия = "'+ fam + '")');
SQL.Add('ORDER BY Имя, Фамилия');
Open;
end;
if Query1.RecordCount <> 0 then
DataSource1.DataSet:=Query1
else begin
ShowMessage('Нет записей.');
DataSource1.DataSet:=Table1;
end;
end;
end;
end.
Я попробывал сделать с помощью SQL :
В свойствах Query:
DataBaseName: Телефонный справочник
DataSource: DataSource1
Name: Query1
Active: False
Когда Active ставлю True выдает ошибку: Query1: No SQL statement available.
А если оставить False, то при поиске выдает всё время, что "Нет Записей"!
Помогите пожалуйста!
Заранее спасибо!
Спешу тебя обрадовать: таблицы и имена полей в BDE нужно делать на английском языке и желательно без пробелов. Во всяком случае у меня с русскими символами глючило постоянно.
form1.table1.IndexName:='имяполя';
form1.table1.SetKey;
form1.table1.Active:=true;
form1.table1.setrange([edit1.Text],[edit2.Text]);
form1.table1.applyrange;
ну естественно поле-проиндексировано раз
два - в едиты вбиваешьь диапозоны для твого варианта подходит такие к примеру выборка всех № с 2-10-10 по 2-99-99 из всей базы.
отменяется это дело так:form1.table1.cancelyrange;
вот и все вроде бы...аДъЮ
У меня если честно не получилось как ты сказал!
Не мог бы ты написать по подробнее!
Заранее спасибо!
Я поменял заголовки в Таблице на Английские!
Но всё равно не работает! В SQL не хочет ставиться Active: True; выдает туже ошибку что и раньше.
При компиляции всё запускается, нажимаю кнопку Поиск открывается окно поиска, пишу фамилию и нажимаю ОК и оно выдает вот такую ошибку:
"Project Project1.exe raised exception class EdatabaseError with massage 'DataSource1: Circular datalinks are not allowed'. Process stopped. Use Step or Run to continue."
Нажимаю ОК выделяет строчку: "DataSource1.DataSet:=Query1"
Я не знаю может что-то в SQL надо прописать т.к. я там ничего не писал!
С SQL я делал только это:
Создал Query.
Поставил:Action: False (на True не ставится)
DatabaseName: STABDART1
DataSource: DataSource1
Name: Query1 (стандартно не менял)
Ну и текст программы (на всякий случай):
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, DBGrids, Db, DBTables;
type
TForm1 = class(TForm)
DataSource1: TDataSource;
Table1: TTable;
DBGrid1: TDBGrid;
Button1: TButton;
Button2: TButton;
Query1: TQuery;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.Close;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
s: string[50];
begin
s := InputBox('Поиск','Введите фамилию и нажмите OK','');
if s <> '' then
begin
with form1.Query1 do begin
Close;
SQL.Clear;
SQL.Add('SELECT Famil, Name, Telefon');
SQL.Add('FROM ":STANDARD1:Table 1.db"');
SQL.Add('WHERE');
SQL.Add('(Famil = "'+ s + '")');
SQL.Add('ORDER BY Name, Famil');
Open;
end;
if Query1.RecordCount <> 0 then
DataSource1.DataSet:=Query1
else begin
ShowMessage('Нет записей.');
DataSource1.DataSet:=Table1;
end;
Помогите пожалуйста!
Заранее спасибо!
Цитата:
Originally posted by Zorro_13
Привет hardcase!
Я поменял заголовки в Таблице на Английские!
Но всё равно не работает! В SQL не хочет ставиться Active: True; выдает туже ошибку что и раньше.
При компиляции всё запускается, нажимаю кнопку Поиск открывается окно поиска, пишу фамилию и нажимаю ОК и оно выдает вот такую ошибку:
"Project Project1.exe raised exception class EdatabaseError with massage 'DataSource1: Circular datalinks are not allowed'. Process stopped. Use Step or Run to continue."
Нажимаю ОК выделяет строчку: "DataSource1.DataSet:=Query1"
Я не знаю может что-то в SQL надо прописать т.к. я там ничего не писал!
С SQL я делал только это:
Создал Query.
Поставил:Action: False (на True не ставится)
DatabaseName: STABDART1
DataSource: DataSource1
Name: Query1 (стандартно не менял)
Ну и текст программы (на всякий случай):
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, DBGrids, Db, DBTables;
type
TForm1 = class(TForm)
DataSource1: TDataSource;
Table1: TTable;
DBGrid1: TDBGrid;
Button1: TButton;
Button2: TButton;
Query1: TQuery;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.Close;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
s: string[50];
begin
s := InputBox('Поиск','Введите фамилию и нажмите OK','');
if s <> '' then
begin
with form1.Query1 do begin
Close;
SQL.Clear;
SQL.Add('SELECT Famil, Name, Telefon');
SQL.Add('FROM ":STANDARD1:Table 1.db"');
SQL.Add('WHERE');
SQL.Add('(Famil = "'+ s + '")');
SQL.Add('ORDER BY Name, Famil');
Open;
end;
if Query1.RecordCount <> 0 then
DataSource1.DataSet:=Query1
else begin
ShowMessage('Нет записей.');
DataSource1.DataSet:=Table1;
end;
Помогите пожалуйста!
Заранее спасибо!
Привет hardcase!
Я поменял заголовки в Таблице на Английские!
Но всё равно не работает! В SQL не хочет ставиться Active: True; выдает туже ошибку что и раньше.
При компиляции всё запускается, нажимаю кнопку Поиск открывается окно поиска, пишу фамилию и нажимаю ОК и оно выдает вот такую ошибку:
"Project Project1.exe raised exception class EdatabaseError with massage 'DataSource1: Circular datalinks are not allowed'. Process stopped. Use Step or Run to continue."
Нажимаю ОК выделяет строчку: "DataSource1.DataSet:=Query1"
Я не знаю может что-то в SQL надо прописать т.к. я там ничего не писал!
С SQL я делал только это:
Создал Query.
Поставил:Action: False (на True не ставится)
DatabaseName: STABDART1
DataSource: DataSource1
Name: Query1 (стандартно не менял)
Ну и текст программы (на всякий случай):
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, DBGrids, Db, DBTables;
type
TForm1 = class(TForm)
DataSource1: TDataSource;
Table1: TTable;
DBGrid1: TDBGrid;
Button1: TButton;
Button2: TButton;
Query1: TQuery;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.Close;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
s: string[50];
begin
s := InputBox('Поиск','Введите фамилию и нажмите OK','');
if s <> '' then
begin
with form1.Query1 do begin
Close;
SQL.Clear;
SQL.Add('SELECT Famil, Name, Telefon');
SQL.Add('FROM ":STANDARD1:Table 1.db"');
SQL.Add('WHERE');
SQL.Add('(Famil = "'+ s + '")');
SQL.Add('ORDER BY Name, Famil');
Open;
end;
if Query1.RecordCount <> 0 then
DataSource1.DataSet:=Query1
else begin
ShowMessage('Нет записей.');
DataSource1.DataSet:=Table1;
end;
Помогите пожалуйста!
Заранее спасибо!
Когда описываешь кляузу FROM, попробуй писать просто table1 (дабы не иметь на свою голову лишнего гимора, рекомендую таблицу все-таки переименовать, чтоб без пробелов была), а в свойстве DatabaseName объекта Query1 прописать алиас твоей БД (какой указан в BDE-администраторе), т.е. по аналогии с объектом Table1.
begin
Close;
SQL.Clear;
SQL.Add('SELECT *');
SQL.Add('FROM "nameofbase.db"');
SQL.Add('WHERE');
SQL.Add('(nomer = "'+ nomer +'")');
Open;
Active:= TRUE;
end;
if Form1.Query1.RecordCount <> 0
then
begin
Form1.DataSource1.DataSet:= Form1.Query1;
end
else
begin
MessageDlg('НЕТ ДАННЫХ УДОВЛЕТВОРЯЮЩИХ ЗАПРОСУ.',mtInformation,[mbOk],0);
Form1.DataSource1.DataSet:= Table1;end;
это запрос
а фильтр вот таким макаром делается
begin
with Table1 do
begin
Table1.IndexName:='Spec2';
Table1.SetKey;
Table1.Active:=true;
setrange(['диапозон1'],[диапозон2]);
applyrange;
end;
ну если после этого не получается то блин пришли мне свою прогу и файлы БД без екзешника я пошаманю...не бросать же парня в беде *-)...
Цитата: Zorro_13
Привет hardcase!
Я поменял заголовки в Таблице на Английские!
Но всё равно не работает! В SQL не хочет ставиться Active: True; выдает туже ошибку что и раньше.
При компиляции всё запускается, нажимаю кнопку Поиск открывается окно поиска, пишу фамилию и нажимаю ОК и оно выдает вот такую ошибку:
"Project Project1.exe raised exception class EdatabaseError with massage 'DataSource1: Circular datalinks are not allowed'. Process stopped. Use Step or Run to continue."
Нажимаю ОК выделяет строчку: "DataSource1.DataSet:=Query1"
Я не знаю может что-то в SQL надо прописать т.к. я там ничего не писал!
С SQL я делал только это:
Создал Query.
Поставил:Action: False (на True не ставится)
DatabaseName: STABDART1
DataSource: DataSource1
Name: Query1 (стандартно не менял)
Я поменял заголовки в Таблице на Английские!
Но всё равно не работает! В SQL не хочет ставиться Active: True; выдает туже ошибку что и раньше.
При компиляции всё запускается, нажимаю кнопку Поиск открывается окно поиска, пишу фамилию и нажимаю ОК и оно выдает вот такую ошибку:
"Project Project1.exe raised exception class EdatabaseError with massage 'DataSource1: Circular datalinks are not allowed'. Process stopped. Use Step or Run to continue."
Нажимаю ОК выделяет строчку: "DataSource1.DataSet:=Query1"
Я не знаю может что-то в SQL надо прописать т.к. я там ничего не писал!
С SQL я делал только это:
Создал Query.
Поставил:Action: False (на True не ставится)
DatabaseName: STABDART1
DataSource: DataSource1
Name: Query1 (стандартно не менял)
У меня тоже такая фигня была. Если в свойстве DataSource компонента Query ничего не ставить, а в свойстве DataSet компонента DataSource поставить Query1 то всё путём. Попробуй.