Смекни!
smekni.com

Модуль данных (стр. 2 из 4)

Для этого необходимо создать новое поле, указав тип – Lookup. В поле KeyFieldsуказывается поле связи из исходной таблицы, в Dataset – выбрать таблицу, из которой будут взяты данные, в LookupKeys – ключевое поле, по которому устанавливается связь между таблицами, в ResultField– результирующее поле, значения которого будут отображаться в создаваемом.

Задание

1. Создать объекты-поля для всех таблиц.

2. Создать необходимые подстановочные, вычисляемые поля и поля с произвольными данными.

Лабораторная работа № 4 (1 час)

Тема: «Создание объектов-столбцов. Поля»

Цель работы:

1. создать объекты-столбцы.

2. изучить свойства объектов-полей.

Теоретические сведения

1. Создание объектов-столбцов

Объекты-столбцы - специальные компоненты, облегчающие управление отображением данных. С их помощью можно изменять шрифт и цвет колонок, формировать их заголовки и т. д. Для создания объектов-столбцов нужно вызвать редактор столбцов (дважды щелкните мышью на сетке DBGrid).

Чтобы создать объект-столбец, нужно щелкнуть на кнопку Add New редактора столбцов или нажать клавишу Ins. Выделив (щелчком) появившийся в окне компонент ТColumn, мы с помощью инспектора объектов можем менять его свойства.

Раскройте список свойства FieldName и выберите поле, которое необходимо видеть в сетке DBGrid. Раскройте список вложенных свойств сложного свойства Title и в его вложенное свойство Caption введите заголовок столбца.

2. Проверка правильности введенного в поле значения

Для контроля за правильностью вводимых в поле значений можно использовать события OnValidate или OnSetText объекта-поля. Оба события наступают после изменения значения поля, но до его запоминания в таблице.

В обработчике OnValidate в случае обнаружения неверного значения программа должна предотвратить его запоминание, создав исключительную ситуацию или обратившись к глобальной процедуре Abort. Например, поле EXPLOITATION содержит данные по сроке эксплуатации самолета и, естественно, не может иметь отрицательных значений. Для контроля над этим можно написать такой обработчик:

procedure TDM.AirplainsEXPLOITATIONValidate(Sender: TField);

begin

if dm.AirplainsEXPLOITATION.Value < 0 then

begin

ShowMessage('Значение не может быть отрицательным!');

Abort

end

end;

Следует учесть, что, отказавшись от запоминания неверного значения в таблице, программа, тем не менее, оставляет НД в состоянии редактирования. Это означает, что пользователь не может покинуть это поле до тех пор, пока не введет в него правильное значение. Если бы мы решили защитить поле от любого изменения с помощью показанного ниже обработчика, то обнаружили бы, что при попытке изменить значение поля программа попросту «зацикливается», не давая пользователю покинуть редактируемое поле:

procedure TDM.AirplainsEXPLOITATIONValidate(Sender: TField);

begin

ShowMessage('Значение не должно изменяться!');

Abort

end;

В данном случае использовать событие OnSetText значительно разумнее, так как в нем можно просто игнорировать неверные значения и не создавать исключительную ситуацию. Дело в том, что в этом обработчике программа должна присвоить полю новое значение или оставить поле без изменения:

procedure TDM.AirplainsEXPLOITATIONSetText(Sender: TField; const Text: String);

begin

if StrToInt (Text)<0 then

ShowMessage ('Значение не может быть отрицательным!');

else

dm.AirplainsCHISLO_ECONOM1.Value:=StrToInt(Text);

end;

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

Задание

1. Создать объекты-столбцы для таблиц из лабораторной работы 2.

2. Осуществить проверку правильности вводимых в поле значений.

3. Самостоятельно изучить Свойства, Методы.


Лабораторная работа № 5 (3 часа)

Тема: «Навигация. Фильтрация записей. Сортировка. Поиск записей в НД»

Цели работы:

1. изучить способы навигации по наборам данных.

2. сортировка данных.

3. фильтрация записей в НД: свойство Filter.

4. рассмотреть принципы работы методов Locateи Lookup.

Теоретические сведения

1. Сортировка записей

Сортировка записей в таблице осуществляется с помощью индексов. Если необходимо отсортировать данные не по индексу, то во время программы можно подключить вторичный индекс, что позволит показывать записи в различном порядке в зависимости от действий пользователя.

Подключение к таблице вторичного индекса осуществляется присвоением нового значения свойству IndexName. Для клиент-серверных СУБД вместо свойства IndexName обычно используется свойство IndexFieldNames, позволяющее указывать список названий полей, описывающих индекс, через «;».

Свойства IndexName и IndexFieldNames не допускают совместного использования. При внесении значения в одно из этих свойств другое свойство автоматически очищается.

