⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s2.model.ts2adapterclientdatamodel.pas

📁 轉載的程序應用框架
💻 PAS
字号:
unit S2.Model.TS2AdapterClientDataModel;

interface

uses
  SysUtils, S2.Model.TS2ClientDataModel, S2.Model.IS2DataAdapter, S2.Tools.IS2Field,
  S2.Tools.IS2Record, S2.Tools.IS2RecordList, S2.Tools.TS2Object, DB,
  Classes, DBClient;

type
  TS2AdapterClientDataModel = class(TS2ClientDataModel, IS2DataAdapter)
  protected
    function ParseDataAdapterError(E: Exception): string;
    procedure AfterAppend(O: TS2Object);
    procedure AfterCancel(O: TS2Object);
    procedure AfterDelete(O: TS2Object);
    procedure AfterSave(O: TS2Object);
    procedure BeforeAppend(O: TS2Object);
    procedure BeforeCancel(O: TS2Object);
    procedure BeforeDelete(O: TS2Object);
    procedure BeforeSave(O: TS2Object);
  private
    procedure PrepareAppend;
    procedure PrepareCancel;
    procedure PrepareDelete;
    procedure PrepareSave;
  public  //  S2.Model.IS2DataAdapter
    function IsModified: Boolean; virtual;
    procedure Append(); overload; virtual;
    procedure Append(Data: IS2Field); overload; virtual;
    procedure Append(Data: IS2Record); overload; virtual;
    procedure Append(Data: IS2RecordList); overload; virtual;
    procedure Cancel(); virtual;
    procedure Delete(); virtual;
    procedure Save(); virtual;
  private
    procedure ConsolidationUpdateLog;
  public
    function GetDataAdapter: IS2DataAdapter; override;  
  end;

implementation

{$R *.dfm}

uses
  S2.Error.S2ReadOnlyException, S2.Error.S2PrepareAppendException, S2.Error.S2PrepareCancelException,
  S2.Error.S2PrepareDeleteException, S2.Error.S2PrepareSaveException, S2.Error.S2DataAdapterException,
  S2.Error.S2AbstractException, S2.Error.S2DataSuncertaintyException;

{ TS2AdapterClientDataModel }

procedure TS2AdapterClientDataModel.AfterAppend(O: TS2Object);
begin

end;

procedure TS2AdapterClientDataModel.AfterCancel(O: TS2Object);
begin

end;

procedure TS2AdapterClientDataModel.AfterDelete(O: TS2Object);
begin

end;

procedure TS2AdapterClientDataModel.AfterSave(O: TS2Object);
begin

end;

procedure TS2AdapterClientDataModel.Append(Data: IS2Record);
begin
  raise S2AbstractException.Create(ClassName, 'Append(Data: IS2Record)');
end;

procedure TS2AdapterClientDataModel.Append(Data: IS2Field);
begin
  raise S2AbstractException.Create(ClassName, 'Append(Data: IS2Field)');
end;

procedure TS2AdapterClientDataModel.Append;
begin
  PrepareAppend;
  BeforeAppend(nil);
  try
    _ClientDataSet.Append;
  except
    on E: Exception do
      raise S2DataAdapterException.Create(ClassName, 'Append', ParseDataAdapterError(E));
  end;
  AfterAppend(nil);
end;

procedure TS2AdapterClientDataModel.Append(Data: IS2RecordList);
begin
  raise S2AbstractException.Create(ClassName, 'Append(Data: IS2RecordList)');
end;

procedure TS2AdapterClientDataModel.BeforeAppend(O: TS2Object);
begin

end;

procedure TS2AdapterClientDataModel.BeforeCancel(O: TS2Object);
begin

end;

procedure TS2AdapterClientDataModel.BeforeDelete(O: TS2Object);
begin

end;

procedure TS2AdapterClientDataModel.BeforeSave(O: TS2Object);
begin

end;

