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

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

Как уже было сказано TCommonObject реализует базовые функции, которые должны быть присущи объектам, реализующим и единичные записи, и списки единичных записей, и сложным объединениям. Рассмотрим подробнее их.

Подключение FConnection ( TADOConnection ) – указатель на экземпляк класса подключения к базе данных.

Свойство ID ( integer )– идентификатор первичного ключа в единичных записях содержит значение первичного ключа, в списках содержит значение первичного ключа для отбора нескольких единичных записей.

Свойство SID – второй идентификатор первичного ключа, применени аналогично свойству ID.

Свойство isDeleted ( Boolean ) – признак того что экземпляр класса удален и при выполнении процедуры Save будет вызвана процедура Delete.

Свойство AfterOnRefresh ( TOnRefresh ) – содержит указатель на метод который будет вызван после выполнения процедуры Refresh экземпляра единичной записи.

Свойство OnSetKayValue ( TOnSetKeyValue ) – содержит указатель на метод который выполняется при установке значений ключевых полей.

constructor Create; virtual – конструктор который в наследниках перегружается для задания начальных значений ( FisDeleted:= False; FID:= -1; FSID:= -1;).

function Save(ASaveItems: Boolean = True): Boolean; virtual; – общий метод сохранения, в данном классе реализует только проверку свойства isDeleted и вызов метода Delete в случае если свойство true. В наследниках переопределяется, в частности в TCommonEngine реализуется общий метод сохранения единичной записи, а в TCommonListEngine он реализует сохранение каждой единичной записи путем сохранения каждого элемента списка, а в случае установленного свойства isDeleted устанавливает элементам списка isDeleted после чего каждый элемент списка сохраняется.

function Delete: Boolean; virtual; – общий метод удаления перегружается в наследниках, в частности в TCommonEngine реализуется общий метод сохранения единичной записи, а в TCommonListEngine он реализует присвоение каждому элементу списка свойства isDeleted и очистку списка единичных записей.

function GetByID: Boolean; virtual; – общий метод получения значений полей из базы данных по ключевым полям, в наследниках перегружается, для реализации доступа к единичной записи, или получения списка единичных записей.

function Refresh:Boolean; virtual; – общий метод обновления экземпляра класса из базы, реализует вызов метода, ссылка на который находиться в свойстве AfterOnRefresh.

function GetAdditionalInfo: Boolean; virtual; – общий метод получения дополнительной информации для экземпляра класса, которая не реализуется общими методами или в перегруженных методах в наследниках.

function FillForeignKey(AForeignCodeValues: Pointer): Boolean; virtual; – функция заполнения значений внешнего ключа, перегружается в наследниках с целью заполнения конкретных свойств значениями внешнего ключа.

Код который реализует данный класс. Скачать его можно здесь uCommonEngine.


    {Базовый класс для всех объектов базы данных}
  TCommonObject = class
  private
    FisDeleted: Boolean;
    FSID: Integer;
    FID: Integer;
    FAfterOnRefresh: TOnRefresh;
    FOnSetKayValue: TOnSetKeyValue;
    procedure SetID(const Value: Integer);
    procedure SetisDeleted(const Value: Boolean);
    procedure SetSID(const Value: Integer);
    procedure SetAfterOnRefresh(const Value: TOnRefresh);
    procedure SetOnSetKayValue(const Value: TOnSetKeyValue);
  public
    FConnection: TADOConnection;
      {Идентификатор записи }
    property ID: Integer read FID write SetID;
      {Идентификатор станции записи }
    property SID: Integer read FSID Write SetSID;
      {Признак того что экземпляр класса удален и при выполнении процедуры Save
      будет вызвана процедура Delete}
    property isDeleted: Boolean read FisDeleted write SetisDeleted;
      {свойоство вызываемое после обновления объекта}
    property AfterOnRefresh: TOnRefresh read FAfterOnRefresh
      write SetAfterOnRefresh;
      {Метод вызываемый при уставноки значений ключевого поля}
    property OnSetKayValue: TOnSetKeyValue read FOnSetKayValue
      write SetOnSetKayValue;
      {Конструктор при необходимости перегружается в наследуеміх классах }
    constructor Create;virtual;
      {Общий метод сохранения, вставляет обновляет и удаляет записи в
       зависимости от состояния isDeleted и ID}
    function Save(ASaveItems: Boolean = True): Boolean;virtual;
      {Общий метод удаления}
    function Delete: Boolean;virtual;
      {общий метод выбора из базы данных }
    function GetByID: Boolean;virtual;
      {Обновление элементов из базы данных}
    function Refresh:Boolean;virtual;
      {Общий метод заполнения дополнительной иорфмации объекта}
    function GetAdditionalInfo: Boolean; virtual;
      {Функция для заполнения значений внешнего ключа}
    function FillForeignKey(AForeignCodeValues: Pointer): Boolean;virtual;
  end;
{ TCommonObject }

constructor TCommonObject.Create;
begin
  FisDeleted:= False;
  FID:= -1;
  FSID:= -1;
end;

function TCommonObject.Delete: Boolean;
begin
  Result:= True;
end;

function TCommonObject.FillForeignKey(AForeignCodeValues: Pointer): Boolean;
begin
  Result:= True;
end;

function TCommonObject.GetAdditionalInfo: Boolean;
begin
  Result:= True;
end;

function TCommonObject.GetByID: Boolean;
begin
  Result:= True;
end;

function TCommonObject.Refresh: Boolean;
begin
  Result:= True;
  if Assigned(FAfterOnRefresh) then
    Result:= AfterOnRefresh;
end;

function TCommonObject.Save(ASaveItems: Boolean = True): Boolean;
begin
  Result:= True;
  if isDeleted then
    Result:= Delete;
end;

procedure TCommonObject.SetAfterOnRefresh(const Value: TOnRefresh);
begin
  FAfterOnRefresh := Value;
end;

procedure TCommonObject.SetID(const Value: Integer);
begin
  FID:= Value;
end;

procedure TCommonObject.SetisDeleted(const Value: Boolean);
begin
  FisDeleted := Value;
end;

procedure TCommonObject.SetOnSetKayValue(const Value: TOnSetKeyValue);
begin
  FOnSetKayValue := Value;
end;

procedure TCommonObject.SetSID(const Value: Integer);
begin
  FSID := Value;
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: , , , ,

One Response to “Object-relational mapping класс для работы с базой данных – TCommonObject”

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

Leave a Reply