русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Тема. Поиск записей.


Дата добавления: 2013-12-23; просмотров: 964; Нарушение авторских прав


MasterFields: String;- поле или поля из главной таблицы, которые служат для связи с соответствующими полями данной подчиненной таблицы. Поля в списке отделяются точкой с запятой. Двойным щелчком мышью в поле значения свойства MasterFields откроется диалоговое окно Field Link Designer. В этом окне нужно указать какое поле подчиненной (Detail) таблицы будет связано с полем главной (Master) таблицы. Указанное поле станет значением свойства MasterFields.

Связанные таблицы.

SetRange(const StartValues, EndValues: array of const) –устанавливает начальное и конечное значение ранга доступных записей. Параметр StartValues указывает значение поля, даваемое первой записи в ранге, параметр EndValues –последней записи в ранге. Выполняется назначение ранга набору данных. Отменяется такая фильтрация методом CancelRange.

Метод

CancelRange – отменяет фильтрацию по диапазону, установленную методом ApplyRange.

P

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

значение>нижняя_граница AND значение<верхняя_граница

Фильтрация по диапазону ведется индексно-последовательным методом и применяется для индексированных полей. Индекс поля должен быть установлен текущим с помощью свойств IndexName или IndexFieldNames. Если текущий индекс не установлен, то по умолчанию используется главный индекс. Для реализации фильтрации по диапазону используются следующие свойства и методы набора данных Table.

Методы:

SetRangeStart – устанавливает нижнюю границу диапазона.

SetRangeEnd –устанавливает верхнюю границу диапазона.

ApplyRange –устанавливает фильтр, который ограничивает диапазон записей для просмотра с использованием индексированного поля.



Например,

// формирование списка записей, количество которых – двузначное число.

procedure TForm1.BtnFilterClick(Sender: TObject);

begin

TbTovar.IndexFieldNames:='Kol_vo';

TbTovar.SetRangeStart;

TbTovar.Fields[2].AsInteger:=10; // поле Kol_vo

TbTovar.SetRangeEnd;

TbTovar.Fields[2].AsInteger:=99;

TbTovar.ApplyRange;

end;

Например,

// отмена фильтрации по диапазону

procedure TForm1.BtnAllRecordClick(Sender: TObject);

begin

TbTovar.CancelRange;

end;

p

Свойство:

KeyExclusive: Boolean –определяет как учитывается заданное граничное значение: если =true – записи, значения которых совпадают с границами диапазона не включаются в набор данных, если = false – то включаются. Свойство действует отдельно для верхней и нижней границ.

Например,

// установка верхней границы

TbTovar.IndexFieldNames:='Cena';

TbTovar.SetRangeEnd;

TbTovar.KeyExclusive: = true;

TbTovar.FieldByName (‘Cena’).AsFloat:=200;

p

 

Если одна из границ диапазона фильтрации не задана, то диапазон считается открытым.

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

 

Например,

procedure TForm1.BtnFilterClick(Sender: TObject);

begin

TbTovar.IndexFieldNames:='Tovar;Cena';

TbTovar.SetRange(['тетрадь',10],['тетрадь',100]);

end;

p

 

Для фильтрации по частичному совпадению значений символьных полей задаются начальные символы строки как нижняя граница, а как верхняя граница задается та же строка, дополненная символами ‘яяя’.

Например,

TbTovar.SetRange([‘т’], [‘т’+’яяя’]); p

 

Фильтрация по событию OnFilteredRecord ??!!

Пример.

// фильтрация по ограничениям для значений двух полей

procedure TForm1.Button2Click(Sender: TObject);

begin

TbTovar.IndexFieldNames:='T_Nazv';

TbTovar.SetRangeStart;

TbTovarT_Nazv.AsString:=Edit1.Text;

TbTovar.SetRangeEnd;

TbTovarT_Nazv.AsString:=Edit3.Text;

TbTovar.ApplyRange;

TbTovar.IndexFieldNames:='T_Cena';

TbTovar.SetRangeStart;

TbTovarT_Cena.AsFloat:=strtofloat(Edit2.Text);

TbTovar.SetRangeEnd;

TbTovarT_Cena.AsFloat:=strtofloat(Edit4.Text);

TbTovar.ApplyRange;

end;

Пример-2. Фильтрация по диапазону по нескольким полям, одно из полей типа PickList.

 

procedure TForm1.FormCreate(Sender: TObject);

var i:integer;

begin

TbTovar.FilterOptions:=[foCaseInsensitive];

