Object-relational mapping класс для работы с базой данных – TCommonDocument

Продолжение статьи Object-relational mapping класс для работы с базой данных – общие сведения. Подробно рассматривается базовый для всех остальных классов TCommonObject , который реализует основные общие методы и свойства объектов.

Как уже было сказано TCommonDocument наследуется от TCommonObject и реализует базовые функции, которые должны быть присущи объектам, реализующим объекты типа «документ», т.е. существует заголовок документа (единичная запись) и строки документа (список записей). Кроме того возможно что бы документ в качестве содержимого имел другой документ. В нем перегружаются виртуальные методы базового класса TCommonObject и добавляются новые методы и свойства необходимые для базового класса доступа к списку записей из базы данных. По сравнению с родительским классом добавлены следующие методы и свойства:

FObjectList: TList;

FObjectItemList: TList;

destructor Destroy;virtual;

function SetAllConnection: Boolean;virtual;

function SetKeyValuesAll: Boolean;virtual;

function SetKeyValuesInHeaders: Boolean;virtual;

function SetKeyValuesInItems: Boolean;virtual;

function ClearObjectList: Boolean;

function ClearObjectItemList: Boolean;

Подробнее об этих свойствах виртуальных и перегруженных методах:

FObjectList: TList; – Список заголовков объектов, из которых состоит документ на первом месте должен быть тот объект, который является ключевым для всего документа. Данный список не обходим для поддержки множества единичных записей ;

FObjectItemList: TList; – Список строк заголовков объектов, из которых состоит документ. Данный список не обходим для поддержки множества списков строк.

constructor Create;override; – конструктор наследуется от базового класса и при перегрузке должен быть дополнен командой inherited. В нем инициализируются список всех объектов и строк объектов FObjectList и FObjectItemList, а так же устанавливается свойство OnSetKayValue для всего объекта документа.

destructor Destroy;virtual; – Деструктор в случае необходимости перегружается в наследуемом классе и при перегрузке должен быть дополнен командой inherited.

function Save(ASaveItems: Boolean = True): Boolean;override; – Общий метод сохранения , сохраняет все объекты заголовки, которые есть в списке и их строки в зависимости от условия ASaveItems.

function Delete: Boolean;override; – Общий метод удаления, устанавливает всем объектам свойство isDeleted = True после чего сохраняет все объекты.

function GetByID: Boolean;override; – выбирает все объекты по ключевым полям из базы данных.

function Refresh:Boolean;override; – Обновляет все объекты данными из базы данных.

function GetAdditionalInfo: Boolean; override; – Заполняет дополнительную информацию для документа.

function SetAllConnection: Boolean;virtual; – Функция для установки свойств соединения с базой данных полезна когда все объекты уже созданы и им всем надо прописать конекшен.

function SetKeyValuesAll: Boolean;virtual; – Устанавливает значения всем ключевым полям в заголовках и в строках.

function SetKeyValuesInHeaders: Boolean;virtual; – Устанавливает значения ключевым полям документа в заголовках документа.

function SetKeyValuesInItems: Boolean;virtual; – Устанавливает значения ключевым полям документа в строках документа.

function ClearObjectList: Boolean; – Очищает все строки объектов заголовков.

function ClearObjectItemList: Boolean; – Очищает все строки объектов строк.

Таким образом, для реализации наследника от TCommonDocument необходимо перегрузить в наследуемом классе следующие функции, а так же реализовать функции для прописывания ключевых значений в объект заголовок, (ключевой объект) и строки, для данного объекта и занести в соответствующие свойства OnSetKayValue ( будет рассмотренно на примере).

{—-  Base function ——————————————————}

constructor Create;override;// *

function Save(ASaveItems: Boolean = True): Boolean; override;

function Delete: Boolean; override;

function GetByID: Boolean; override;

function Refresh:Boolean; override;

function GetAdditionalInfo: Boolean; override;

function SetAllConnection: Boolean; override;

function SetKeyValuesAll: Boolean; override;

function SetKeyValuesInHeaders: Boolean; override;

function SetKeyValuesInItems: Boolean; override;

destructor Destroy; override;

{—-  Additional function ————————————————}

function SetKeyValuesInTempHeader: Boolean;

function SetKeyValuesInTempList: Boolean;

{—-  Fields ————————————————————-}

{—-  Additional Fields ————————————————–}

Функции, отмеченные звездочкой, обязательно перегружать, и дополнять своим кодом.

Небольшой пример реализации данного класса.

</pre>
constructor TDOCTemp.Create;

begin

inherited Create;

OnSetKayValue:= SetKeyValuesInTempHeader;

FTemp:= TTemp.Create;

FTemp.OnSetKayValue:= SetKeyValuesInTempList;

FObjectList.Add(FTemp);

FTempList:= TTempList.Create;

FObjectItemList.Add(FTempList);

end;

&nbsp;

