Рассмотрим процедуру, открывающую таблицу "c:\db\u2_fakul.dbf". Доступными будут все поля и все записи:
procedure TForm1.Button1Click(Sender: TObject);
begin
// Привязываем компонент Datasource1 к компоненту DBGrid1
DBGrid1.DataSource:=Datasource1;
// Привязываем компонент Query1 к компоненту Datasource1
DataSource1.DataSet:=Query1;
// Указываем каталог таблиц БД
DataSource1.DataBaseName:=’ c:\student\db’;
with query1 do begin
Close; // Закрываем (на всякий случай) данные в компоненте Query1
SQL.Clear; // Очищаем текст SQL-запроса
// Занесем в компонент query1 текст SQL-запроса
SQL.Add('select *'); // даем команду выбрать все поля
SQL.Add('from "u2_fakul.db"'); // указываем имя таблицы БД
Open; // Открываем таблицу данных "c:\db\u2_fakul.db"
end;
end;
Рассмотрим фрагмент процедуры, открывающий таблицу "c:\db\u2_fakul.dbf", причем записи будут доступные все, а поля только с именами «name» и «kod_fakul». Все записи отсортируются по полю «name» в возрастающем порядке.
with query1 do begin
Close; SQL.Clear;
SQL.Add('select name, kod_fakul');
SQL.Add('from "c:\db\u2_fakul.dbf"');
SQL.Add('order by name');
Open;
end;
Рассмотрим фрагмент процедуры, открывающий таблицу "c:\db\u2_fakul.dbf", причем записи будут доступные все, а поля только с именами «name» и «kod_fakul». Все записи отсортируются по полю «kod_fakul» в возрастающем порядке и по полю «name» в убывающем порядке. В тексте SQL-запроса используются две строковые переменные s1 и s2.
var s1,s2: string;
begin
with query1 do begin
s1:='name, kod_fakul'; s2:='c:\db\u2_fakul.dbf';
Close; SQL.Clear;
SQL.Add('select '+s1); SQL.Add('from "'+s2+'"');
SQL.Add('order by kod_fakul, name DESC');
Open;
end;
end;
После открытия данных командой «Open» текст SQL-запроса не имеет значения, и его изменение не изменит отображаемых компонентом данных. Для активизации нового текста SQL-запроса необходимо закрыть данные компонента “Query” командой «Close», после чего задать новый текст запроса и открыть данные командой «Open».
Программирование с использованием SQL-запросов является наиболее передовой технологией работы с базами данных. Данная технология называется реляционным способом доступа к базе данных. Непосредственный доступ к базе данных через компонент «Table» называется навигационным способом. Навигационный способ является устаревшим, т.к. он рассчитан на использование локальных базам данных без сетевой поддержки.
При работе с распределенными в сети (коллективными) базами данных используется только реляционный способ, т.к. только он позволяет предотвращать сетевые коллизии при одновременном доступе нескольких пользователей к базе данных, и существенно разгружает сетевой трафик. Поэтому рекомендуется использовать компонент “Query” вместо компоненты «Table», хотя нужно отметить, что навигационный способ обычно работает быстрей, чем реляционный.
Использование реляционного способа доступа к БД через компоненту “Query” позволяет не только легко производить сложнейшую обработку нескольких взаимосвязанных таблиц данных, но и производить модификацию данных (вставлять новые записи, производить групповое удаление данных, делать каскадную замену информации и др.).
Пример отбора записей по значениям символьного поля:
SELECT Name FROM Pers WHERE Post=’Менеджер’
// А лучше так:
SELECT Name FROM Pers WHERE UPPER(TRIM(Post))=’МЕНЕДЖЕР’
Использование псевдонимов:
SELECT P.Name FROM “People.db” As P
Пример сцепления двух таблиц:
SELECT p.fio,p.tel
FROM “tel.db” as t, “people.db” as p
WHERE t.code_p =p.code_p;
Компонент “Table” имеет множество событий, которые возникают при любой работе с базой данных, будь то открытие БД, закрытие, переход на другую запись, удаление записи и т.д. Данные события могут возникнуть в одинаковой степени при работе с любым визуальным компонентом, связанным с базой данных. Основные события компонента следующие:
Имя события | Событие возникает |
AfterOpen / BeforeOpen | После / перед открытием базы данных (например, для метода Open) |
AfterClose / BeforeClose | После / перед закрытием базы данных (например, для метода Close) |
AfterScroll / BeforeScroll | После / перед переходом на другую запись в БД (например, для метода Next) |
AfterEdit / BeforeEdit | После / перед началом редактирования текущей записи (например, для метода Edit) |
OnEditError | В случаи возникновения ошибки при попытке начать редактирование текущей записи (например, для метода Edit) |
AfterInsert / BeforeInsert / OnNewRecord | После / перед / в процессе вставки или добавления в БД новой записи (например, для метода Insert) |
AfterPost / BeforePost | После / перед сохранением сделанных изменений в текущей записи (например, для метода Post) |
OnPostError | В случаи возникновения ошибки при сохранении сделанных изменений в текущей записи (например, для метода Post) |
AfterDelete / BeforeDelete | После / перед удалением текущей записи (например, для метода Delete) |
OnDeleteError | В случаи возникновения ошибки при удалении текущей записи (например, для метода Delete) |
AfterCancel / BeforeCancel | После / перед отменой сделанных изменений в текущей записи (например, для метода Cancel) |
Контроль ввода данных перед сохранением записи:
procedure Table_FakulBeforePost(DataSet: TDataSet);
var s: string;
begin
try s:=table1['name']; except s:=''; end;
if s='' then begin
MessageDlg('Укажите имя!', mtInformation, [mbOK],0); abort;
end;
end;
1. Использование закладок:
procedure TForm1.Button1Click(Sender: TObject);
var SaveP: TBookmark;
begin
try
SaveP := Table1.GetBookmark;
…………………
Table1.GotoBookmark(SaveP);
Table1.FreeBookmark(SaveP);
except end;
end;
2. Показ количества записей в БД:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
try
StaticText1.caption:='Всего доступно записей: '+inttostr(Table1.recordcount);
except; end;
Application.ProcessMessages;
end;
3. Изменение значений поля через SQL-запрос:
UPDATE Pers.db
SET Salary = Salary + 50
WHERE Salary < 500 // Если сотрудник имеет оклад менее 500 руб., то его оклад увелич. на 50 руб.
………
UPDATE Store.db
SET S_Price = S_Price * 1.1 // Цена всех товаров увеличивается на 10 %
4. Добавление записи через SQL-запрос:
INSERT INTO Store.db
(Name, Price) VALUES (“Морковь”, 4.7)
5. Добавление нескольких записей через сложный SQL-запрос:
INSERT INTO CardsArchives (Code, Move, Date)
SELECT C_Code, C_Move, C_Date
FROM Cards WHERE C_Date BETWEEN 1.1.98 AND 31.12.98
6. Удаление записей через SQL-запрос:
DELETE FROM Store.db
WHERE S_Quantify = 0
7. Использование параметров в SQL-запросах (свойство «Params» типа «TParams»):
Query1.ParamByName(‘pCena’).AsFloat:= StrToFloat(Edit1.Text);
или
Query1.Params[0].AsFloat:= StrToFloat(Edit1.Text);
Пример с параметром:
SELECT Name, Post, Cena
FROM Pers.db
WHERE Cena >= :pCena