自己写的Delphi数据表操作函数(1)

//=====判断一个字段类型是否为数值型=======================
function RKDBIfNumberType(FieldType: TFieldType):Boolean;
begin
Result:=(FieldType=ftSmallint) or
(FieldType=ftWord) or
(FieldType=ftInteger) or
(FieldType=ftFloat) or
(FieldType=ftCurrency) or
(FieldType=ftLargeint);
end;

//=====找出两个表中同名的字段(不考虑顺序一致)=======================
//两个表都必须已经定义了物理字段或者打开
// TypeOk 为 True 时,检测类型匹配
// TypeOk 为 False 时,不检测类型匹配
//函数返回找到的字段列表,类型为TStrings
//要用到自定义函数RKDBIfNumberType
function RKDBGetSameFields(SourceDataSet: TBDEDataSet;
TargetDataSet: TBDEDataSet;
TypeOk:Boolean):TStrings;
var
ns,nt:Integer;
fName:String;
fType:TFieldType;
sTypeOk:Boolean;
sNames:TStrings;
begin
sNames:=TStringList.Create;
for ns:=0 to SourceDataSet.FieldDefs.Count-1 do begin
fName:=SourceDataSet.FieldDefs[ns].Name;
nt:=-1;
if TargetDataSet.Fields.FindField(fName)<>nil then
nt:=TargetDataSet.FieldDefs.IndexOf(fName);
if (nt>-1) then
if not TypeOk then
sNames.Add(fName)
else begin
fType:=SourceDataSet.FieldDefs[ns].DataType;
if fType=TargetDataSet.FieldDefs[nt].DataType
then sNames.Add(fName)
else begin
sTypeOk:=RKDBIfNumberType(fType);
fType:=TargetDataSet.FieldDefs[ns].DataType;
sTypeOk:=sTypeOk and RKDBIfNumberType(fType);
if sTypeOk then sNames.Add(fName);
end;
end;
end;
Result:=sNames;
end;

//=====从另一个表中追加记录到指定表的尾部=============================
//如果ToTable不存在且没有字义物理字段,则将FromTable完整复制到ToTable
//如果ToTable不存在但字义了物理字段,则执行追加
//如果ToTable已经存在,则追加同名字段的内容
//函数返回成功追加的记录个数
//要用到自定义函数RKDBGetSameFields
function RKDBAppendRecord(FromDataSet: TBDEDataSet;
ToTable: TTable;
TheFilter:String=''):LongInt;
var
ZhuiJia:TBatchMove;
ToTableActive:Boolean;
FromDataSetActive:Boolean;
OldFilter:String;
OldFiltered:Boolean;
begin
ZhuiJia:=TBatchMove.Create(Application.MainForm);
ZhuiJia.Source:=FromDataSet;
ZhuiJia.Destination:=ToTable;
ToTableActive:=ToTable.Active;
FromDataSetActive:=FromDataSet.Active;
//如果ToTable不存在,但有字段定义,则先生成表
if (not ToTable.Exists) and
(ToTable.FieldDefs.Count>0) then ToTable.CreateTable;
if ToTable.Exists then begin
if ToTableActive then
ToTable.DisableControls //如果ToTable已经打开,则关闭控制
else
ToTable.Open; //否则打



if TheFilter<>'' then begin
OldFilter:=FromDataSet.Filter;
OldFiltered:=FromDataSet.Filtered;
FromDataSet.Filter:=TheFilter;
FromDataSet.Filtered:=True;
end;
if FromDataSetActive then begin
FromDataSet.DisableControls; //如果FromTable已经打开,则关闭控制
FromDataSet.First;
end
else
FromDataSet.Open; //否则打开

ZhuiJia.Mappings:=RKDBGetSameFields(FromDataSet,ToTable);
if ZhuiJia.Mappings.Count>0 then begin
ZhuiJia.Mode:=batAppend;
ZhuiJia.Execute;
end;
if ToTableActive then ToTable.EnableControls else ToTable.Close;
if TheFilter<>'' then begin
FromDataSet.Filtered:=OldFiltered;
FromDataSet.Filter:=OldFilter;
end;
FromDataSet.First;
if FromDataSetActive then FromDataSet.EnableControls else FromDataSet.Close;
end
else begin
if FromDataSetActive then FromDataSet.DisableControls; //关闭控制
ZhuiJia.Mode:=batCopy;
ZhuiJia.Execute;
if FromDataSetActive then FromDataSet.EnableControls; //打开控制
end;
Result:=ZhuiJia.MovedCount;
ZhuiJia.Free;
end;

相关文档
最新文档