Сайт Koder.kz сайт для Delphi программистов.

koder.kz

Web or desctop App Developer

Написать

Добавил admin | Категория Наши материалы | 18 Апреля 2014


Введение в технологию MemTable + DataDriver.

Данная технология предназначена для обеспечения унифицированного способа загрузки табличной информации с сервера на клиент и последующей обработки этих данных на клиенте: редактирования, сортировки, фильтрации и выгрузки измененных данных обратно на сервер. Технология не включает драйверов доступа к серверу.
Технология представлена двумя основными компонента:
TMemTableEh – dataset, который держит все данные в памяти. Его можно рассматривать как массив записей. Кроме того, он:
Поддерживает специальный интерфейс, позволяющий компоненту DBGridEh просматривать все данные, не перемещая активную запись.
Позволяет закачивать в себя данные из объекта TDataDriverEh (свойство DataDriver).
Позволяет выгружать изменения обратно в DataDriver, оперативно или отложено (в зависимости то свойства CachedUpdates).
Позволяет создавать мастер/дитэил отношения на клиенте (фильтруя записи) или на внешнем источнике (обновляя параметры [Params] и перезапрашивая данные c DetailDataDriver'а).
Позволяет сортировать данные, включая Calculated и Lookup поля.
Позволяет создавать и заполнять данные в design-time и сохранять данные в dfm файле формы.
Позволяет хранить записи в виде дерева. Каждая запись может иметь записи узлы/ветви и сама являться узлом другой родительской записи.
Компонент TDBGridEh поддерживает функциональность отображения древовидной структуры этих записей.
Позволяет подключиться к внутреннему массиву другого компонента TMemTableEh (свойство ExternalMemData) и работать с его данными:
сортировать, фильтровать, редактировать.
Имеет интерфейс для получения списка всех значений столбца, игнорируя локальный фильтр датасета. TDBGridEh использует это свойство для автоматического формирования списка в выпадающем DropDownBox’е фильтра.
TDataDriverEh – выполняет две задачи:
1. Поставляет данные (записи) в TMemTableEh.
2. Обрабатывает записи, измененные в TMemTableEh (записывает их в другой датасет, или вызывает события для обработки изменений в программе).
Кроме того, имеется несколько компонент наследуемых от TDataDriverEh. Это TSQLDataDriverEh, который содержит в себе пять SQL выражения и параметры для запроса данных, удаления записи, вставки записи, изменения записи, перезапроса записи. TSQLDataDriverEh посылает запросы не сервер, но умеет подготавливать параметры запроса и вызывает глобальное событие, в котором программист может передать SQL выражение на сервер. От TSQLDataDriverEh порождены несколько компонентов, которые сами могут посылать SQL выражения на сервер через соответствующие драйвера доступа к данным. Это TBDEDataDriverEh, TIBXDataDriverEh, TDBXDataDriverEh и TADODataDriverEh.

Компонент TMemTableEh.
Два режима работы компонента TMemTableEh.

Существует два режима работы компоненты TMemTableEh: ‘stand-alone’ и ‘with datadriver’.
‘stand-alone’ режим.
В режиме ‘stand-alone’ TMemTableEh работает как ни с чем несвязанный массив данных. Прежде чем работать с данными ‘stand-alone’ TMemTableEh’а необходимо создать внутренний массив данных. Для этого надо создать внешние поля (Fields) или field definitions в TMemTableEh и вызвать функцию CreateDataSet.
‘with datadriver’ режим.
Режим ‘with datadriver’ работает, когда присвоено свойство TMemTableEh.DataDriver. Внутренний массив данных создается автоматически при активизации MemTableEh’а. Структура полей предоставляется компонентом DataDriver.

ViewScroll

TMemTableEh поддерживает специальный интерфейс, позволяющий компоненту DBGridEh просматривать все данные, не перемещая активную запись. В дельнейшем будем называть такой режим работы ViewScroll.

Мастер/дитэил отношения.

Мастер/дитэил отношение – это режим работы двух датасетов при котором все видимые записи одного датасета (DetailDataSet) всегда соответствуют одной записи другого датасета (MasterDataSet). При движении по MasterDataSet’у DetailDataSet пересоздает или фильтрует записи так, чтобы они соответствовали записи MasterDataSet’а. Соответствия выставляются с помощью свойств MasterFields и KeyFields. DetailDataSet всегда выводит только те записи, у которых значения поля (полей) KeyFields равно значению поля (полей), заданное свойством MasterFields в мастер записи. TMemTableEh позволяет создавать мастер/дитэил отношения на клиенте “mdsOnSelfEh” (фильтруя записи) или на провайдере “mdsOnProviderEh” (пересоздавая записи). Для установки TMemTableEh в режим дитэил, используются следующие свойства: MasterSource, MasterFields, KeyFields, MasterDetailSide. Когда MasterDetailSide установлен в mdsOnSelfEh, TMemTableEh будет фильтровать записи по полям DetailFields основываясь на значении полей MasterSource[MasterFields]. Когда MasterDetailSide установлен в mdsOnProviderEh, TMemTableEh будет переоткрывать себя, присвоив параметры значениями полей из MasterSource[MasterFields]. При открытии TMemTableEh передает свои параметры DataDriver'у. В режиме mdsOnProviderEh свойства DetailFields не используются.
Третий режим работы - “mdsOnSelfAfterProviderEh” является комбинацией двух предыдущих. При первом переходе на запись в MasterDataSet’е DetailDataSet запрашивает записи у DataDriver'а, передавая ему параметры со значениями, присвоенными из MasterSource[MasterFields] и добавляет полученные данные в свой внутренний массив записей. При повторном переходе на ту же запись в MasterDataSet’е DetailDataSet будет всегда только фильтровать свои записи.

Режим хранения записей в виде дерева (TreeView).

В режиме дерева TMemTableEh создает объекты-узлы (типа TMemRecViewEh) для каждой записи внутреннего массива записей. Объект-узел имеет ссылку на запись (свойство Rec) и ссылку на список подузлов (NodeItems). Настройка и активизация режима TreeView осуществляется с помощью подсвойств объекта TMemTableEh.TreeList. TMemTableEh автоматически добавляет новые записи в дерево, используя свойства TreeList.KeyFieldName и TreeList.RefParentFieldName. При появлении новой записи, MemTable пытается найти для нее Parent запись, осуществляя поиск записей, у которых значение поля KeyFieldName равно значению поля RefParentFieldName новой записи. Кроме того, он проверяет, не является ли новая запись Parent записью для уже существующих записей. Формирование дерева записей значительно ускоряется, если создать индексы по полям указанным в TreeList.KeyFieldName и TreeList.RefParentFieldName. Однако максимальной скорости формирования дерева можно добиться когда поток новых записей поступает в правильной последовательности, т.е. вначале должна идти Parent запись, а затем ее Chield записи, причем если у Chield записи есть SubChield записи то они должны идти сразу после Chield. При этом индексы создавать не рекомендуется, они могут только замедлить создание дерева. Другими словами данные должны идти в той последовательности, в какой они будут отображаться в дереве. При такой последовательности поступления записей рекомендуется также отключить свойство FullBuildCheck.

Свойства объекта TMemTableEh.TreeList:

Active: Boolean
Определяет, что режим TreeView включен. В режиме TreeView вы можете обращаться к свойствам TMemTableEh: TreeNodeLevel, TreeNodeExpanded, TreeNodeHasChildren, TreeNodeChildCount.
KeyFieldName: String
Содержит название ключевого поля записи. Дочерние записи будут ссылаться на родительскую запись с ключом определенным полем KeyFieldName.
RefParentFieldName: String
Содержит название поля содержащего ссылку на родительскую запись.
DefaultNodeExpanded: Boolean
Определяет значение свойства Expanded для новых узлов дерева.
DefaultNodeHasChildren: Boolean
Определяет значение свойства HasChildren для новых узлов дерева.
FullBuildCheck: Boolean
Определяет необходимость делать проверку на наличие существующих Child записей при изменении записи или добавлении новой записи. Выставление этого свойства в False может ускорить формирование дерева, но при заполнения DataSet’а все Child записи должны идти после Parent записи.

Для доступа к состоянию узла дерева текущей записи Dataset’а, можно использовать следующие свойства TMemTableEh:
RecView: TMemRecViewEh – ссылка на объект-узел дерева, доступна только в режиме дерева.


TreeNodeLevel: Integer – уровень узла в дереве.
TreeNodeExpanded: Boolean – узла в дереве раскрыт.
TreeNodeHasChildren: Boolean – узел имеет Child узлы.
TreeNodeChildCount: Integer – количество Child узлов.

Работа с полями типа AutoIncrement

TMemTableEh имеет объект AutoIncrement со свойствами InitValue и Step для работы с полями у которых значения генерируется автоматической последовательностью чисел. У таких полей свойство TFIeld. AutoGenerateValue = arAutoInc. Значения для таких полей генерируются автоматически при заведении новой записи на основе внутреннего счетчика. Начальное значение счетчика задается свойством InitValue. После заведения новой записи значение счетчика увеличивается на число заданное свойством Step. При работе TMemTableEh с подключенным DataDriver’ом значение автоинкрементных полей обычно генерируется сервером. Чтобы TMemTableEh мог получать значения полей, генерируемых сервером, рекомендуется использовать TMemTableEh и TSQLDataDriver (или порожденный от него) в следующей конфигурации: Проставить значения свойств InitValue и Step в -1. Значения AutoIncrement полей до отправки новых записей на сервер будут иметь отрицательные значения. Прописать дополнительные параметры в свойстве TSQLDataDriver.SpecParams, чтобы SQLDataDriver мог получать значения AutoIncrement полей генерируемых сервером. При применении обновлений, до или после (в зависимости от типа сервера) добавления записи на сервере, SQLDataDriver запросит новое сгенерированное значение счетчика и присвоит его AutoIncrement полю на клиенте.

Использование индексов.

Индексы в TMemTableEh используются для ускорения операций поиска. Они в частности используются при формировании древовидной структуры записей, в процедуре Locate и в MasterDetail отношениях. Шаблон индексов задается в коллекции IndexDefs. TMemTableEh создает индексы на основе шаблона IndexDefs автоматически при создании внутреннего массива данных.

Использование общих данных несколькими датасетами.

TMemTableEh позволяет использовать общий табличный массив записей несколькими компонентами TMemTableEh. При этом один из компонентов TMemTableEh является владельцем массива, а другие подключаются к этому массиву посредствам свойства ExternalMemData типа TCustomMemTableEh. Внешние данные видны другому компоненту TMemTableEh без учета фильтра. Свойство DataDriver может быть присвоено только у MemTable’а владельца массива. Сортировка и фильтрация в каждом датасете не влияет друг на друга.

Перетаскивание записей в TMemTableEh при включенном режиме dghRecordMoving.

Включение значения dghRecordMoving в свойство OptionsEh компонента DBGridEh позволяет перетаскивать записи в компоненте TMemTableEh. Кроме того, при активном режиме TreeList, DBGridEh позволяет при перетаскивании менять уровень записи в дереве. Запись перемещается нажатием и перемещением мыши над колонной индикатора записей (при включенном режиме мультиселека записей вначале надо выбрать записи которые надо переместить).

Тип поля TRefObjectField.

Юнит MemTableEh содержит описание и код регистрации нового типа поля – TRefObjectField. TRefObjectField предназначен для хранения указателя на объекты типа TObject и содержит свойство Value типа TObject. При создании поля в период разработки вы можете выбрать его в окне добавления поля по имени ‘RefObjectField’. В программе вы можете создать поле этого типа через свойства объекта FieldDefs, задав в качестве типа поля тип ftUnknown.

Агрегированные поля.

MemTableEh поддерживает обработку агрегированных полей (поля типа TAggregateField). TAggregateField представляет агрегированную величину (такую как SUM, COUNT) в dataset’е. В режиме Design-time используйте Fields Editor, чтобы создать persistent агрегированное роле, которое вы можете привязать к компоненту TDBEditEh или к футеру в TDBGridEh.

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

Для сортировки данных в TMemTableEh используйте свойство SortOrder. Несколько полей разделяйте запятой. Для сортировки по убыванию, после названия поля добавляйте слово ‘DESC’. Сортировка происходит на уровне TRecordsViewEh, т. е. физически записи в массиве данных TRecordsListEh не перемещаются.

Создание/удаление таблиц в памяти в режиме ‘stand-alone’.

MemTableEh позволяет создавать внутренний массив записей в режиме Design-time и в режиме Run-time. Прежде, чем создавать массив, Вы должны задать свойства компонента, для определить структуру массива, который Вы создаете. В частности, Вы должны задать: Структуру поля нового массива. Существует два способа сделать это:
Вы можете добавить определения полей в свойстве FieldDefs. В режиме Design-time, двойной-щелчкок в инспекторе объектов на свойстве FieldDefs открывает окно редактора коллекии. Используйте редактор, чтобы добавить, удалить, или изменить свойства определения поля. В режиме Run-time, очистите все определения и используйте метод AddFieldDef, чтобы добавить новое определение поля. Для каждого нового определения поля, задайте свойства объекта TFieldDef чтобы установить желаемые атрибуты поля.
Кроме того вы можете использовать жеские (pesistent) поля. В режиме Design-time, двойной-щелчкок на dataset’е, открывает окно редактировани полей. В редакторе полей, нажмите правую кнопу мышки и выберите команду “New Field”. Впишите основные свойства вашего поля. После создания pesistent поля, Вы можете изменить свойства поля в Инспекторе обьектов выбрав требуемое поле в редакторе Полей.
Чтобы создавать внутренний массив в режиме Design-time, щелкните правой кнопкой мышки на dataset’е и выберите ‘Create DataSet’. Эта команда не появляется в контекстном меню пока Вы не определите всю необходимую информацию.
Чтобы создать внутренний массив режиме Run-time, вызовите метод CreateDataSet.
Если у компонента задано свойство DataDriver то внутренний массив создается автоматически при активизации MemTable’а.
Закрытие датасета режиме ‘stand-alone’ не уничтожает внутренний массив данных. Для закрытия с одновременным уничтожением всех данных и структуры массива используйте метод DestroyTable.
Для очисти всех записей внутреннего массива используйте метод EmptyTable. Структура массива и активность датасета не изменяются.

Работа с компонентом в режиме ‘with datadriver’.

Режим ‘with datadriver’ работает, когда присвоено свойство TMemTableEh.DataDriver. При активизации датасета внутренний массив данных создается автоматически при активизации MemTableEh’а. Структура полей предоставляется компонентом DataDriver. Если свойство FetchAllOnOpen установелно в True, то при открытии MemTableEh загружает все записи из DataDriver’а. При FetchAllOnOpen = False MemTableEh автоматически не загружает записи, это должна делать программа или другой компонент. Для загрузки записей необходимо выполнить метод FetchRecords. Метод принимает один параметр - количество записей, которые вы хотите догрузить. Чтобы загрузить все записи, передайте в качестве значения параметра -1. При отображении данных в компоненте TDBGridEh Grid вызывает FetchRecords через интерфейс IMemTableEh чтобы отобразить все видимые записи на экране. По мере движения по DBGridEh вниз, он повторно вызывает FetchRecords, передавая в качестве параметра нужное количество записей. В режиме ‘with datadriver’ все изменения передаются в метод ApplyUpdates компонента TDataDriver. Если свойство CachedUpdates = False то изменения передаются сразу после Post’а записи, если CachedUpdates = True то изменения передаются при вызове метода ApplyUpdates.

Отложенные обновления (CachedUpdates).

TMemTableEh может работать в режиме оперативных или отложенных обновлений. Режим обновления определяет, когда будет посылаться информация об измененных записях в компонент TDataDriverEh (при этом TSQLDataDriverEh и TXXXDataDriverEh сразу пошлют изменения на сервер). В режиме оперативного обновления TMemTableEh посылает информацию сразу после добавления записи или вызова метода Post. В режиме отложенного обновления TMemTableEh не посылает информацию об изменениях, а накапливает их в специальном буфере. Когда изменения закончены, приложение посылает кэшированные изменения в TDataDriverEh. Режим отложенного обновления устанавливается свойством CachedUpdates. Основные достоинства отложенных обновлений – это уменьшение количества транзакций, сокращение времени транзакции и минимизация сетевого трафика. В режиме отложенного обновления изменения сделанные в TMemTableEh не посылаются в TDataDriverEh пока приложение не назовет метод TMemTableEh.ApplyUpdates. ApplyUpdates принимает единственный параметр, MaxErrors, который задает максимальное число ошибок, которое TDataDriverEh должен допустить до отказа процесса изменений. Если MaxErrors - 0, то при первой же ошибке, весь процесс изменений будет отвергнут (Если изменения происходили внутри транзакции). Если MaxErrors = -1, то допустимо любое число ошибок. Записи, обновления которых произошли с ошибками имеют дополнительное свойство UpdateError типа TUpdateErrorEh . До посылки измененных записей в TDataDriverEh может быть полезным обеспечить отображение состояние изменений записей. Это особенно полезно, если Вы хотите позволить пользователю отменять определенные изменения или отображать тип изменения записи. Для отображения информации об изменениях можно использовать метод UpdateStatus и свойство StatusFilter:
UpdateStatus указывает тип изменения текущей записи. Оно может возвращать одно из следующего значений:


	usUnmodified 	Указывает, что текущая запись не изменялась.
	usModified 	Указывает, что текущая запись была отредактирована.
	usInserted 	Указывает, что запись была добавлена пользователем.
	usDeleted 	Указывает, что запись была удалена пользователем.

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


	usUnmodified 	Выводить неизмененные записи.
	usModified 	Выводить модифицированные записи.
	usInserted 	Выводить добавленные записи.
	usDeleted 	Выводить удаленные записи.

По умолчанию, StatusFilter имеет значение [usModified, usInserted, usUnmodified]. Вы можете добавить значение usDeleted чтобы увидеть удаленные записи. RevertRecord – восстанавливает старое состояние записи и значения полей. Если запись бы была добавлена в программе, то она удаляется из списка. Свойство UpdateStatus восстанавливается в значение usUnmodified. MergeChangeLog – удаляет журнал отложенных изменений. Все добавленные или измененные записи получают статус usUnmodified. CancelUpdates – отменяет все отложенные изменения и восстанавливает старое состояние записей.

Метки записей и переход на запись по метке.

Дополнительно к перемещению с записи на запись в dataset, также бывает полезно, получить маркер (Bookmark) конкретной позиции в dataset’е чтобы потом можно было быстро возвратиться на желаемую запись. TDataSet вводит возможность пометки записей, которая состоит из свойства Bookmark и пяти методов. Реально закладки в TMemTable являются номерами записей (RecNo) в DataSet’е.

Свойство Bookmark.

Свойство Bookmark указывает на текущую закладку на запись. Она указывает на текущую запись. Закладка является строкой, которая идентифицирует текущую закладку. Всякий раз, когда Вы присваиваете это свойство DataSet переходит на запись соответствующую закладке.

Метод GetBookmark

Я не рекомендую пользоваться этим метод, используйте вместо него свойство Bookmark. Детально об этом методе читайте в документации по VCL.

Методы GotoBookmark и BookmarkValid

При вызове GotoBookmark с параметром закладка метод перемещает курсор в dataset’е в позицию определенную закладкой. Перед вызовом GotoBookmark, Вы можете назвать BookmarkValid, чтобы определить действительно ли заклада указывает на одну из записей в DataSet'е. BookmarkValid возвращает True если закладка указывает на запись.

Метод CompareBookmarks

Вы можете вызвать CompareBookmarks, чтобы определить отличается ли закладка на которую Вы хотите перейти, от другого закладки. Если две закладки ссылаются на ту же запись (или если оба нуль), CompareBookmarks возврат 0.

Метод FreeBookmark

Используется в комбинации с GetBookamrk. Я не рекомендую пользоваться этим методом. Детально об этом методе читайте в документации по VCL.

Поиск в TMemTableEh

Вы можете осуществлять поиск в TMemTableEh используя следующие методы:
1. Locate
Метод locate перемещает курсор на первую строку, удовлетворяющую критерию поиска. В своей самой простой форме, Вы передаете имя поля, в котором искать, значение которое надо найти, и влаг определяющий нужно ли искать с без учета регистра букв или/и использовать сопоставление. (Частичное сопоставление, значит что строка поиска должна только префиксом значения искомого значения.) Например, следующей код перемещает курсор в первую колонку в CustTable где величина в поле Company, "Professional Divers, Ltd.":


var
  LocateSuccess: Boolean;
  SearchOptions: TLocateOptions;
begin
  SearchOptions := [loPartialKey];
  LocateSuccess := CustTable.Locate('Company', 'Professional Divers, Ltd.', SearchOptions);
end;

Если Locate находит совпадение, то первая запись, удовлетворяющая критерию поиска становится текущей записью. Locate возвращает True если он находит запись, False если это нет. Если поиск ничего не находит, текущая запись не изменяется.
Реальная мощность Locate начинает действовать, когда Вы хотите найти по нескольким полям и определяете множественные значения поиска. Величины Искомые значения являются переменной типа Variant, что означает что вы можете определить различные типы данных в своих критериях поиска. Для того, чтобы задать несколько полей по которым нужно искать, разделите каждое поле в строке точками с запятой.
Поскольку искомые значения являются набором значений типа Variant, Вы должны либо передать несколько значений как Variant array в качестве аргумента, либо Вы должны сконструировать выражение типа Variant array в коде, используя функцию VarArrayOf. Следующий код иллюстрирует поиск по нескольким столбцам используя список величин поиска и частичное совпадение:


with CustTable do
  Locate('Company;Contact;Phone', VarArrayOf(['Sight Diver','P']), loPartialKey);

Locate использует самый быстрый из возможных методов поиска. Если столбцы в поиске проиндексированы и индекс совместимый с опциями поиска Locate использует индекс.
2. Lookup
Lookup ищет первую запись, которая соответствует критериям определенного поиска. Если он находит запись то возвращает значение одного или набор полей заданных параметром ResultFields. Поиск не перемещает курсор на найденную запись, а только возвращает найденные значения.
В своей самой простой форме, Вы передаете Lookup имя поля, в котором надо искать, искомую величину, и поле или поля значение которых надо врзвраить из найденной записи. Например, следующий код ищет первую запись в CustTable где величина области Компании - "Профессиональные Ныряльщики, Ltd." и возвращает имя компании, контактный человек, и номер телефона для компании:


var
  LookupResults: Variant;
begin
  LookupResults := CustTable.Lookup('Company', 'Professional Divers, Ltd.', 'Company;Contact;Phone');
end;

Lookup возвращает значения заданных полей из первой найденной записи. Значения величин имеют тип Variant. Если задано несколько полей, Lookup возвращает массив Variant’ов. Если ни одной записи не находится, Lookup возвращает значение Null.
Подобно, Locate, Lookup использует самый быстрый из возможных методов поиска.
3. FindRec
Метод FindRec ищет первую запись, которая соответствует критериям поиска и возвращает номер первой найденной записи. Синтаксис вызова метода совпадает с синтаксисом метода Locate.
При работе MemTableEh в режиме дерева методы Locate и FindRec ищут записи только в узлах которые находятся в открытых (Expanded) ветках. Для поиска во всех узлах и автоматического раскрытия владельцев найденного узла используйте метод MemTableEh.TreeList.Locate.
4. GotoRec Метод GotoRec перемещает курсор в позицию запись которой указывает на запись заданную параметром Rec. GotoRec возвращает True если он находит запись, False если это нет.

Быстрый доступ к значениям записи.

Для доступа к значениям полей конкретной записи в стандартном DataSet’е необходимо вначале перейти на нужную запись. Это не всегда удобно т.к. переход на запись методами MoveBy, RecNo, Bookmark активизирует события об изменении записи, что может привести к большим задержкам и перерисовкам экрана. Для быстрого получения значения из конкретно записи без активизации события об изменении в MemTableEh можно использовать несколько способов. Использовать методы DisableControls, EnableControls для деактивизации событий об изменениях в DataSet’е. Недостаток этого способа в том что EnableControls вызывает событие об изменении датасета что приведет к перерисовке визуальных компонент подключенных к DataSet’у. Использовать методы InstantReadEnter, InstantReadLeave для перехода в режим InstantRead. InstantReadEnter входит в режим просмотра записей и переходит на запись в DataSet’е определенную параметром RowNum. После этого вы можете читать значения записи. Каждому вызову метода InstantReadEnter, должен соответствовать вызов InstantReadLeave – выход из режима чтения записей. В режиме InstantRead нельзя менять значения полей записи. Методы InstantReadEnter, InstantReadLeave не посылают события об изменении позиции записи внешним компонентам. Использовать свойства для доступа к внутренним объектам хранения данных. Внутренние объекты позволяют иметь доступ к значениям записей как к массиву данных по индексу. Кроме того вы можете обратится ко всем записям внутреннего массива данных без учета локального фильтра. Для доступа к внутренним структурам данных используйте следующие свойства объектам TMemTableEh:


RecordsView: TRecordsViewEh – ссылка на отфильтрованный список записей.
RecordsView.Rec[Index: Integer]: TMemoryRecordEh – доступ к конкретной записи в массиве отфильтрованных значений. 
RecordsView.Count: Integer – количество записей в отфильтрован списке. В режиме TreeView учитываются только раскрытые ветви.
RecordsView.MemTableData.RecordsList[Index: Integer]: TMemoryRecordEh – доступ к конкретной записи в массиве всех записей.
RecordsView.MemTableData.RecordsList.Count – количество записей в списке всех записей.
RecordsView.MemTableData.RecordsList[Index: Integer].DataValues[const FieldNames: string; DataValueVersion: TDataValueVersionEh]: Variant – доступ к значению поля(ей) в записи с номером Index.

Копирование данных и структуры из/в внешнего DataSet’а.

TMemTableEh предоставляет следующие методы для копирования данных из/в внешних DataSat’ов в себя:
Метод SaveToDataSet
Копирует свои данные в другой DataSet, указанный в параметре Dest. Если параметр RecordCount > 0, то копирование начинается с текущей записи исходного DataSet’а и копируется не более RecordCount записей. Иначе копируются все записи, начиная с первой. Копирование происходит добавлением новых записей в Dest DataSet.
Метод LoadFromDataSet
Загружает не более RecordCount записей из DataSet’а, указанного в параметре Source. Если RecordCount = -1 то загружаются все записи. Параметр Mode определяет режим загрузки. Значение lmCopy определяет, что перед загрузкой надо удалить все записи. Значение lmAppend определяет что новые записи будут добавлены к старым данным. Параметр UseIfCachedUpdates указывает, что вновь добавленные записи получат статус usInserted.

Внутренние объекты компонента TMemTableEh.

В большинстве случаев для работы с данными вам TMemTableEh вам будет достаточно свойств и методов самого компонента. Однако в некоторых случаях необходимо иметь возможность обработки данных на более низком уровне. Компонент TMemTableEh хранить записи в специально внутреннем массиве данных и имеет семь основных объектов для обработки внутренних данных: TMemTableDataEh – внутренняя таблица данных. Содержит в себе два объекта: TMTDataStructEh описывающий структуру полей таблицы и TRecordsListEh содержащий список записей типа TMemoryRecordEh. TMTDataStructEh – класс описывающий структуру полей внутренней таблицы. Содержит список объектов наследуемых от TMTDataFieldEh. TMTDataFieldEh – базовый класс для определения типа поля во внутренней таблице. Является парент-типом для классов TMTStringDataFieldEh, TMTNumericDataFieldEh, TMTDateTimeDataFieldEh, TMTBlobDataFieldEh, TMTBooleanDataFieldEh, TMTInterfaceDataFieldEh, TMTVariantDataFieldEh, TMTRefObjectFieldEh. TRecordsListEh – содержит список записей типа TMemoryRecordEh. TMemoryRecordEh – представляет одну запись в массиве записей. TRecordsViewEh – содержит отфильтрованный список записей. Содержит только записи удовлетворяющие условию TMemTableEh.Filter. TMemoryTreeListEh – содержит древовидный список с узлами типа TMemRecViewEh и ссылками на записи.
Доступ к внутренним объектам из TMemTableEh


RecordsView: TRecordsViewEh – ссылка на отфильтрованный список записей.
RecordsView.MemTableData: TMemTableDataEh – ссылка на внутреннюю таблицу данных.
RecordsView.MemTableData.AutoIncrement: TAutoIncrementEh – ссылка на объект настройки инкрементных значений.
RecordsView.MemTableData.DataStruct: TMTDataStructEh – ссылка на объект структуры полей внутреннего массива.
RecordsView.MemTableData.DataStruct[Index: Integer]: TMTDataFieldEh – доступ к описанию полей структуры внутреннего массива.
RecordsView.MemTableData.RecordsList: TRecordsListEh – ссылка на массив-список записей.
RecordsView.MemTableData.RecordsList[Index: Integer]: TMemoryRecordEh – доступ к конкретной записи в массиве записей.
RecordsView.MemTableData.RecordsList[Index: Integer].DataValues[const FieldNames: string; DataValueVersion: TDataValueVersionEh]: Variant – доступ к значению поля(ей) в записи с номером Index.

Работа с TMemTableEh в период разработки.

В период разработки двойной щелчок на компоненте открывает окно управлением компонентом – TMemTableFieldsEditor. В нем можно:
Создавать поля (компоненты TField) для TMemTableEh.
Заполнять TMemTableEh данными.
Загружать в TMemTableEh данные из другого DataSet’а источника данных.
Создавать ‘stand-alone’ массив данных.
Очищать TMemTableEh.
Создать новый DataDriver для TMemTableEh на основе уже существующего DataSet’а источника данных. При этом дизайнер попытается присвоить свойства DataDriver’а основываясь на типе DataSet’а источника. Например, если вы выберите создание DataDriver’а типа TSQLDataDriver и DataSet источник будет иметь тип TQuery, то дизайнер автоматически присвоит свойство TSQLDataDriver.SelectComand.CommandText из TQuery.SQL.
При подключенном DataDriver’е TMemTableEh позволяет активизировать себя. Внутренний массив записей будет пересоздаваться при каждой активизации компонента. При этом если DataDriver это TSQLDataDriverEh то система попытается создать Design-time объект работы с базой данных и выполнение запросов будет происходить через этот Design-time объект.