Библиотека компонент EhLib Руководство разработчика


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



страница13/13
Дата09.08.2019
Размер456 Kb.
#128179
ТипРуководство
1   ...   5   6   7   8   9   10   11   12   13

Работа с 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 объект.



Компонент TDataDriverEh.


TDataDriverEh - это поставщик данных в TMemTableEh и обработчик изменений от TMemTableEh. TDataDriverEh это простейший поставщик данных, он является посредником между TMemTableEh и другим DataSet’ом, который умеет работать с базой данных. Хотя многие датасеты могут быть подключены к DBGrid’ напрямую, минуя TMemTableEh, связку (DBGridEh-DataSource-MemTableEh-DataDriverEh-DataSet), данную связку можно использовать если вы хоти иметь преимущества работы DBGridEh в связки с MemTableEh такие как ViewScroll режим, древовидные отображение данных, использование общих данных несколькими компонентами MemTableEh.

В режиме поставщика TDataDriverEh берет данные DataSet'а, определенного свойством ProviderDataSet и копирует их в TMemTableEh. Перед получением первой записи MemTableEh запрашивает у TDataDriverEh структуру полей таблицы и на основе их создает структуру внутреннего массива записей. TDataDriverEh формирует структуру полей на основе списка полей ProviderDataSet’а. Далее по мере требования TDataDriverEh берет значения текущей записи, записывает их TMemTableEh и переходит к следующей записи. Кроме того, TDataDriverEh может обновить значения уже записанной в TMemTableEh записи из ProviderDataSet’а (TMemTableEh.RefreshRecord). TDataDriverEh находит запись в ProviderDataSet'е, используя свойство KeyFields, и переписывает значения полей в запись TMemTableEh. В режиме обработчика изменений, он принимает измененную запись от TMemTableEh, используя свойство KeyFields, находит ее положение в ProviderDataSet, обновляет запись в ProviderDataSet'е, повторно запрашивает ее из ProviderDataSet'а и возвращает запрошенную запись обратно в TMemTableEh.

Используя события TDataDriverEh'а можно контролировать пересылаемые данные между TDataDriverEh'ом и TMemTableEh'ом, а также передавать и обрабатывать изменения из любого другого источника данных отличного от ProviderDataSet'а.

TDataDriverEh содержит следующие события:



OnBuildDataStruct – пишите обработчик этого события, чтобы создать структуру создаваемых данных в TMemTableEh перед принятием первых записей. В событии можно вызвать процедуру TDataDriverEh.DafaultBuildDataStruct для создания структуры по умолчанию.

OnProduceDataReader - пишите обработчик этого события, чтобы переопределить датасет-поставщик данных. Если это событие не присвоено, то поставщиком данных станет ProviderDataSet. В событии можно вызвать процедуру TDataDriverEh.DefaultProduceDataReader чтобы определить датасет-поставщик по умолчанию.

OnReadRecord - пишите обработчик этого события, чтобы присвоить значения полей новой поставляемой TMemTableEh'у записи или указать, что данных больше нет. В событии можно вызвать процедуру TDataDriverEh.DefaultReadRecord чтобы присвоить значения полей по умолчанию.

OnAssignFieldValue - пишите обработчик этого события, чтобы присвоить значение конкретного поля новой поставляемой TMemTableEh'у записи или для обновления записи. Используйте DataValueVersion для определения режима запрашиваемой записи: dvvValueEh – при присваивании новой записи, dvvRefreshValue – при обновлении значений существующей. В событии можно вызвать процедуру TDataDriverEh.DefaultAssignFieldValue чтобы присвоить значение поля по умолчанию.

OnRefreshRecord - пишите обработчик этого события, чтобы присвоить свежие значения полей при обновлении записи с сервера. В событии можно вызвать процедуру TDataDriverEh.DefaultRefreshRecord чтобы присвоить свежие значения по умолчанию.

OnUpdateRecord - пишите обработчик этого события, чтобы обработать измененную в TMemTableEh'е запись. Используйте MemRec.UpdateStatus для определения типа изменения: Изменение, Удаление или Добавление. В событии можно вызвать процедуру TDataDriverEh.DefaultUpdateRecord для обработки измененной записи по умолчанию. По умолчанию DataDriver проводит изменения в ProviderDataSet.

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

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

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

ueaCountinueEh Игнорировать ошибку, не менять статус изменения записи и продолжить выполнение остальных изменений.

ueaRetryEh Повторить операцию (Вы должны предпринять какие либо действия для предотвращения этой ошибки при повторной операции).

ueaCountinueSkip Игнорировать ошибку, выставить у записи статус Unchanged или удалить в случае статуса usDelete и продолжить выполнение остальных изменений.
В событии можно вызвать процедуру TDataDriverEh.DefaultUpdateError чтобы выполнить действия по умолчанию.

