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

📄 umandata.pas

📁 delphi 源码 小型企业管理软件
💻 PAS
字号:
//数据操纵类
unit uManData;

interface
uses Classes,Controls,KsSkinButtons,DB,SysUtils,ADODB,DBCtrls;

Type
  TManData=Class
  private
    FTablename:string;
    FUniqueCols: Tstrings;
    FbtnAdd,FbtnDelete:TSeSkinButton;
    FFocusEdit:TWinControl;
    FDataset:TDataset;
    FOrgbtnAddClickEvent,FOrgbtnDeleteClickEvent: TNotifyEvent;
    FOrgDatasetBeforePostEvent: TDataSetNotifyEvent;
    function DatasetOK: Boolean;
    procedure NewbtnAddClick(Sender: TObject);
    procedure NewbtnDeleteClick(Sender: TObject);
    procedure NewBeforePost(DataSet: TDataSet);
  public
    SaveFailed: Boolean;
    constructor Create(btnAdd,btnDelete:TSeSkinButton;Dataset:TDataset;
      Tablename:string='';UniqueCol:string='';FocusEdit:TWinControl=nil);
    destructor destroy; override;
    procedure SaveData;
    procedure Cancel;
    procedure Effect(Effective:Boolean);
    function FieldByName(Fieldname:string): TField;
    property CurDadaset: TDataset read FDataset;
  end;

implementation

uses uDM, uFunc;

{ TManData }

procedure TManData.NewBeforePost(DataSet: TDataSet);
var
  i: integer;
  mSQL: string;
begin
  SaveFailed := True;

  try
    //检查唯一性
    if (FTablename='DATASET') then
      CheckFieldIDExists(DataSet,FUniqueCols[0])
    else if not ((FTablename='') or (FUniqueCols.Count=0)) then begin
      //判断唯一列是否输入了重复值
      mSQL := 'select space(50),space(50) where 1=2';
      for i:= 0 to FUniqueCols.Count-1 do
        mSQL := mSQL +#13#10+ ' union '
          + Format('select ''%1:s'',''%2:s'' from %0:s where %1:s=''%2:s'' and %1:s<>''%3:s'''
            ,[FTablename,FUniqueCols[i]
             ,Dataset.FieldByName(FUniqueCols[i]).AsString
             ,Dataset.FieldByName(FUniqueCols[i]).OldValue
             ]) ;

      with GetQuery(mSQL) do
      if not IsEmpty then begin
        AbortMsg(Format('【%s】出现重复值:%s,保存失败!'#13#10'请修改后提交,或按ESC键取消。'
          ,[DataSet.FieldByName(Fields[0].AsString).DisplayLabel
           ,Fields[1].AsString]));

      end;
    end;


  finally
    if Assigned(FOrgDatasetBeforePostEvent) then FOrgDatasetBeforePostEvent(DataSet);
  end;

  SaveFailed := False;
end;

procedure TManData.NewbtnDeleteClick(Sender: TObject);
begin
  if not DatasetOK then Exit;
  if FDataset.IsEmpty then Exit;
  if not sure('确定要删除吗?') then exit;

  //带有触发器的表删除时可能出现:“无法为更新定位行。一些值可能已在最后一次读取后已更改。”
  //但实际上已完成删除操作,故而屏蔽此信息,刷新数据集即可。
  try
    FDataset.Delete ;
  except  
    FDataset.Close ;
    FDataset.Open;
  end;

  if Assigned(FOrgbtnDeleteClickEvent) then FOrgbtnDeleteClickEvent(Sender);
end;

procedure TManData.NewbtnAddClick(Sender: TObject);
begin
  if not DatasetOK then Exit;
  FDataset.Append ;
  if Assigned(FOrgbtnAddClickEvent) then FOrgbtnAddClickEvent(Sender);
  if Assigned(FFocusEdit) then FFocusEdit.SetFocus;
end;

constructor TManData.Create(btnAdd,btnDelete:TSeSkinButton;Dataset:TDataset;
      Tablename:string='';UniqueCol:string='';FocusEdit:TWinControl=nil);
begin
  FUniqueCols := TStringList.Create ;

  if Tablename<>'' then
    FTablename := Tablename
  else
    FTablename := TadoTable(DataSet).TableName ;

  if UniqueCol<>'' then
    FUniqueCols.CommaText := UniqueCol
  else
    FUniqueCols.CommaText := GetUniqueColnames(DataSet) ;

  FbtnAdd := btnAdd;
  FbtnDelete := btnDelete;
  FDataset := Dataset;
  FFocusEdit := FocusEdit;

  FOrgbtnAddClickEvent := btnAdd.OnClick;
  btnAdd.OnClick := NewbtnAddClick;

  FOrgbtnDeleteClickEvent := btnDelete.OnClick;
  btnDelete.OnClick := NewbtnDeleteClick;

  FOrgDatasetBeforePostEvent := FDataset.BeforePost;
  FDataset.BeforePost := NewBeforePost;

end;

function TManData.DatasetOK: Boolean;
begin
  Result := Assigned(FDataset) and FDataset.Active ;
end;

destructor TManData.destroy;
begin
  FbtnAdd.OnClick := FOrgbtnAddClickEvent;
  FbtnDelete.OnClick := FOrgbtnDeleteClickEvent;
  FDataset.BeforePost := FOrgDatasetBeforePostEvent;
  FUniqueCols.Free ;
  inherited;
end;

procedure TManData.SaveData;
begin
  if (FDataset is TADOTable) or (FDataset is TADOQuery) then begin
    if (dsEdit	= FDataset.State) or (dsInsert	= FDataset.State)
    then FDataset.Post ;
  end

end;

procedure TManData.Cancel;
begin
  FDataset.Cancel ;
end;

procedure TManData.Effect(Effective: Boolean);
var
  sifOK: string;
begin
  if Effective then
    sifOK := '是'
  else
    sifOK := '否';

  FDataset.Edit;
  FDataset.FieldByName('ifOK').AsString := sifOK;
  FDataset.Post;
end;

function TManData.FieldByName(Fieldname: string): TField;
begin
  Result := FDataset.FieldByName(Fieldname);
end;

end.

⌨️ 快捷键说明

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