TbTovar.Filtered:=False;

// формирование списка ComboBox значений PickLista из поля Prim

for i:=0 to DBGTovar.Columns[4].PickList.Count-1 do

CmbPrim.Items.Add(DBGTovar.Columns[4].PickList.Strings[i]);

CmbPrim.Text:=CmbPrim.Items[0];

end;

 

procedure TForm1.BtnFilterClick(Sender: TObject);

begin

with TbTovar do

if (CmbPrim.Text<>'') and (EdMin_Tovar.Text<>'') and (EdMax_Tovar.Text<>'') then begin

IndexName:='ind_PrimTovar';

SetRangeStart; KeyExclusive:=False;

FieldByName('T_Prim').AsString:=CmbPrim.Text;

FieldByName('T_Nazv').AsString:=EdMin_Tovar.Text;

SetRangeEnd; KeyExclusive:=False;

FieldByName('T_Prim').AsString:=CmbPrim.Text;

FieldByName('T_Nazv').AsString:=EdMax_Tovar.Text;

ApplyRange

end

else ShowMessage('Заполните все поля фильтрации!');

end;

 

procedure TForm1.BtnAllClick(Sender: TObject);

begin

TbTovar.CancelRange;

end;

 

Пример-3. Фильтрация по полю подстановки для БД Pokupka.

 

procedure TForm1.FormCreate(Sender: TObject);

begin

// сортировка по наименованию товара

DM2.TbTovar.IndexName:='ind_tovar';

// формирование списка наименований товаров из таблицы Tovar

ComboBox1.Items.Clear;

DM2.TbTovar.First;

while not DM2.TbTovar.Eof do begin

ComboBox1.Items.Append(DM2.TbTovarT_Nazv.AsString);

DM2.TbTovar.Next;

end;

ComboBox1.Text:=ComboBox1.Items[0];

end;

 

procedure TForm1.BtnFilterClick(Sender: TObject);

var cod:integer;

s : string;

begin

if ComboBox1.Text<>'' then begin

s:=ComboBox1.Text; DM2.TbTovar.First;

while not DM2.TbTovar.Eof do begin

if DM2.TbTovarT_Nazv.AsString=s then

cod:=DM2.TbTovarT_Code.AsInteger;

DM2.TbTovar.Next;

end;

DM2.TbPokupka.IndexFieldNames:='P_Tovar';

DM2.TbPokupka.SetRange([cod],[cod]);

end

else ShowMessage('Выберите наименование товара!');

end;

 

procedure TForm1.BtnAllClick(Sender: TObject);

begin

DM2.TbPokupka.CancelRange;

DM2.TbPokupka.First;

end;

 

procedure TDM2.TbTovarAfterPost(DataSet: TDataSet);

begin

// сортировка по наименованию товара

DM2.TbTovar.IndexName:='ind_tovar';

// формирование списка наименований товаров из таблицы Tovar

Form1.ComboBox1.Items.Clear;

DM2.TbTovar.First;

while not DM2.TbTovar.Eof do begin

Form1.ComboBox1.Items.Add(DM2.TbTovarT_Nazv.AsString);

DM2.TbTovar.Next;

end;

Form1.ComboBox1.Text:=Form1.ComboBox1.Items[0];

end;

 

procedure TDM2.TbTovarAfterDelete(DataSet: TDataSet);

begin

TbTovarAfterPost(DataSet);

end;

 

p

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

Таблицы связываются по принципу "главный-подчиненный" (один-ко-многим, один-к-одному, многие-ко-многим). При перемещении по записям главной таблицы будут автоматически доступны те записи подчиненных таблиц, у которых значения поля связи равно значению поля связи текущей записи главной таблицы. Такой отбор записей подчиненной таблицы подобен фильтрации.

Для установления связи между главной (Master) и подчиненной (Detail) таблицами используются следующие Свойства подчиненной таблицы (набор данных Table):

MasterSource: TDataSource;- имя компонента источника данных главной (родительской) таблицы для установления отношения между таблицами типа главная-подчиненная (родительская-дочерняя). Набор данных, который ассоциируется с указываемым источником данных, становится главной таблицей, а текущая таблица – подчиненной.

IndexName: String; -текущий индекс подчиненной таблицы.

IndexFieldNames: String; - поле или поля связи текущего индекса подчиненной таблицы.

где:

Available Indexes – список индексов подчиненной таблицы,

Detail Fields – поля, входящие в выбранный индекс подчиненной таблицы,