Компонент TSQLDataDriverEh.


TSQLDataDriverEh это универсальный драйвер обработки данных, взаимодействующих с сервером посредствам языка SQL. TSQLDataDriverEh содержит пять объектов типа TSQLCommandEh: SelectCommand, DeleteCommand, InsertCommand, UpdateCommand, GetrecCommand которые хранят SQL выражения и параметры соответственно для запроса данных, удаления записи, вставки записи, изменения записи, перезапроса записи. Для выполнения команд TSQLDataDriverEh вызывает глобальное событие DefaultSQLDataDriverResolver.OnExecuteCommand. Вы должны написать это событие, чтобы выполнить SQL выражения на сервере и по необходимости вернуть DataSet для считывания данных. В режиме поставщика TSQLDataDriverEh берет данные из DataSet'а созданного в событии DefaultSQLDataDriverResolver.OnExecuteCommand записывает их в TMemTableEh. По мере требования он берет данные текущей записи, записывает их в TMemTableEh и переходит к следующей записи. В режиме обработчика изменений он принимает измененную запись от TMemTableEh, и вызывает событие DefaultSQLDataDriverResolver.OnExecuteCommand передавая в качестве параметра DeleteCommand, InsertCommand или UpdateCommand.

TSQLDataDriverEh имеет свойство SpecParams типа TStrings. Вы можете использовать его для записи специальных значений, которые будете использовать в событии DefaultSQLDataDriverResolver.OnExecuteCommand. Это свойство также используется объектом TServerSpecOperationsEh когда экземпляр этого объекта присвоен свойству DefaultSQLDataDriverResolver.ServerSpecOperations. Список специальных значений зависит от типа объекта TServerSpecOperationsEh и заполняется аналогично описанию в разделе “Свойство TXXXDataDriverEh.SpecParams

Свойство DefaultSQLDataDriverResolver.ServerSpecOperations имеет тип TServerSpecOperationsEh. Этот объект предназначен для обработки специальных операций до или после выполнения процедуры ExecuteCommand. TServerSpecOperationsEh является базовым классом для классов TOracleSpecOperationsEh, TMSSQLSpecOperationsEh, TInterbaseSpecOperationsEh, TInfromixSpecOperationsEh, TDB2SpecOperationsEh, TSybaseSpecOperationsEh и TMSAccessSpecOperationsEh. Каждый из этих объектов умеет обрабатывать свойство SpecParams в частности для получения автоинкрементных полей сгенерированных сервером. По названию класса можно определить тип сервера, для которого предназначен класс.

Для полнофункциональной работы TSQLDataDriverEh необходимо написать событие DefaultSQLDataDriverResolver.OnExecuteCommand чтобы выполнять запросы на сервер и присвоить свойство DefaultSQLDataDriverResolver.ServerSpecOperations объектом одного из наследников класса TServerSpecOperationsEh. Присваивать свойство ServerSpecOperations имеет смысл, если вы будете выполнять операции вставки в таблицы на сервере содержащие автоинкрементые поля.


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

// Нижеприведенный код настраивает работу компонент TSQLDataDriverEh во всем приложении,

// для работы с сервером InderBase через движок BDE.

uses … DataDriverEh, BDEDataDriverEh;

type

TMainForm = class(TMainForm)



Database1: TDatabase;

SQLDataDriverEh: TSQLDataDriverEh;

procedure TMainForm.FormCreate(Sender: TObject);



begin

DefaultSQLDataDriverResolver.OnExecuteCommand := OnExecuteSQLCommand;

DefaultSQLDataDriverResolver.ServerSpecOperations := TInterbaseSpecOperationsEh.Create;

end;
procedure TMainForm.FormDestroy(Sender: TObject);

begin

DefaultSQLDataDriverResolver.ServerSpecOperations.Free;



DefaultSQLDataDriverResolver.ServerSpecOperations := Nil;

end;
function TMainForm.OnExecuteSQLCommand(SQLDataDriver: TCustomSQLDataDriverEh;

Command: TCustomSQLCommandEh; var Cursor: TDataSet; var FreeOnEof,

Processed: Boolean): Integer;

begin

Result := DefaultExecuteBDECommandEh(SQLDataDriver, Command,



Cursor, FreeOnEof, Processed, Database1.DatabaseName);

end;


