Автор работы: Пользователь скрыл имя, 26 Января 2013 в 14:13, лекция
Программирование баз данных - очень большой и серьезный раздел самого что ни на есть практического программирования. На предыдущем курсе "Введение в программирование на Delphi" мы лишь коснулись этой темы, затронули даже не верхушку айсберга под названием Базы Данных, а только его макушку. Между тем, многие программисты большую часть своего времени тратят именно на проектирование баз данных и разработку приложений, работающих с ними. Это неудивительно - в настоящее время каждая государственная организация, каждая фирма или крупная корпорация имеют рабочие места с к
Сортировку по имени кодируем аналогичным образом:
{Сортировать по имени}
procedure TfMain.NImyaClick(Sender: TObject);
var
stype : String;
begin
//выбираем направление
if NObrat.Checked then stype := ' DESC'
else stype := ' ASC';
//сортируем
fDM.TLichData.IndexFieldNames := 'Имя' + stype;
end;
Нам осталось указать код пункта всплывающего меню "Обратная сортировка". Тут нам нужно не просто установить галочку, если ее не было, но также проверить - есть ли сортировка по какому либо полю? Если таблица отсортирована, требуется ее пересортировать по этому же полю, но уже в обратном порядке. Вот код:
{Команда "Обратная сортировка"
procedure TfMain.NObratClick(Sender: TObject);
begin
//изменяем направление сортировки
NObrat.Checked := not NObrat.Checked;
//если сортировка по фамилии, пересортируем
if Pos('Фамилия',fDM.TLichData.
fMain.NFamClick(Sender);
//если сортировка по имени, пересортируем
if Pos('Имя',fDM.TLichData.
fMain.NImyaClick(Sender);
end;
Как видите, мы использовали функцию Pos(), которая возвратит ноль, если в строке не найдено указанной подстроки, или номер символа, с которого эта подстрока начинается, если она есть. Нам нужно определить, не входит ли в имя индексного поля "Фамилия" или "Имя". Ведь к имени поля добавлена строка ' ASC' или ' DESC', так что прямая проверка
if fDM.TLichData.IndexFieldNames = 'Фамилия' then
результата не даст, в любом случае результатом было бы False. Ну а для пересортировки мы вызываем соответствующий пункт меню, чтобы не писать код сортировки еще раз, например:
fMain.NFamClick(Sender);
Следует заметить, что при большом количестве записей в таблице смена индексного поля будет несколько замедлять работу приложения. Тем не менее, индексация таблицы - очень удобный и часто применяемый способ организации вывода записей.
В свойстве PopupMenu верхней сетки DBGrid1 выберите созданное только что всплывающее меню, чтобы оно открывалось только над этой сеткой, сохраните проект, скомпилируйте его и опробуйте сортировку данных.
Напоследок заметим, что мы имеем возможность применить одновременно и фильтрацию записей, и их индексацию. Это позволяет нам создать достаточно мощный и удобный для пользователя механизм поиска записей в нашей программе.
4.
Лекция: Наборы данных. Основные свойства,
методы и события: версия для печати и
PDA
На этой лекции вы познакомитесь с наиболее
востребованными свойствами, методами
и событиями, общими для всех наборов данных,
потомков класса TDataSet. Кроме того, поговорим
о методах блокировки данных при использовании
файл-серверной архитектуры, а также о
курсорах, специфичных для механизма ADO.
До сих пор мы работали с таблицами с помощью компонента TADOTable. На самом деле мы работали не с самими таблицами, а с Набором данных (DataSet). Набор данных - это коллекция записей из одной или нескольких таблиц базы данных. Наборы данных можно получить с помощью компонент TADOTable, TADOQuery или TADOStoredProc, который необходим для архитектуры клиент-сервер. Каким образом получаются наборы данных? Когда мы открываем таблицу, то есть, присваиваем True свойству Active компонента TADOTable, например, специальный механизм делает выборку записей в соответствии с заданными параметрами, и возвращает нам эти записи в виде таблицы. Можно сказать, что наборы данных - это прослойка между нашим приложением и реальными таблицами, хранящимися в базе данных. Все указанные выше компоненты являются наборами данных, имеют общего предка - класс TDataSet и заимствовали от него свойства, методы и события, добавляя собственные возможности. Об этом и поговорим на этой лекции.
Active - Свойство имеет логический тип и позволяет открыть или закрыть набор данных, если свойству присвоить True или False соответственно. В зависимости от свойства CanModify данные можно либо только просматривать, либо можно также редактировать их.
AutoCalcFields - Свойство логического типа. Если установить значение False, то возникновение события OnCalcFields будет подавляться, вычисляемые поля обрабатываться не будут. Значение True разрешает расчет вычисляемых полей.
Bof - Свойство имеет логический тип и содержит True, если курсор находится на первой записи набора данных, и False в противном случае. Bof содержит True, когда:
Bookmark- Свойство позволяет установить закладку на текущей записи набора данных. Количество закладок может быть неограниченно, работа с закладками рассматривалась на курсе "Введение в программирование на Delphi". Свойство имеет тип TBookmarkStr.
CanModify - Свойство имеет логический тип, и показывает, можно ли редактировать полученный набор данных, или он доступен только для чтения. При открытии набора данных автоматически запрашивается доступ для редактирования. В таком доступе может быть отказано по разным причинам, например, таблица открыта другим пользователем в эксклюзивном режиме. В этом случае CanModify получает значение False, и мы можем только просматривать данные, но не вносить в них изменения.
DatabaseName - Свойство строкового типа, содержит адрес базы данных или ее псевдоним. Однако это справедливо к наборам данных BDE. В случае использования механизма ADO, это свойство недоступно - вместо него для подключения к базе данных следует использовать свойство Connection или ConnectionString.
DataSource - Свойство используется в наборах данных для указания детального набора данных в отношениях один-ко-многим.
DefaultFields - Свойство логического типа, содержит True, если программист не создал ни одного поля в редакторе полей набора данных. В этом случае все поля определяются автоматически, в соответствии с данной таблицей.
Eof - Свойство, противоположное свойству Bof. Имеет логический тип, и имеет значение True в случаях, когда:
FieldCount - Свойство целого типа, содержит количество полей в наборе данных.
Fields - Свойство позволяет получить значение нужного поля по его индексу. Поля при этом индексируются с нуля. Например, получить значение седьмого по счету поля набора данных можно так:
Edit1.Text := CustTable.Fields[6].Value;
FieldValues - Свойство позволяет получить значение нужного поля по его имени. Это свойство используется по умолчанию, поэтому его можно не указывать. Примеры:
Edit1.Text := CustTable. FieldValues ['Order'];
Edit1.Text := CustTable['Order'];
Filter - Свойство строкового типа. Содержит строку, которая определяет правила фильтрации набора данных.
Filtered - Свойство логического типа. Если в свойстве Filter имеется строка, определяющая порядок фильтрации, то присвоение значения True свойству Filtered приводит к фильтрации набора данных. Присвоение этому свойству False отменяет фильтрацию.
FilterOptions - Свойство имеет тип TFilterOptions и применяется для строковых или символьных полей. Свойству можно присвоить значение foCaseInsensitive или foNoPartialCompare. В первом случае фильтрация будет учитывать регистр букв, во втором учитывается лишь точное совпадение образцу.
Modified - Очень важное свойство логического типа. Содержит True, если набор данных был изменен, и False в противном случае. Часто применяется для проверок: если набор данных изменен, то вызвать метод Post, чтобы сохранить изменения.
RecNo и RecordCount - Свойства целого типа. Первое содержит номер текущей записи в наборе данных, второе - общее количество записей.
State - Очень важное свойство, определяющее состояние набора данных. Может иметь следующие значения:
Append - Метод добавляет новую запись в конец набора данных. При этом набор данных автоматически переходит в режим редактирования.
AppendRecord(const Values: array of const) - Метод добавляет новую запись в конец набора данных, и заполняет поля этой записи значениями из массива, переданного в метод как параметр.
Cancel - Отменяет все изменения набора данных, если они еще не сохранены методом Post или переходом на другую запись.
ClearFields - Метод очищает все поля текущей записи.
Close - Закрывает набор данных. Метод является альтернативой присваивания False свойству Active набора данных.
Delete - Метод удаляет текущую запись. Следует заметить, что во многих форматах данных удаляемая запись лишь помечается, как удаленная, и скрывается от пользователя. Физически же такая запись из файла не удаляется. В этом случае обычно время от времени приходится "паковать" таблицы, избавляясь от таких записей.
Edit - Метод переводит набор данных в состояние редактирования. Если этого не сделать, изменение записи будет невозможным.
FieldByName - Еще один способ получить значение поля или изменить его, указывая имя поля. При этом можно использовать явное преобразование данных в нужный тип, например, AsInteger, AsString и т.п. Пример:
Table1. FieldByName ('QUANTITY').AsInteger := StrToInt(Edit1.Text);
FindFirst, FindLast, FindNext и FindPrior - Методы пытаются установить курсор соответственно, на первую, на последнюю, на следующую и на предыдущую запись. В случае успеха методы возвращают True. Переход к другой записи приводит к автоматическому сохранению изменений, если изменения были.
First, Last, Next и Prior - просто устанавливают указатель соответственно на первую, последнюю, следующую и предыдущую запись. Переход к другой записи приводит к автоматическому сохранению изменений, если изменения были.
FreeBookmark - Метод освобождает память, связанную с закладкой Bookmark. Обычно вместо вызова этого метода достаточно присвоить закладке пустую строку (см. лекцию 30 курса "Введение в программирование на Delphi").
GotoBookmark - Метод обеспечивает переход на закладку Bookmark, переданную в качестве параметра.
Insert - Метод вставляет новую запись в указанную в параметре позицию набора данных. При этом набор данных автоматически переходит в режим редактирования.
InsertRecord(const Values: array of const) - Метод вставляет новую запись в набор данных, и заполняет поля этой записи значениями из массива, переданного в метод как параметр. Пример:
Customer. InsertRecord ([CustNoEdit.Text, CoNameEdit.Text,
Null, Null, DiscountEdit.Text]);
Обратите внимание, что в некоторые поля были вставлены значения Null, то есть, ничего. То же самое происходит, когда пользователь при редактировании записи вносит значения не во все поля.
IsEmpty - Метод возвращает True, если в наборе данных нет записей. Применяется для проверки - не пуста ли таблица?
Locate - Метод ищет запись в наборе данных (см. предыдущую лекцию).
Lookup - Метод ищет запись в наборе данных (см. предыдущую лекцию). В отличие от Locate не переводит указатель на найденную запись, а лишь возвращает значения ее полей.
Open - Метод открывает набор данных. То же самое происходит, если свойству Active набора данных присвоить значение True.
Post - Метод сохраняет сделанные изменения в наборе данных.
Refresh - Метод заново перечитывает таблицу и обновляет набор данных. Имеет смысл использовать в приложениях, где несколько пользователей работают с одной базой данных.
After… - События, возникающие после вызова соответствующего метода:
AfterCancel - Событие возникает после отмены изменений в текущей записи.
AfterClose - Событие возникает после закрытия набора данных.
AfterDelete - Событие возникает после удаления текущей записи.
AfterEdit - Событие возникает после перехода набора данных в режим редактирования.
AfterInsert - Событие возникает после вставки новой записи.
AfterOpen - Событие возникает после открытия набора данных.
AfterPost - Событие возникает после вызова метода Post.
AfterScroll - Событие возникает после перехода на другую запись.
Before… - События, возникающие перед вызовом соответствующего метода:
BeforeCancel - Событие возникает перед отменой изменений в текущей записи.
BeforeClose - Событие возникает перед закрытием набора данных.
BeforeDelete - Событие возникает перед удалением текущей записи.
BeforeEdit - Событие возникает перед переходом набора данных в режим редактирования.
BeforeInsert - Событие возникает перед вставкой новой записи.
BeforeOpen - Событие возникает перед открытием набора данных.
BeforePost - Событие возникает перед вызовом метода Post.
BeforeScroll - Событие возникает перед переходом на другую запись.
OnCalcFields - Событие возникает при необходимости переопределения вычисляемых полей. Такое событие возникает всякий раз, когда программа должна сформировать значения для вычисляемых полей. Событие возникает также при открытии набора данных, и при любом его изменении. Если алгоритм вычислений достаточно сложен, база данных большая, а пользователь интенсивно с ней работает, событие OnCalcFields может значительно замедлить работу с базой данных. В этом случае следует отключать это событие. Для этого достаточно присвоить значение False свойству AutoCalcFields текущего набора данных.
OnFilterRecord - Событие возникает при включении фильтрации записей.
OnNewRecord - Событие возникает при вызове методов Append или Insert.
При работе в архитектуре файл-сервер с единой сетевой базой данных работают несколько клиентских приложений. При этом нередко возникает ситуация, когда один пользователь вносит изменения в базу данных. В этот момент, во избежание потери или порчи данных, следует запретить внесение изменений другими пользователями.