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

📄 udatamodel.pas

📁 Software Requirements1. Delphi 6 SP22. Oracle 8i R33. Raize 3.0.94. ExpressQuantumGrid 4.505. Expres
💻 PAS
字号:
unit UDataModel;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, MidasLib,
  MyModel, MyTools, UModel, DB, DBClient;

type
  TDataModel = class(TModel, IDataAccess)
    ClientDataSet: TClientDataSet;
  protected
    AutoOpenDataSet: Boolean;
  protected
    procedure ParseToDataItem(DataItem: IDataItem); virtual; abstract;
    function LocateByKey(Key: IKey): Boolean; virtual; abstract;
    function NewDataItem: IDataItem; virtual; abstract;
    function NewKey(const KeyName: string): IKey;
  public
    procedure OpenDataSet; virtual;
    function IsAutoOpenDataSet: Boolean;
{---------------------------------------- IDataAcdess ----------------------------------------}
  public
    function GetDataItem(Key: MyTools.IKey): MyTools.IDataItem; virtual;
    function GetCount: Word; virtual;
    function GetDataSet: TDataSet; virtual;
    function GetKey: IKey; virtual;
  public
    constructor Create(Owner: TComponent); override;
    destructor Destroy; override;
    procedure Refresh(Parameters: IParameters); override;
  end;

implementation

uses
  MyException;

{$R *.dfm}

constructor TDataModel.Create(Owner: TComponent);
begin
  inherited;
  AutoOpenDataSet := False;
end;

destructor TDataModel.Destroy;
begin
  ClientDataSet.Close;
  inherited;
end;

function TDataModel.GetCount: Word;
begin
  if ClientDataSet.Active then
    Result := ClientDataSet.RecordCount
  else
    Result := 0;
end;

function TDataModel.GetDataItem(Key: IKey): MyTools.IDataItem;
begin
  Result := nil;
  try
    if not LocateByKey(Key) then
      Exit;
  except
    on E: Exception do
      raise ELocateByPKException.Create(Self.ClassName, E.Message);
  end;
  try
    Result := NewDataItem;
  except
    on E: Exception do
      raise ENewDataItemException.Create(Self.ClassName, E.Message);      
  end;
  try
    ParseToDataItem(Result);
  except
    on E: Exception do
    begin
      FreeAndNil(Result);
      raise EParseToDataItemException.Create(Self.ClassName, E.Message);
    end;
  end;
end;

function TDataModel.GetDataSet: TDataSet;
begin
  Result := ClientDataSet;
end;

function TDataModel.GetKey: IKey;
begin

end;

function TDataModel.IsAutoOpenDataSet: Boolean;
begin
  Result := AutoOpenDataSet;
end;

function TDataModel.NewKey(const KeyName: string): IKey;
var
  IntegerKey: IIntegerKey;
  StringKey: IStringKey;
begin
  if not ClientDataSet.Active then
    raise ENewKeyException.Create(Self.ClassName, '数据集没有处于活动状态.');
  if GetDataSet.FindField(KeyName) = nil then
    raise ENewKeyException.Create(Self.ClassName, '没有发现字段''' + KeyName + '''.');

  if (GetDataSet.FieldByName(KeyName).DataType = ftString) or
     (GetDataSet.FieldByName(KeyName).DataType = ftWideString) then
  begin
    StringKey := TStringKey.Create;
    StringKey.SetKeyName(KeyName);
    StringKey.SetKey(GetDataSet.FieldByName(KeyName).AsString);
    Result := StringKey;
  end
  else if (GetDataSet.FieldByName(KeyName).DataType = ftSmallint) or
          (GetDataSet.FieldByName(KeyName).DataType = ftInteger) or
          (GetDataSet.FieldByName(KeyName).DataType = ftWord) or
          (GetDataSet.FieldByName(KeyName).DataType = ftLargeint) or
          (GetDataSet.FieldByName(KeyName).DataType = ftFloat) then
  begin
    IntegerKey := TIntegerKey.Create;
    IntegerKey.SetKeyName(KeyName);
    IntegerKey.SetKey(GetDataSet.FieldByName(KeyName).AsInteger);
    Result := IntegerKey;
  end;
end;

procedure TDataModel.OpenDataSet;
begin
  ClientDataSet.Open;
end;

procedure TDataModel.Refresh(Parameters: IParameters);
begin
  inherited;
  ClientDataSet.Refresh;
end;

end.

⌨️ 快捷键说明

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