TSQLDataDriverEh является базовым классом для TBDEDataDriverEh, TIBXDataDriverEh, TDBXDataDriverEh и TADODataDriverEh. Эти объекты переопределяют процедуру ExecuteCommand и умеют сами выполнять SQL выражения на сервере и по необходимости возвращать DataSet для считывания данных. При вызове SQL команд, в этих компонентах создается DataSet, соответствующий типу доступа к данным. Для TBDEDataDriverEh это TQuery, для TIBXDataDriverEh это TIBXQuery и т. п. Кроме того, классы TBDEDataDriverEh, TIBXDataDriverEh, TDBXDataDriverEh автоматически определяют объект TServerSpecOperationsEh. Для TADODataDriverEh необходимо определять свойство DefaultSQLDataDriverResolver.ServerSpecOperations т.к. технология ADO не позволяет однозначно определить тип сервера.
TSQLDataDriverEh содержит следующие события:

OnExecuteCommand - пишите обработчик этого события, чтобы выполнить SQL выражение. В событии можно вызвать процедуру TCustomSQLDataDriverEh.DefaultExecuteCommand чтобы выполнить SQL выражение по умолчанию. TCustomSQLDataDriverEh.DefaultExecuteCommand вызывает процедуру DefaultSQLDataDriverResolver.ExecuteCommand, который, в свою очередь, вызывает событие DefaultSQLDataDriverResolver.OnExecuteCommand.
OnGetBackUpdatedValues - пишите обработчик этого события, чтобы получить с сервера обновленные значения записи. В событии можно вызвать процедуру TCustomSQLDataDriverEh.DefaultGetUpdatedServerValues чтобы выполнить действия по получению. TCustomSQLDataDriverEh.DefaultGetUpdatedServerValues выполняет процедуру DefaultSQLDataDriverResolver.GetBackUpdatedValues. Если она не была обработана в DefaultSQLDataDriverResolver, то вызывает InternalGetServerSpecOperations.GetBackUpdatedValues. InternalGetServerSpecOperations возвращает объект типа TServerSpecOperationsEh.

Свойство TXXXDataDriverEh.SpecParams.
Cвойство SpecParams содержит список параметров и значений. TXXXDataDriverEh используют их при выполнении SQL выражений. Значение каждого параметра должно храниться в отдельной строке в формате ‘ИМЯ_ПАРАМЕТРА=ЗНАЧЕНИЕ’. В зависимости от типа сервера (InterBase, Oracle, MSSQL, Informix) SpecParams может содержать следующие параметры.
При работе с сервером InterBase:

'GENERATOR' - определяет имя генератора значение InterBase. DataDriver использует этот параметр для получения текущего значение генератора перед вставкой новой записи.

'GENERATOR_FIELD' - определяет имя поля, которому будет присвоено текущее значение генератора после вставки новой записи.

'AUTO_INCREMENT_FIELD' - определяет имя поля, которому DataDriver проставит тип AutoIncremet. Используется при создании структуры внутреннего массива записей.


При работе с сервером Oracle:

'SEQUENCE' - задает имя поля Oracle последовательности. DataDriver использует этот параметр для получения текущего значения последовательности перед вставкой новой записи.

'SEQUENCE_FIELD' - задает имя поля, которому будет присвоено текущее значение последовательности после вставки новой записи.

'AUTO_INCREMENT_FIELD' - задает имя поля, которому DataDriver просвоит тип AutoIncremet. Используется при создании структуры внутреннего массива записей.


При работе с сервером MSSQL:

'AUTO_INCREMENT_FIELD' - задает имя поля, которому DataDriver проставит тип AutoIncremet. Используется при создании структуры внутреннего массива записей.


При работе с сервером Informix:

'AUTO_INCREMENT_FIELD' - задает имя поля, которому DataDriver проставит тип AutoIncremet. Используется при создании структуры внутреннего массива записей.

Пример списка параметров для InterBase сервера:

GENERATOR=EMP_NO_GEN

GENERATOR_FIELD=emp_no

AUTO_INCREMENT_FIELD=emp_no


SQL выражение для вставки записи должно содержать EMP_NO_GEN генератор.

insert into

employee (EMP_NO, FIRST_NAME)

values


(:EMP_NO, :FIRST_NAME)

Динамическое формирование SQL выражений при обновлении данных.


TSQLDataDriverEh позволяет формировать Insert, Update и Delete выражения динамически перед посылкой запроса на сервер. Это полезно когда таблица содержит много записей а изменения были только в нескольких полях. При формировании запроса компонент формирует SQL выражения только для полей которые были изменены. Это сокращает размер пакета данных передаваемых на сервер. Для настройки динамического формирования выражения используйте подсвойства свойства DynaSQLParams.

