- •Компонент tClientDataSet – основной компонент синтеза эд
- •Получение данных от компонента - провайдера
- •Кэширование и редактирование данных
- •Управление запросом на сервере
- •Использование индексов
- •Сохранение набора данных в файлах
- •Работа с данными типа blob
- •Объекты-агрегаты
- •Агрегатные поля
- •Группировка и использование индексов
- •Вложенные наборы данных
Сохранение набора данных в файлах
Клиентское приложение может использовать одну очень удобную функцию компонента TClientDataSet. Представим, что соединение между сервером и клиентом обладает малой пропускной способностью и к тому же часто обрывается. Что в этом случае делать пользователю, который внес много изменений и не может сохранить их на сервере? В этом случае можно сохранить набор данных клиента в файле на локальном диске, а при удобной возможности — загрузить обратно и переслать на сервер.
Для сохранения данных в файле используется метод SaveToFile(const FileName: string = ''; Format: TDataPacketFormat=dfBinary), причем, если параметр FileName пуст, имя файла берется из свойства FileName.
Также можно передать данные в поток SaveToStream(Stream: TStream; Format: TDataPacketFormat=dfBinary);
Формат, в котором данные будут сохранены, определяется параметром Format.
type TDataPacketFormat = (dfBinary, dfXML, dfXMLUTFS);
где dfBinary — бинарный вид, dfXML — формат XML, dfXMLUTFS — формат XML в кодировке UTF8.
Обратная загрузка данных, соответственно, выполняется методами:
LoadFromFile(const FileName: string = '') и procedure LoadFromStreamfStream: TStream).
После загрузки набор данных полностью готов к работе:
if OpenDialog.Execute then
begin
ClientDataSet.LoadFromFile (LoadFileDialog.FileName);
ClientDataSet.Open;
end;
Работа с данными типа blob
Если набор данных сервера содержит большие поля (например, изображения), передача данных по медленному каналу займет очень много времени, что, несомненно, снизит эффективность приложения. Простейшее решение проблемы — передача клиенту данных типа BLOB только в том случае, когда это ему действительно необходимо — т. е. исключительно по его запросу.
В компоненте TClentDataSet процессом передачи полей типа BLOB можно управлять, используя свойство FetchOnDemand. По умолчанию оно равно значению True и клиентский набор данных "выкачивает" данные BLOB по мере необходимости автоматически. Это означает, что приложение будет останавливаться и заново получать данные при любом просмотре данных, прокрутке и т. д. Если свойство имеет значение False, для получения данных клиент должен явно вызвать метод FetchBlobs;
Но, кроме этого, в свойстве options компонента-провайдера TDataSetProvider обязательно должно быть установлено значение: poFetchBlobsOnDemand := True;
Представление данных в формате XML
Набор данных клиента легко можно представить в формате XML. Для этого достаточно использовать свойство XMLData, которое возвращает данные, содержащиеся в буфере Data в бинарном виде, в формате XML. Например, клиентский набор данных можно сохранить в файле формата XML:
if SaveDialog.Execute then
with TFileStream.Create(SaveDialog.FileName, fmCreate) do
try
Write(Pointer(ClientDataSet.XMLData)^, Length(ClientDataSet.XMLData));
finally
Free ;
end;
Агрегаты
Наличие локального буфера данных позволяет компоненту TClientDataSet реализовать ряд дополнительных функций, основанных на использовании агрегатных функций применительно к полям всего набора данных, загруженного в локальный буфер.
К агрегатным функциям относятся:
AVG — вычисляет среднее значение;
COUNT — возвращает число записей;
MIN — вычисляет минимальное значение;
МАХ — вычисляет максимальное значение;
SUM — вычисляет сумму.
Для применения агрегатных функций в компоненте TClientDataSet предусмотрены:
индексированный список объектов, инкапсулирующих агрегатные выражения — агрегаты;
агрегатные поля, обеспечивающие получение новых значений подобно вычисляемым полям, но с группированием записей на основе использования агрегатных функций.
