Программирование баз данных в Delphi

Автор работы: Пользователь скрыл имя, 26 Января 2013 в 14:13, лекция

Краткое описание

Программирование баз данных - очень большой и серьезный раздел самого что ни на есть практического программирования. На предыдущем курсе "Введение в программирование на Delphi" мы лишь коснулись этой темы, затронули даже не верхушку айсберга под названием Базы Данных, а только его макушку. Между тем, многие программисты большую часть своего времени тратят именно на проектирование баз данных и разработку приложений, работающих с ними. Это неудивительно - в настоящее время каждая государственная организация, каждая фирма или крупная корпорация имеют рабочие места с к

Вложенные файлы: 1 файл

Программирование баз данных в делфи.doc

— 2.17 Мб (Скачать файл)

Сортировку по имени кодируем аналогичным образом:

{Сортировать по имени}

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.IndexFieldNames)>0 then

    fMain.NFamClick(Sender);

  //если сортировка по имени,  пересортируем

  if Pos('Имя',fDM.TLichData.IndexFieldNames)>0 then

    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, когда:

  • Не пустой набор данных открывается.
  • При вызове метода First.
  • При вызове метода Prior, если курсор при этом на первой записи набора данных.
  • При вызове метода SetRange в пустом наборе данных или диапазоне.

Bookmark- Свойство позволяет установить закладку на текущей записи набора данных. Количество закладок может быть неограниченно, работа с закладками рассматривалась на курсе "Введение в программирование на Delphi". Свойство имеет тип TBookmarkStr.

CanModify - Свойство имеет логический тип, и показывает, можно ли редактировать полученный набор данных, или он доступен только для чтения. При открытии набора данных автоматически запрашивается доступ для редактирования. В таком доступе может быть отказано по разным причинам, например, таблица открыта другим пользователем в эксклюзивном режиме. В этом случае CanModify получает значение False, и мы можем только просматривать данные, но не вносить в них изменения.

DatabaseName - Свойство строкового типа, содержит адрес базы данных или ее псевдоним. Однако это справедливо к наборам данных BDE. В случае использования механизма ADO, это свойство недоступно - вместо него для подключения к базе данных следует использовать свойство Connection или ConnectionString.

DataSource - Свойство используется в наборах данных для указания детального набора данных в отношениях один-ко-многим.

DefaultFields - Свойство логического типа, содержит True, если программист не создал ни одного поля в редакторе полей набора данных. В этом случае все поля определяются автоматически, в соответствии с данной таблицей.

Eof - Свойство, противоположное свойству Bof. Имеет логический тип, и имеет значение True в случаях, когда:

  • Открыт пустой набор данных.
  • Вызван метод Last.
  • Вызван метод Next, если указатель при этом находится на последней записи таблицы.
  • При вызове метода SetRange в пустом наборе данных или диапазоне.

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 - Очень важное свойство, определяющее состояние набора данных. Может иметь следующие значения:

  • dsInactivate - набор данных закрыт.
  • dsBrowse - режим просмотра.
  • dsEdit - режим редактирования.
  • dsInsert - режим вставки.
  • dsSetKey - поиск записи.
  • dsCalcFields - состояние установки вычисляемых полей.
  • dsFilter - режим фильтрации записей.
  • dsNewValue - режим обновления свойства TField.NewValue.
  • dsOldValue - режим обновления свойства TField.OldValue.
  • dsCurValue - режим обновления свойства TField.CurValue.
  • dsBlockRead - состояние чтения блока записей.
  • dsInternalCalc - обновление полей, у которых свойство FieldKind соответствует значению fkInternalCalc.

Методы

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,

                                       AddrEdit.Text, Null, Null, Null, Null,

                                       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.

Блокировка таблиц в архитектуре  файл-сервер

При работе в архитектуре файл-сервер с единой сетевой базой данных работают несколько клиентских приложений. При этом нередко возникает ситуация, когда один пользователь вносит изменения в базу данных. В этот момент, во избежание потери или порчи данных, следует запретить внесение изменений другими пользователями.

Информация о работе Программирование баз данных в Delphi