procedure TS2AdapterClientDataModel.Cancel;
begin
  PrepareCancel;
  BeforeCancel(nil);
  try
    _ClientDataSet.Cancel;
  except
    on E: Exception do
      raise S2DataAdapterException.Create(ClassName, 'Cancel', ParseDataAdapterError(E));
  end;
  AfterCancel(nil);
end;

procedure TS2AdapterClientDataModel.ConsolidationUpdateLog;
begin
  _ClientDataSet.DisableControls;
  try
    _ClientDataSet.StatusFilter := [usInserted];
    if _ClientDataSet.RecordCount > 0 then GetServerDataModel.Append(_ClientDataSet);

    _ClientDataSet.StatusFilter := [usModified];
    if _ClientDataSet.RecordCount > 0 then GetServerDataModel.Modify(_ClientDataSet);

    _ClientDataSet.StatusFilter := [usDeleted];
    if _ClientDataSet.RecordCount > 0 then GetServerDataModel.Delete(_ClientDataSet);
  finally
    _ClientDataSet.StatusFilter := [];
    _ClientDataSet.EnableControls;
  end;
end;

procedure TS2AdapterClientDataModel.Delete;
begin
  PrepareDelete;
  BeforeDelete(TS2Object(GetDataObject.GetData));
  try
    _ClientDataSet.Delete;
  except
    on E: Exception do
      raise S2DataAdapterException.Create(ClassName, 'Delete', ParseDataAdapterError(E));
  end;
  AfterDelete(TS2Object(GetDataObject.GetData));  
end;

function TS2AdapterClientDataModel.GetDataAdapter: IS2DataAdapter;
begin
  Result := Self;
end;

function TS2AdapterClientDataModel.IsModified: Boolean;
var
  Bookmark: TBookmark;
begin
  Result := False;
  Bookmark := _ClientDataSet.GetBookmark;
  try
//    _ClientDataSet.DisableControls;
    _ClientDataSet.StatusFilter := [usModified, usInserted, usDeleted];
    if _ClientDataSet.RecordCount > 0 then Result := True;
//    _ClientDataSet.GotoBookmark(Bookmark);
    _ClientDataSet.FreeBookmark(Bookmark);
  finally
    _ClientDataSet.StatusFilter := [];
//    _ClientDataSet.EnableControls;
  end;
end;

function TS2AdapterClientDataModel.ParseDataAdapterError(E: Exception): string;
begin
  raise S2AbstractException.Create(ClassName, 'ParseDataAdapterError');
end;

procedure TS2AdapterClientDataModel.PrepareAppend;
begin
  if IsReadOnly or not IsActive then
    raise S2PrepareAppendException.Create(ClassName, 'PrepareAppend', '')
end;

procedure TS2AdapterClientDataModel.PrepareCancel;
begin
  if IsReadOnly or not IsValid or not IsModified then
    raise S2PrepareCancelException.Create(ClassName, 'PrepareCancel', '')
end;

procedure TS2AdapterClientDataModel.PrepareDelete;
begin
  if IsReadOnly or not IsValid then
    raise S2PrepareDeleteException.Create(ClassName, 'PrepareDelete', '')
end;

procedure TS2AdapterClientDataModel.PrepareSave;
begin
  if IsReadOnly or not IsValid or not IsModified then
    raise S2PrepareSaveException.Create(ClassName, 'PrepareSave', '')
end;

procedure TS2AdapterClientDataModel.Save;
begin
  if not IsModified then Exit;
  PrepareSave;
  if not ValidateData then
    raise S2DataSuncertaintyException.Create(ClassName, 'Save');

  BeforeSave(nil);
  try
    ConsolidationUpdateLog;
    GetServerDataModel.Save;
  except
    on E: Exception do
      raise S2DataAdapterException.Create(ClassName, 'Save', ParseDataAdapterError(E));
  end;
  AfterSave(nil);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -