Бизнес-объект. Object Relational Mapping
SYSDBA (обсуждение | вклад) |
SYSDBA (обсуждение | вклад) |
||
(не показаны 6 промежуточных версий 1 участника) | |||
Строка 1: | Строка 1: | ||
+ | Программисты, знакомые с Delphi, знают, что для работы с выборкой из базы данных используется один из наследников компонента TDataSet. С его помощью достаточно легко организовать редактирование, вставку и удаление записей, если они извлекаются из одной таблицы. Но, что, если данные объекта хранятся в нескольких таблицах? Вставку, удаление, либо изменение придется организовывать вручную. Работа эта достаточно кропотливая и неблагодарная, так как в случае изменения структуры базы данных придется вносить коррективы в ранее написанный код. По иному обстоит дело при использовании бизнес-объекта. Все сложности процесса добавления, изменения или удаления записей из нескольких таблиц скрыты от разработчика, «зашиты» в код бизнес-объекта. | ||
+ | |||
Рассмотрим такой пример. В базе данных информация о компании (юридическом лице) хранится в виде связанных 1-к-1 записей в двух таблицах: [[GD_CONTACT]] и [[GD_COMPANY]]. Третья таблица — [[GD_COMPANYCODE]] — опциональная. | Рассмотрим такой пример. В базе данных информация о компании (юридическом лице) хранится в виде связанных 1-к-1 записей в двух таблицах: [[GD_CONTACT]] и [[GD_COMPANY]]. Третья таблица — [[GD_COMPANYCODE]] — опциональная. | ||
Строка 6: | Строка 8: | ||
# Старт транзакции | # Старт транзакции | ||
− | # Добавление записи в GD_CONTACT | + | # Добавление записи в [[GD_CONTACT]] |
− | # Добавление записи в GD_COMPANY | + | # Добавление записи в [[GD_COMPANY]] |
− | # Добавление записи в GD_COMPANYCODE | + | # Добавление записи в [[GD_COMPANYCODE]] |
# Комит транзакции | # Комит транзакции | ||
− | Ниже представлены две функции. Первая — '''AddCompany''' — добавляет компанию "реляционным" способом, выполняя последовательно три операции INSERT в разные таблицы. Функция '''AddCompany2''' использует бизнес-объект типа [[TgdcCompany]] для достижения такого же результата. | + | Ниже представлены две функции. Первая — '''AddCompany''' — добавляет компанию "реляционным" способом, выполняя последовательно три операции INSERT в разные таблицы. Функция '''AddCompany2''' использует бизнес-объект типа [[gdcContacts.TgdcCompany|TgdcCompany]] для достижения такого же результата. |
− | + | ||
− | + | ||
+ | <table> | ||
+ | <tr><td><b>Функция AddCompany</b></td><td><b>Функция AddCompany2</b></td></tr> | ||
+ | <tr valign="top"> | ||
+ | <td> | ||
<source lang="vbnet"> | <source lang="vbnet"> | ||
+ | Option Explicit | ||
Function AddCompany(CompanyName, TaxID) | Function AddCompany(CompanyName, TaxID) | ||
Строка 31: | Строка 36: | ||
"VALUES (:id, :parent, :contacttype, :name) " | "VALUES (:id, :parent, :contacttype, :name) " | ||
q.ParamByName("id").AsInteger = ID | q.ParamByName("id").AsInteger = ID | ||
− | q.ParamByName("parent").AsInteger = gdcBaseManager.GetIDByRUIDString("147002208_31587988") | + | q.ParamByName("parent").AsInteger = _ |
+ | gdcBaseManager.GetIDByRUIDString("147002208_31587988") | ||
q.ParamByName("contacttype").AsInteger = 3 | q.ParamByName("contacttype").AsInteger = 3 | ||
q.ParamByName("name").AsString = CompanyName | q.ParamByName("name").AsString = CompanyName | ||
q.ExecQuery | q.ExecQuery | ||
− | q.SQL.Text = "INSERT INTO gd_company (contactkey, fullname) VALUES (:contactkey, :fullname)" | + | q.SQL.Text = _ |
+ | "INSERT INTO gd_company (contactkey, fullname) VALUES (:contactkey, :fullname)" | ||
q.ParamByName("contactkey").AsInteger = ID | q.ParamByName("contactkey").AsInteger = ID | ||
q.ParamByName("fullname").AsString = CompanyName | q.ParamByName("fullname").AsString = CompanyName | ||
q.ExecQuery | q.ExecQuery | ||
− | q.SQL.Text = "INSERT INTO gd_companycode (companykey, taxid) VALUES (:companykey, :taxid) " | + | q.SQL.Text = _ |
+ | "INSERT INTO gd_companycode (companykey, taxid) VALUES (:companykey, :taxid) " | ||
q.ParamByName("companykey").AsInteger = ID | q.ParamByName("companykey").AsInteger = ID | ||
q.ParamByName("taxid").AsString = TaxID | q.ParamByName("taxid").AsString = TaxID | ||
Строка 51: | Строка 59: | ||
End Function | End Function | ||
</source> | </source> | ||
− | + | </td> | |
− | + | <td> | |
− | + | ||
<source lang="vbnet"> | <source lang="vbnet"> | ||
Option Explicit | Option Explicit | ||
Строка 64: | Строка 71: | ||
Obj.Open | Obj.Open | ||
Obj.Insert | Obj.Insert | ||
− | Obj.FieldByName("parent").AsInteger = gdcBaseManager.GetIDByRUIDString("147002208_31587988") | + | Obj.FieldByName("parent").AsInteger = _ |
+ | gdcBaseManager.GetIDByRUIDString("147002208_31587988") | ||
Obj.FieldByName("name").AsString = CompanyName | Obj.FieldByName("name").AsString = CompanyName | ||
Obj.FieldByName("taxid").AsString = TaxID | Obj.FieldByName("taxid").AsString = TaxID | ||
Строка 73: | Строка 81: | ||
End Function | End Function | ||
</source> | </source> | ||
+ | </td> | ||
+ | </tr> | ||
+ | </table> | ||
Очевидно, что второй вариант требует меньших усилий со стороны программиста. Код получается короче и легче в понимании. | Очевидно, что второй вариант требует меньших усилий со стороны программиста. Код получается короче и легче в понимании. | ||
Строка 83: | Строка 94: | ||
</source> | </source> | ||
следует прописать RUID некоторой папки из вашего справочника клиентов. Создаваемые функциями компании будут размещены в этой папке. | следует прописать RUID некоторой папки из вашего справочника клиентов. Создаваемые функциями компании будут размещены в этой папке. | ||
+ | |||
+ | ===См. также=== | ||
+ | |||
+ | * [http://ru.wikipedia.org/wiki/ORM ORM] | ||
[[Category:Учебный курс]] | [[Category:Учебный курс]] | ||
[[Category:Бизнес-объект]] | [[Category:Бизнес-объект]] | ||
+ | [[Category:База данных]] |
Текущая версия на 16:01, 10 января 2015
Программисты, знакомые с Delphi, знают, что для работы с выборкой из базы данных используется один из наследников компонента TDataSet. С его помощью достаточно легко организовать редактирование, вставку и удаление записей, если они извлекаются из одной таблицы. Но, что, если данные объекта хранятся в нескольких таблицах? Вставку, удаление, либо изменение придется организовывать вручную. Работа эта достаточно кропотливая и неблагодарная, так как в случае изменения структуры базы данных придется вносить коррективы в ранее написанный код. По иному обстоит дело при использовании бизнес-объекта. Все сложности процесса добавления, изменения или удаления записей из нескольких таблиц скрыты от разработчика, «зашиты» в код бизнес-объекта.
Рассмотрим такой пример. В базе данных информация о компании (юридическом лице) хранится в виде связанных 1-к-1 записей в двух таблицах: GD_CONTACT и GD_COMPANY. Третья таблица — GD_COMPANYCODE — опциональная.
Таким образом, операция добавления новой компании с заданным именем и УНП (TaxID) потребует выполнения последовательности следующих действий:
- Старт транзакции
- Добавление записи в GD_CONTACT
- Добавление записи в GD_COMPANY
- Добавление записи в GD_COMPANYCODE
- Комит транзакции
Ниже представлены две функции. Первая — AddCompany — добавляет компанию "реляционным" способом, выполняя последовательно три операции INSERT в разные таблицы. Функция AddCompany2 использует бизнес-объект типа TgdcCompany для достижения такого же результата.
Функция AddCompany | Функция AddCompany2 |
Option Explicit Function AddCompany(CompanyName, TaxID) Dim q, Tr, Creator, ID Set Creator = New TCreator Set q = Creator.GetObject(Application, "TIBSQL", "") Set Tr = Creator.GetObject(Application, "TIBTransaction", "") ID = gdcBaseManager.GetNextID Tr.DefaultDatabase = gdcBaseManager.Database Tr.StartTransaction q.Transaction = Tr q.SQL.Text = "INSERT INTO gd_contact (id, parent, contacttype, name) " &_ "VALUES (:id, :parent, :contacttype, :name) " q.ParamByName("id").AsInteger = ID q.ParamByName("parent").AsInteger = _ gdcBaseManager.GetIDByRUIDString("147002208_31587988") q.ParamByName("contacttype").AsInteger = 3 q.ParamByName("name").AsString = CompanyName q.ExecQuery q.SQL.Text = _ "INSERT INTO gd_company (contactkey, fullname) VALUES (:contactkey, :fullname)" q.ParamByName("contactkey").AsInteger = ID q.ParamByName("fullname").AsString = CompanyName q.ExecQuery q.SQL.Text = _ "INSERT INTO gd_companycode (companykey, taxid) VALUES (:companykey, :taxid) " q.ParamByName("companykey").AsInteger = ID q.ParamByName("taxid").AsString = TaxID q.ExecQuery Tr.Commit AddCompany = ID End Function |
Option Explicit Function AddCompany2(CompanyName, TaxID) Dim Creator, Obj Set Creator = New TCreator Set Obj = Creator.GetObject(Application, "TgdcCompany", "") Obj.Open Obj.Insert Obj.FieldByName("parent").AsInteger = _ gdcBaseManager.GetIDByRUIDString("147002208_31587988") Obj.FieldByName("name").AsString = CompanyName Obj.FieldByName("taxid").AsString = TaxID Obj.Post AddCompany2 = Obj.ID End Function |
Очевидно, что второй вариант требует меньших усилий со стороны программиста. Код получается короче и легче в понимании.
[править] Важное замечание!
Если вы захотите поэксперементировать с этими функциями на своей базе данных, то в вызове:
gdcBaseManager.GetIDByRUIDString("147002208_31587988")
следует прописать RUID некоторой папки из вашего справочника клиентов. Создаваемые функциями компании будут размещены в этой папке.