📄 umandata.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 + -