Программное обеспечение для вашего бизнеса.
Здесь описывается способ работы с интерфейсами ExaApartments - эта информация используется при разработке собственного плагина для программы.
IExaApp - возвращает информацию о приложении (название, текущий номер версии), текущую базу данных, пользователя (который выполнил вход).
IExaDataBase - обеспечивает доступ к базе данных.
IExaField - информация о поле таблицы.
IExaTable - обеспечивает доступ к таблице.
IExaUser - информация о текущем пользователе.
IExaModule - информация о модуле.
Для работы плагина достаточно реализовать один из следующих интерфейсов. Эту реализацию должна возвращать функция Init, находящаяся в плагине.
IExaAppCommandsPlugin - команда (или несколько) для обработки на уровне приложения. База данных для ее работы не требуется.
IExaDataBaseCommandsPlugin - команда (или несколько) для обработки на уровне базы данных. Например, поиск в таблицах или импорт записей.
Возможные исключения не должны выходить за рамки плагина. При возникновении исключения покажите сообщение пользователю или запишите это в журнал, но не дайте исключению выйти на уровень ExaApartments. Желательно, внутри каждого метода, вызываемого программой в плагине, поставить блок перехвата исключений. Например, вот так:
procedure TExaDataBaseCommandsPlugin.Execute(Command: Integer; const ExaApp: IExaApp); begin try ... except on E: Exception do ShowMessage(E.Message); end; end;
Если исключение выпустить на уровень ExaApartments, то для пользователя будет показано сообщение со страшной формулировкой "Разрушительный сбой". Берегите пользователя!
Все обращения к интерфейсам, реализованным на стороне ExaApartments, должны выполняться только в основном потоке плагина. ExaApartments не поддерживает обращения из параллельных потоков от плагина.
Чтобы обратиться к каждой таблице базы данных, используйте следующий код:
DataBase := ExaApp.Get_DataBase; for I := 0 to DataBase.Get_TableCount - 1 do begin Table := DataBase.Get_Tables(I); ... end;
Если нужно обратиться к конкретной таблице, то сделать это можно по внутреннему имени таблицы либо по отображаемому наименованию.
Обращение по внутреннему имени таблицы:
Table := DataBase.TableByName('Cashbox');
Обращение по отображаемому наименованию таблицы:
Table := DataBase.TableByCaption('Касса');
Рекомендуется обращение по внутреннему имени, т.к. от версии к версии отображаемое наименование может быть изменено. Например, когда-то таблица Сотрудники была переименована в Персонал.
Обращение к конкретной таблице по прошитому индексу не рекомендуется, т.к. порядок таблиц может быть изменен в новой версии программы.
Поиск записи по идентификатору:
if Table.Locate(ID) then ...
Поиск записи по значению в поле:
ID := Table.Locate1('NAME', 'Иванов'); if ID <> '' then ...
Поиск записи по значениям сразу в двух полях:
ID := Table.Locate2('NAME', 'AGE', 'Иванов', 25); if ID <> '' then ...
Простой последовательный перебор записей:
ID := Table.First; while ID <> '' do begin ... ID := Table.Next(ID); end;
Чтобы получить значение из поля записи, нужно вызвать метод Get_Values, указав идентификатор записи и имя поля. В качестве имени поля используется макрос поля без фигурных скобок.
Value := Table.Get_Values(ID, 'NAME');
Любые вносимые изменения в базу данных должны выполняться в рамках транзакции. Перед добавлением/редактированием/удалением записи нужно открыть "скобку" транзакции, а после этих действий - закрыть. Для этого в интерфейсе базы данных есть соответствующие методы. Если "скобка" открыта, то закрыть ее нужно обязательно (даже если при выполнении внутренних действий возникло исключение).
DataBase.BeginTransaction; try ... finally DataBase.EndTransaction; end;
"Скобки" могут быть вложенными. Следующий код правильный:
DataBase.BeginTransaction; try ... DataBase.BeginTransaction; try ... finally DataBase.EndTransaction; end; ... finally DataBase.EndTransaction; end;
Все изменения, внесенные плагином в рамках первой и последней "скобок", формируют в ExaApartments одну транзакцию. Пользователь может отменить ее одним действием.
Совет: вызывайте EndTransaction как можно скорее после вызова BeginTransaction, не следует между ними выполнять слишком долгие действия, например, задать вопрос пользователю и ждать ответа. Дело в том, что во время работы плагина программа также может выполнять обработку данных в фоновом режиме - это может попасть в вашу транзакцию.
При добавлении записи возвращается ее идентификатор, который затем можно использовать для установки значений:
ID := Table.Add; Table.Set_Values(ID, 'NAME', 'Иванов');
Простой пример:
Table.Delete(ID);
Удаление с контролем существования записи и наличия доступа, с созданием транзакции:
if Table.UserHasWriteAccess and Table.Locate(ID) and Table.UserHasRecordWriteAccess(ID) then begin DataBase.BeginTransaction; try Table.Delete(ID); finally DataBase.EndTransaction; end; end;
Мы стараемся как можно оперативнее обеспечивать вас актуальной справочной информацией. Ввиду частых обновлений приложения информация в этом материале может не совсем соответствовать или быть неполной. Благодарим за понимание.
Не нашли ответа на ваш вопрос? Напишите по электронному адресу info@exaoffice.ru — мы ответим максимально быстро.