Master Fields – поля главной таблицы,

Joined Fields – связь между полями двух таблиц.

 

При работе со связанными таблицами необходимо учитывать следующее:

1) при изменении (редактировании) поля связи записи главной таблицы нужно соответственно изменять значения поля связи всех подчиненных записей.

2) При удалении записи главной таблицы нужно удалять и соответствующие ей записи в подчиненной таблице (каскадное удаление).

3) При добавлении записи в подчиненную таблицу значение поля связи формируется автоматически по значению поля связи главной таблицы.

Пример. Работа со связанными таблицами Tovar и Prodaga.

(Листинг программы).

Между таблицами устанавливается связь "главный-подчиненный". Таблица Tovar – главная, таблица Prodaga – подчиненная. Для связи используются поля: T_Code (в главной таблице), P_Code (в подчиненной).

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

Модификация данных таблиц с помощью компонентов DBGrid запрещена. Добавление и удаление записей главной таблицы выполняется с помощью кнопок Добавить и Удалить.

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

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



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

Скорость поиска повышается за счет индексирования.

Методика SetKey. Поиск выполняется по индексированному полю.

Методы:

SetKey –обнуляется буфер значений, используемый для поиска, набор данных переводится в режим dsSetKey. В этом состоянии набор данных воспринимает последующий оператор присваивания значения полю не как присваивание, а как задание ключа поиска.

Функция GotoKey:Boolean; -перемещает курсор на запись, указанную для текущего ключа, и при успешном поиске возвращает значение True.

Например,

// поиск первой записи, соответствующей заданному в LETovar

// названию товара

TbTovar.IndexFieldNames:='T_Nazv';

TbTovar.SetKey;

TbTovar.FieldByName('T_Nazv').AsString:=LETovar.Text;

TbTovar.GotoKey;

GotoNearest– переводит курсор на наиболее похожую (совпадающую по первым символам) запись набора данных.

Например,

TbTovar.IndexFieldNames:='Tovar';

TbTovar.SetKey;

TbTovar.FieldByName('T_Nazv').AsString:=LETovar.Text;

TbTovar.GotoNearest;

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

функция FindKey(const KeyValues: array of const): Boolean; - обеспечивается переход к записи, удовлетворяющей заданным значениям. Параметр KeyValues –массив значений ключевых полей в той последовательности, в которой они входят в индекс. Возвращает True,если поиск успешный.

Например,

TbTovar.IndexFieldNames:='T_Nazv;T_Cena';

if not TbTovar.FindKey([LETovar.Text,'50'])

then MessageDlg(‘Запись не найдена!',mtError,[mbOk],0);

FindNearest(const KeyValues: array of const); - перемещает курсор на запись, наиболее близкую к указанному значению ключевого поля (индекса). Массив-параметр должен содержать столько значений, сколько полей определено в составном индексе. В противном случае для недостающих полей будет передано значение NULL.

Например,

TbTovar.IndexFieldNames:='Т_Nazv;T_Cena';

TbTovar.FindNearest(['т','50']);

Например,

// поиск нужной записи по первым задаваемым символам

procedure TForm1.LE_tovarChange(Sender: TObject);

begin

TbTovar.FindNearest([LE_tovar.text]);

end;

Метод Locate. Допускает выполнение поиска по неиндексированным полям. Индексирование ускоряет поиск.

функция Locate(const KeyFields: String; const KeyValues:
Variant: Options: TLocateOptions): Boolean;
- выполняет для указанных полей KeyFields поиск первой записи, содержащей значения KeyValues,и при успешном завершении делает эту запись текущей. Параметр Options задает параметры поиска.

loCaseInsensitive – регистр букв не учитывается;

loPartialKey – допускается частичное совпадение значений.

Например,

1) TbTovar.Locate(‘T_Cena’,20,[]);

// ищется первая запись с ценой 20;

2) TbTovar.Locate('T_Prim',LETovar.Text,[loCaseInsensitive, loPartialKey]);

p

функция VarArrayOf(const Values: array of Variant): Variant; -формирует тип Variant из задаваемого массива параметров любого типа. Используется при поиске по нескольким полям.

Например,

TbTovar.Locate('T_Nazv;T_Cena',VarArrayOf([LETovar.Text,
LECena.Text]),[loCaseInsensitive,loPartialKey]);



<== предыдущая лекция | следующая лекция ==>
Тема. Фильтрация записей. | Навигация с псевдофильтрацией.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.008 сек.