function TDOCTemp.SetKeyValuesInTempHeader: Boolean;

begin

Result:= True;

FTemp.ID:= ID;

FTemp.SID:= SID;

end;

&nbsp;

function TDOCInvoice. SetKeyValuesInTempList: Boolean;

begin

Result:= True;

FTempList.ID:= ID;

FTempList.SID:= SID;

end;
<pre>

Код который реализует данный класс. Скачать его можно здесь <a href=”http://fk-uran.com.ua/wp-content/uploads/2012/12/uCommonEngine.txt”>uCommonEngine</a>.

{Базовый класс для всех объектов базы данных}
TCommonDocument = class(TCommonObject)
private
public
{Список заголовков объектов, из которых состоит документ на первом месте
должен быть тот объект который является ключевым для всего документа }
FObjectList: TList;
{Список строк заголовков объектов, из которых состоит документ на первом
месте должен быть тот объект который является ключевым для всего
документа }
FObjectItemList: TList;
{конструктор наследуется от базового класса и при перегрузке должен быть
дополнен командой inherited }
constructor Create;override;
{Деструктор в случае необходимости перегружается в наследуемом классе
и при перегрузке должен быть дополнен командой inherited }
destructor Destroy;virtual;
{Общий метод сохранения , сохраняет все объекты заголовки, которые есть в
списке и их строки в зависимости от условия ASaveItems}
function Save(ASaveItems: Boolean = True): Boolean;override;
{Общий метод удаления, устанавливает всем объектам свойство
isDeleted = True после чего сохраняет все объекты}
function Delete: Boolean;override;
{выбирает все объекты по ключевым полям из базы данных }
function GetByID: Boolean;override;
{Обновляет все оббъекты данными из базы данных}
function Refresh:Boolean;override;
{Заполняет дополнительную информацию для документа }
function GetAdditionalInfo: Boolean; override;
{Функция для устанвоки свойств соединения с базой данных}
function SetAllConnection: Boolean;virtual;
{Устанавливает значения всем ключевым }
function SetKeyValuesAll: Boolean;virtual;
{Устанавливает значения ключевым полям документа}
function SetKeyValuesInHeaders: Boolean;virtual;
{Устанавливает значения ключевым полям строкам документа}
function SetKeyValuesInItems: Boolean;virtual;
{Очщает все строки объектов}
function ClearObjectList: Boolean;
function ClearObjectItemList: Boolean;
end;
{ TCommonDocument }


function TCommonDocument.ClearObjectItemList: Boolean;
var
lCommonObject: TCommonObject;
i: Integer;
begin
for i:= 0 to FObjectItemList.Count - 1 do
begin
lCommonObject:= FObjectItemList[i];
if Assigned(lCommonObject) then
lCommonObject.Free;
end;
FObjectList.Clear;
FreeAndNil(FObjectList);
inherited;
end;


function TCommonDocument.ClearObjectList: Boolean;
var
lCommonObject: TCommonObject;
i: Integer;
begin
for i:= 0 to FObjectList.Count - 1 do
begin
lCommonObject:= FObjectList[i];
if Assigned(lCommonObject) then
lCommonObject.Free;
end;
FObjectList.Clear;
FreeAndNil(FObjectList);
inherited;
end;

constructor TCommonDocument.Create;
begin
inherited Create;
FObjectList:= TList.Create;
FObjectItemList:= TList.Create;
end;

function TCommonDocument.Delete: Boolean;
var
i: Integer;
lCommonObject: TCommonObject;
begin
Result:= inherited Delete;
for I:= 0 to FObjectItemList.Count - 1 do
begin
lCommonObject:= FObjectItemList[i];
if Assigned(lCommonObject) then
lCommonObject.Delete;
end;

for I:= 0 to FObjectList.Count - 1 do
begin
lCommonObject:= FObjectList[i];
if Assigned(lCommonObject) then
lCommonObject.Delete;
end;
end;

destructor TCommonDocument.Destroy;
begin
ClearObjectList;
ClearObjectItemList;
inherited;
end;

function TCommonDocument.GetAdditionalInfo: Boolean;
begin
Result:= inherited GetAdditionalInfo;
end;

function TCommonDocument.GetByID: Boolean;
var
lCommonObject: TCommonObject;
i: Integer;
begin
Result:= inherited GetByID;
SetAllConnection;
if Assigned(OnSetKayValue) then
OnSetKayValue;

for i:= 0 to FObjectList.Count - 1 do
begin
lCommonObject:= FObjectList[i];
if Assigned(lCommonObject) then begin
lCommonObject.GetByID;
if Assigned(lCommonObject.OnSetKayValue) then
lCommonObject.OnSetKayValue
end;
end;

for i:= 0 to FObjectItemList.Count - 1 do
begin
lCommonObject:= FObjectItemList[i];
if Assigned(lCommonObject)  then
lCommonObject.GetByID;
if Assigned(lCommonObject.OnSetKayValue) then
lCommonObject.OnSetKayValue
end;
end;

function TCommonDocument.Refresh: Boolean;
var
lCommonObject: TCommonObject;
i: Integer;
begin
Result:= inherited Refresh;
SetAllConnection;
for i:= 0 to FObjectList.Count - 1 do
begin
lCommonObject:= FObjectList[i];
lCommonObject.GetByID;
lCommonObject.GetAdditionalInfo;
end;

for i:= 0 to FObjectItemList.Count - 1 do
begin
lCommonObject:= FObjectItemList[i];
lCommonObject.GetByID;
lCommonObject.GetAdditionalInfo;
end;
end;

function TCommonDocument.Save(ASaveItems: Boolean = True): Boolean;
var
i: Integer;
lCommonObject: TCommonObject;
begin

if not isDeleted then begin
for i:= 0 to FObjectList.Count - 1 do
begin
lCommonObject:= FObjectList[i];
if Assigned(lCommonObject) then begin
lCommonObject.Save(ASaveItems);
if Assigned(lCommonObject.OnSetKayValue) then
lCommonObject.OnSetKayValue;
end;
end;
lCommonObject:= FObjectList[0];
if Assigned(lCommonObject) then begin
ID:= lCommonObject.ID;
SID:= lCommonObject.SID;
end;

if ASaveItems then
for i:= 0 to FObjectItemList.Count - 1 do
begin
lCommonObject:= FObjectItemList[i];
if Assigned(lCommonObject) then begin
lCommonObject.Save(ASaveItems);
if Assigned(lCommonObject.OnSetKayValue) then
lCommonObject.OnSetKayValue;
end;
end;
end
else begin
if ASaveItems then
for i:= 0 to FObjectItemList.Count - 1 do
begin
lCommonObject:= FObjectItemList[i];
if Assigned(lCommonObject) then begin
lCommonObject.Save(ASaveItems);
if Assigned(lCommonObject.OnSetKayValue) then
lCommonObject.OnSetKayValue;
end;
end;

for i:= 0 to FObjectList.Count - 1 do
begin
lCommonObject:= FObjectList[i];
if Assigned(lCommonObject) then begin
lCommonObject.Save(ASaveItems);
if Assigned(lCommonObject.OnSetKayValue) then
lCommonObject.OnSetKayValue;
end;
end;
end;
Result:= inherited Save(ASaveItems);
end;

function TCommonDocument.SetAllConnection: Boolean;
var
i: Integer;
lCommonObject: TCommonObject;
begin
Result:= True;
for i:= 0 to FObjectList.Count - 1 do
begin
lCommonObject:= FObjectList[i];
if Assigned(lCommonObject) then begin
lCommonObject.FConnection:= FConnection;
if lCommonObject is TCommonDocument then
TCommonDocument(lCommonObject).SetAllConnection;
end;
end;

for i:= 0 to FObjectItemList.Count - 1 do
begin
lCommonObject:= FObjectItemList[i];
if Assigned(lCommonObject) then begin
lCommonObject.FConnection:= FConnection;
if lCommonObject is TCommonDocument then
TCommonDocument(lCommonObject).SetAllConnection;
end;
end;
end;

function TCommonDocument.SetKeyValuesAll: Boolean;
begin
SetKeyValuesInHeaders;
Result:= SetKeyValuesInItems;
end;

function TCommonDocument.SetKeyValuesInHeaders: Boolean;
begin
if Assigned(OnSetKayValue) then
Result:= OnSetKayValue
else
Result:= True;
end;

function TCommonDocument.SetKeyValuesInItems: Boolean;
var
i: Integer;
lOnSetKeyValue: TOnSetKeyValue;
lCommonObject: TCommonObject;
begin
Result:= True;
//  SetKeyValuesInItems;
SetAllConnection;
for I:= 0 to FObjectList.Count - 1 do
begin
lCommonObject:= FObjectList[i];
if Assigned(lCommonObject) then begin
lCommonObject.FConnection:= FConnection;
lOnSetKeyValue:= lCommonObject.FOnSetKayValue;
if Assigned(lOnSetKeyValue) then
lOnSetKeyValue;
end;
end;

for I:= 0 to FObjectItemList.Count - 1 do
begin
lCommonObject:= FObjectItemList[i];
if Assigned(lCommonObject) then
lCommonObject.FConnection:= FConnection;
end;
end;



Share

Tags: , , , ,

3 Responses to “Object-relational mapping класс для работы с базой данных – TCommonDocument”

  1. pseudoPakistan пишет:

    Что-то я почти ничего не понял..

  2. просто попробуйте использовать на практике и все станет понятно

  3. [...] ранее статьях были предложены базовые классы: TCommonDocument, TCommonListEngine, TCommonEngine, TCommonObject и рассмотрены общие [...]

Leave a Reply