Свойство KeyFields задает ключевое поле записи. Оно будет использоваться для формирования условия WHERE при удалении или обновлении записи. Свойство UpdateFields задает все поля которые могут быть обновлены в таблице сервера. Свойство UpdateTable задает название обновляемой таблицы. Свойство SkipUnchangedFields определяет что поля у которых значения не изменились не добавлять в SQL выражение. Свойство Options имеет тип TDynaSQLOptionsEh и определяет операции для которых надо формировать динамические SQL выражение. Вы можете использовать комбинацию одного из следующих значений dsoDynamicSQLInsertEh, dsoDynamicSQLUpdateEh, dsoDynamicSQLDeleteEh.



TSQLDataDriverEh или TXXXDataDriverEh, что выбрать для работы.


Как TSQLDataDriverEh так и один из компонентов TBDEDataDriverEh, TIBXDataDriverEh, TDBXDataDriverEh и TADODataDriverEh (будем в дальнейшем называть их TXXXDataDriverEh) позволяют работать с БД без большого количества настроек.

Для TXXXDataDriverEh достачно установить свойство объекта БД (Для TBDEDataDriverEh это свойство Database типа TDatabase).

У TSQLDataDriverEh нет свойства объекта БД. Для его работы достаточно один раз написать в вашей программе событие DefaultSQLDataDriverResolver.OnExecuteCommand чтобы выполнять запросы на сервер и присвоить свойство DefaultSQLDataDriverResolver.ServerSpecOperations объектом одного из наследников класса TServerSpecOperationsEh чтобы правильно обрабатывать некоторые специфичные для разных серверов операции. DefaultSQLDataDriverResolver не визуальный объект, так что присваивать событие и свойство пройдется в коде программы, например в событии OnCreate вашей главной формы. Используя TSQLDataDriverEh можно быстро менять Engine доступа к данным. Для этого достаточно переписать глобальное событие DefaultSQLDataDriverResolver.OnExecuteCommand.

В период разработки различий в работе TSQLDataDriverEh и TXXXDataDriverEh почти нет. При открытии редактора компоненты TSQLDataDriverEh вам предлагается выбрать один из design-time типов доступа к данным надстроенных над движками BDE, ADO, IBX или DBX. Совсем не обязательно что бы движок доступа к данным реализованный в событии DefaultSQLDataDriverResolver.OnExecuteCommand совпадал с тем, что вы используете в период разработки.



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


Двойной щелчок на компоненте TSQLDataDriverEh и TXXXDataDriverEh открывает окно диалога редактирования TSQLDataEditWin. В период разработки TSQLDataDriverEh или TXXXDataDriverEh независимо от того присвоен или не присвоен объекта работы с базой данных (TDatabase для TBDEDataDriverEh) используют для работы Design-time копию объекта работы с базой данных. Если не было создано ни одного объекта работы с БД, то система предложит создать новый объект-копию. В зависимости от типа TDataDriver’а открывается свое окно создания объекта работы с ДБ. Для TSQLDataDriverEh выводится окно в котором вы можете выбрать тип доступа к данным (Engine) и сервис обработки данных сервера (DB Service). Тип доступа определяет движок доступа к данным и может быть одним из следующих типов: BDE, IBX, DBX или ADO. В зависимости от типа доступа по необходимости нужно задать “Сервис обработки данных”, объект который умеет получать список объектов БД. Если в системе уже присутствуют Design-time объекты БД то система предложит выбрать для работы один из них.

Окно редактирования TSQLDataEditWin содержит следующие элементы:

Дерево объектов БД. Таблицы, Вьюшки, Процедуры, Фукнции и т.д. Зависит от типа сервера.

Нижнее окно элементов текущего объекта в дереве объектов.

Грид вывода результатов выполнения Select выражения.

Закладка для ввода Select выражения компонента TSQLDataDriverEh (TSQLDataDriverEh.SelectSQL)

Закладки для ввода выражений типа Insert, Update, Delete, GetRec.

Закладки Other для ввода SpecParams и для параметров динамического формирования SQL выражений.



Обратная связь и отчет об ошибках


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

Включайте информацию об операционной системе и Service Pack's, версии Delphi (с Build) и версии EhLib.



Также по возможности проверьте возникновение ошибки на других компьютерах, ОС, других версиях Delphi, других версиях EhLib.

Наиболее эффективный результат будет, если вы отошлете мне исходник проекта, который демонстрирует эту ошибку. Демо может включать в себя стандартные DataSet'ы (не от сторонних разработчиков) и использовать таблицы из DBDEMOS, либо вы можете скопировать свои данные из своего набора данных в TClientDataSet. Не присылайте мне проекты, содержащие компоненты сторонних разработчиков.

Поделитесь с Вашими друзьями:
1   ...   5   6   7   8   9   10   11   12   13




База данных защищена авторским правом ©vossta.ru 2022
обратиться к администрации

    Главная страница