Пример. Отсортировать таблицу Member_crews по ФИО.

Для этого можно воспользоваться контекстным меню, для пункта меню «ФИО» которого можно написать следующий обработчик:

procedure TForm31.N1Click (Sender: TObject);

begin

dm.Member_crews.IndexFieldNames := 'FIO_MEMBER';

end;

2. Навигация по НД

Под курсором набора данных понимается указатель текущей записи в конкретном НД. Текущая запись – это та запись, над которой в данный момент времени можно выполнять какие либо операции (удаление, изменение, чтение значений, содержащихся в полях записи).

С помощью методов First, Last, Next, Prior, MoveBy, FindFast, FindLast, FindNext, FindPrior можно изменять положение курсора и, следовательно, выбирать нужную запись.

Для выполнения действий по последовательному перебору записей, начиная от некоторой стартовой записи и до конца НД, используют цикл while…do или repeat…until.

Например, в случае перемещения в НД от начала к концу можно написать следующий код:

with Table1 do

begin

First;

while not EOF do

begin

{какие-либо действия над очередной записью}

Next;

end;

end;

Если использовать repeat…until то:

with Table1 do

begin

First;

repeat

{какие-либо действия над очередной записью}

until not FindNext;

end;

Пример. Вывести названия должностей в алфавитном порядке.

Добавьте на форму компонент ComboBox, в котором будут отображаться данные (названия должностей) из таблицы Post. Для этого необходимо написать следующий обработчик:

procedure TForm31.FormCreate(Sender: TObject);

begin

with dm.Post do

begin

First;

while not EOF do

begin

ComboBox1.Items.Add(dm.PostPost_name.Value);

Next;

end;

end;

ComboBox1.Sorted:= true;

end;

Результат выполнения процедуры:

3. Свойство Filter

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

Чтобы разрешить фильтрацию значений, надо свойство набора данных Filtered установит равным True.

Пример. Отфильтровать сведения о членах экипажа по должности.

Для этого можно написать следующий обработчик:

procedure TForm31.ComboBox1Select(Sender: TObject);

var x, y:string;

begin

with dm.Post do

begin

DM.Post.First;

x:=combobox1.Text;

while not(EOF) do

begin

if (dm.PostPost_name.Value=x)

then

y:=IntToStr(dm.PostPost_id.Value);

DM.Post.Next;

end;

end;

dm.Member_crews.Filter := 'Post_id = '+QuotedStr(y)+'';

dm.Member_crews.Filtered := true;

end;

Результат выполнения процедуры:

4. Поиск записей в НД

Метод Locate ищет первую запись, удовлетворяющую критерию поиска, и если такая запись найдена, делает ее текущей. В этом случае в качестве результата возвращается значение True. Если запись не найдена, возвращается значение False и курсор не меняет своего положения.

function Locate (const KeyFields: String;

const KeyValues: Variant;

Options: TLocaleOptions):Boolean

Список KeyFields указывает поле или несколько полей, по которым ведется поиск. В случае нескольких поисковых полей их названия разделяются точкой с запятой.

Критерии поиска задаются в вариантном массиве KeyValues так, что i-e значение в KeyValues ставиться в соответствие i-му полю в KeyFields.

Параметр Options указывает, необязательные значения режимов поиска.

- IoCaseInsensitivite – поиск ведется без учета возможной разницы регистра букв в текстовых полях и в критерии поиска.

- IoPartialKey – запись считается удовлетворяющей условию поиска, если она содержит часть поискового контекста; например, удовлетворяющим контексту "Диа" будут признаны записи со значениями в поле поиска "Диалект", "Диалог-МИФИ", "ДиаСофт" и т.д.

Метод Locate производит поиск по любому полю независимо от того входит оно в состав какого-либо индекса или нет. Если поле (поля) поиска входят в какой-либо индекс, Locate автоматически использует его, что существенно увеличивает скорость поиска.

Пример. Добавьте на форму своего проекта компонент Edit. Добавьте этому компоненту обработчик события OnChange и в нем напишите следующее:

procedure TForm2.Edit2Change (Sender: TObject);

begin

if dm.Airplains.Locate ('MODEL', Edit2.Text, []) then DBGrid1.SetFocus;

end;

Теперь при воде в компонент нужной модели самолета программа отыщет в наборе Airplains первую запись с названием такой модели.

Метод Lookup находит запись, удовлетворяющую условию поиска, но не делает ее текущей, а возвращает значения некоторых ее полей. Независимо от результата поиска записи указатель текущей записи в НД не изменяется. В отличие от метода Locate метод Lookup осуществляет поиск только на точное соответствие критерию поиска значения поля поиска записи.