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 –устанавливает фильтр, который ограничивает диапазон записей для просмотра с использованием индексированного поля.
Например,
// формирование списка записей, количество которых – двузначное число.
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
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
Методика 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 задает параметры поиска.
функцияVarArrayOf(const Values: array of Variant): Variant; -формирует тип Variant из задаваемого массива параметров любого типа. Используется при поиске по нескольким полям.