关于对数据集处理的通用函数
const FieldClasses:array[TFieldType] of TFieldClass
=(nil, { ftUnknown }
TStringField, { ftString }
TSmallintField, { ftSmallint }
TIntegerField, { ftInteger }
TWordField, { ftWord }
TBooleanField, { ftBoolean }
TFloatField, { ftFloat }
TCurrencyField, { ftCurrency }
TBCDField, { ftBCD }
TDateField, { ftDate }
TTimeField, { ftTime }
TDateTimeField, { ftDateTime }
TBytesField, { ftBytes }
TVarBytesField, { ftVarBytes }
TAutoIncField, { ftAutoInc }
TBlobField, { ftBlob }
TMemoField, { ftMemo }
TGraphicField, { ftGraphic }
TBlobField, { ftFmtMemo }
TBlobField, { ftParadoxOle }
TBlobField, { ftDBaseOle }
TBlobField, { ftTypeBinary }
nil, { ftCursor }
TStringField, { ftFixedChar }
// TWideStringField, { ftWideString }
TStringField, { ftWideString }
TLargeIntField, { ftLargeInt }
TADTField, { ftADT }
TArrayField, { ftArray }
TReferenceField, { ftReference }
TDataSetField, { ftDataSet }
TBlobField, { ftOraBlob }
TBlobField, { ftOraClob }
TVariantField, { ftVariant }
TInterfaceField, { ftInterface }
TIDispatchField, { ftIDispatch }
TGuidField); { ftGuid }
procedure show_DBGrid_title(DBGrid:TDBGrid; IndexColumn:string; IndexOrder:boolean); //显示DBGridEh的排序标记
var i:integer;
s:string;
begin //显示DBGrid排序
for i:=0 to DBGrid.Columns.Count-1 do begin
s:=DBGrid.Columns[i].Title.Caption;
if (copy(s,length(s)-2,3)=' ▲') or (copy(s,length(s)-2,3)=' ▼') then begin
DBGrid.Columns[i].Title.Caption:=copy(s,1,length(s)-3);
break;
end;
end;
for i:=0 to DBGrid.Columns.Count-1 do
if DBGrid.Columns[i].FieldName=IndexColumn then begin
if IndexOrder then DBGrid.Columns[i].Title.Caption:=DBGrid.Columns[i].Title.Caption+' ▲'
else DBGrid.Columns[i].Title.Caption:=DBGrid.Columns[i].Title.Caption+' ▼';
exit;
end;
end;
procedure setDBStrings(StrList:TStrings;Dataset:TDataSet;FieldIndex:integer);
begin //获取数据库代码列表(按序号选字段)
StrList.clear;
with DataSet do begin
if not eof then begin
first;
while not eof do begin
StrList.Add(Fields[FieldIndex].AsString);
Next;
end;
first;
end;
end;
end;
procedure setDBStringsByName(StrList:TStrings;Dataset:TDataSet;FieldName:string);
begin //获取数据库代码列表(按名称选字段)
StrList.clear;
with DataSet do begin
if not eof then begin
first;
while not eof do begin
StrList.Add(FieldByName(FieldName).AsString);
Next;
end;
first;
end;
end;
end;
function DataSetRefreshByKey(DataSet:TDataSet;KeyField:string;KeyValue:Variant):boolean;
begin //刷新DataSet依据Key值
try
DataSet.DisableControls;
DataSet.Active:=false;
DataSet.Active:=true;
Result:=DataSet.Locate(KeyField,KeyValue,[loCaseInsensitive]);
finally
DataSet.EnableControls;
end;
end;
function DataSetRefresh(DataSet:TDataSet;KeyField:string):boolean;
var sn:string;
begin //刷新DataSet
if DataSet.Eof then sn:='0'
else sn:=DataSet.FieldByName(KeyField).AsString;
Result:=DataSetRefreshByKey(DataSet,KeyField,sn);
end;
procedure DataSetTrim(DataSet:TDataSet);
var i:integer;
begin //删除DataSet字符串字段值两边的空格
for i:=0 to DataSet.FieldCount-1 do
if not(DataSet.Fields[i].Calculated) and
not(DataSet.Fields[i].Lookup) and
(DataSet.Fields[i].DataType in [ftString,ftFixedChar,ftWideString]) then
try
DataSet.Fields[i].Text:=Trim(DataSet.Fields[i].Text);
except
end;
end;
procedure DataSetDeleteAllRecords(DataSet:TDataSet);
begin //删除所有记录
if not DataSet.Active then DataSet.Active:=true;
DataSet.DisableControls;
try
DataSet.First;
while not DataSet.Eof do
DataSet.Delete;
except
DataSet.EnableControls;
Raise;
end;
DataSet.EnableControls;
end;
procedure DataSetRemoveAllFields(DataSet:TDataSet);
begin //清除字段
DataSet.Active:=false;
while DataSet.Fields.Count>0 do
DataSet.Fields.Remove(DataSet.Fields[0]);
DataSet.FieldDefs.Clear;
DataSet.Fields.Clear;
end;
function DataSetGetFieldClass(FieldType:TFieldType):TFieldClass;
begin //获取字段类
Result:=FieldClasses[FieldType];
end;
procedure DataSetCopyFields(FromDataSet,ToDataSet:TDataSet;OnlyDataField:boolean);
begin //复制字段列表
DataSetRemoveAllFields(ToDataSet);
DataSetAddFields(FromDataSet,ToDataSet,OnlyDataField);
end;
procedure DataSetAddFields(FromDataSet,ToDataSet:TDataSet;OnlyDataField:boolean); //增加字段列表
var i:integer;
NewField:TField;
FType:TFieldType;
FieldClass:TFieldClass;
begin //增加字段列表
if not(assigned(FromDataSet)) or not(assigned(ToDataSet)) then exit;
for i:=0 to FromDataSet.Fields.Count-1 do
if not(OnlyDataField) or (FromDataSet.Fields[i].FieldKind=fkData) then
begin
FType:=FromDataSet.Fields[i].DataType;
FieldClass:=DataSetGetFieldClass(FType);
NewField:=FieldClass.Create(ToDataSet);
try
NewField.FieldName:=FromDataSet.Fields[i].FieldName;
NewField.Size:=FromDataSet.Fields[i].Size;
NewField.Required:=FromDataSet.Fields[i].Required;
NewField.SetFieldType(FType);
NewField.DataSet:=ToDataSet;
except
FreeAndNil(NewField);
raise;
end;
end;
end;
function DataSetCopyAllRecords(FromDataSet,ToDataSet:TDataSet;OnlyDataField:boolean):longint;
begin //复制所有记录
DataSetDeleteAllRecords(ToDataSet);
Result:=DataSetAddAllRecords(FromDataSet,ToDataSet,OnlyDataField);
end;
procedure DataSetCopyRecord(FromDataSet,ToDataSet:TDataSet;OnlyDataField:boolean);
begin //复制当前记录
DataSetDeleteAllRecords(ToDataSet);
DataSetAddRecord(FromDataSet,ToDataSet,OnlyDataField);
end;
procedure DataSetAddRecord(FromDataSet,ToDataSet:TDataSet;OnlyDataField:boolean);
var i:integer;
FieldName:string;
begin //增加当前记录
if not(assigned(FromDataSet)) or not(assigned(ToDataSet)) then exit;
if not FromDataSet.Active then FromDataSet.Active:=true;
if not ToDataSet.Active then ToDataSet.Active:=true;
try
FromDataSet.DisableControls;
ToDataSet.DisableControls;
ToDataSet.Append;
for i:=0 to FromDataSet.Fields.Count-1 do
if not(OnlyDataField) or (FromDataSet.Fields[i].FieldKind=fkData) then
begin
FieldName:=FromDataSet.Fields[i].FieldName;
ToDataSet.FieldByName(FieldName).Value:=FromDataSet.Fields[i].Value;
end;
ToDataSet.Post;
except
FromDataSet.EnableControls;
ToDataSet.EnableControls;
raise;
end;
FromDataSet.EnableControls;
ToDataSet.EnableControls;
end;
function DataSetAddAllRecords(FromDataSet,ToDataSet:TDataSet;OnlyDataField:boolean):longint;
var i,iRec:integer;
FieldName:string;
begin //增加所有记录
DataSetAddAllRecords:=0;
if not(assigned(FromDataSet)) or not(assigned(ToDataSet)) then exit;
if not FromDataSet.Active then FromDataSet.Active:=true;
if not ToDataSet.Active then ToDataSet.Active:=true;
try
FromDataSet.DisableControls;
ToDataSet.DisableControls;
iRec:=0;
FromDataSet.First;
while not FromDataSet.Eof do
begin
inc(iRec);
ToDataSet.Append;
for i:=0 to FromDataSet.Fields.Count-1 do
if not(OnlyDataField) or (FromDataSet.Fields[i].FieldKind=fkData) then
begin
FieldName:=FromDataSet.Fields[i].FieldName;
ToDataSet.FieldByName(FieldName).Value:=FromDataSet.Fields[i].Value;
end;
ToDataSet.Post;
FromDataSet.Next;
end;
FromDataSet.First;
ToDataSet.First;
except
FromDataSet.EnableControls;
ToDataSet.EnableControls;
raise;
end;
FromDataSet.EnableControls;
ToDataSet.EnableControls;
DataSetAddAllRecords:=iRec;
end;
procedure DataSetAddBlankRecords(DataSet:TDataSet;AddCount:longint);
var iCount:integer;
begin //增加空记录
if AddCount=0 then exit;
for iCount:=0 to DataSet.Fields.Count-1 do
DataSet.Fields[iCount].Required:=false;
try
DataSet.DisableControls;
for iCount:=1 to AddCount do
begin
DataSet.Append;
DataSet.Fields[0].Value:=null;
DataSet.Post;
end;
DataSet.First;
except
DataSet.EnableControls;
raise;
end;
DataSet.EnableControls;
end;
//中大方略版权所有
//www.cnflag.net
const FieldClasses:array[TFieldType] of TFieldClass
=(nil, { ftUnknown }
TStringField, { ftString }
TSmallintField, { ftSmallint }
TIntegerField, { ftInteger }
TWordField, { ftWord }
TBooleanField, { ftBoolean }
TFloatField, { ftFloat }
TCurrencyField, { ftCurrency }
TBCDField, { ftBCD }
TDateField, { ftDate }
TTimeField, { ftTime }
TDateTimeField, { ftDateTime }
TBytesField, { ftBytes }
TVarBytesField, { ftVarBytes }
TAutoIncField, { ftAutoInc }
TBlobField, { ftBlob }
TMemoField, { ftMemo }
TGraphicField, { ftGraphic }
TBlobField, { ftFmtMemo }
TBlobField, { ftParadoxOle }
TBlobField, { ftDBaseOle }
TBlobField, { ftTypeBinary }
nil, { ftCursor }
TStringField, { ftFixedChar }
// TWideStringField, { ftWideString }
TStringField, { ftWideString }
TLargeIntField, { ftLargeInt }
TADTField, { ftADT }
TArrayField, { ftArray }
TReferenceField, { ftReference }
TDataSetField, { ftDataSet }
TBlobField, { ftOraBlob }
TBlobField, { ftOraClob }
TVariantField, { ftVariant }
TInterfaceField, { ftInterface }
TIDispatchField, { ftIDispatch }
TGuidField); { ftGuid }
procedure show_DBGrid_title(DBGrid:TDBGrid; IndexColumn:string; IndexOrder:boolean); //显示DBGridEh的排序标记
var i:integer;
s:string;
begin //显示DBGrid排序
for i:=0 to DBGrid.Columns.Count-1 do begin
s:=DBGrid.Columns[i].Title.Caption;
if (copy(s,length(s)-2,3)=' ▲') or (copy(s,length(s)-2,3)=' ▼') then begin
DBGrid.Columns[i].Title.Caption:=copy(s,1,length(s)-3);
break;
end;
end;
for i:=0 to DBGrid.Columns.Count-1 do
if DBGrid.Columns[i].FieldName=IndexColumn then begin
if IndexOrder then DBGrid.Columns[i].Title.Caption:=DBGrid.Columns[i].Title.Caption+' ▲'
else DBGrid.Columns[i].Title.Caption:=DBGrid.Columns[i].Title.Caption+' ▼';
exit;
end;
end;
procedure setDBStrings(StrList:TStrings;Dataset:TDataSet;FieldIndex:integer);
begin //获取数据库代码列表(按序号选字段)
StrList.clear;
with DataSet do begin
if not eof then begin
first;
while not eof do begin
StrList.Add(Fields[FieldIndex].AsString);
Next;
end;
first;
end;
end;
end;
procedure setDBStringsByName(StrList:TStrings;Dataset:TDataSet;FieldName:string);
begin //获取数据库代码列表(按名称选字段)
StrList.clear;
with DataSet do begin
if not eof then begin
first;
while not eof do begin
StrList.Add(FieldByName(FieldName).AsString);
Next;
end;
first;
end;
end;
end;
function DataSetRefreshByKey(DataSet:TDataSet;KeyField:string;KeyValue:Variant):boolean;
begin //刷新DataSet依据Key值
try
DataSet.DisableControls;
DataSet.Active:=false;
DataSet.Active:=true;
Result:=DataSet.Locate(KeyField,KeyValue,[loCaseInsensitive]);
finally
DataSet.EnableControls;
end;
end;
function DataSetRefresh(DataSet:TDataSet;KeyField:string):boolean;
var sn:string;
begin //刷新DataSet
if DataSet.Eof then sn:='0'
else sn:=DataSet.FieldByName(KeyField).AsString;
Result:=DataSetRefreshByKey(DataSet,KeyField,sn);
end;
procedure DataSetTrim(DataSet:TDataSet);
var i:integer;
begin //删除DataSet字符串字段值两边的空格
for i:=0 to DataSet.FieldCount-1 do
if not(DataSet.Fields[i].Calculated) and
not(DataSet.Fields[i].Lookup) and
(DataSet.Fields[i].DataType in [ftString,ftFixedChar,ftWideString]) then
try
DataSet.Fields[i].Text:=Trim(DataSet.Fields[i].Text);
except
end;
end;
procedure DataSetDeleteAllRecords(DataSet:TDataSet);
begin //删除所有记录
if not DataSet.Active then DataSet.Active:=true;
DataSet.DisableControls;
try
DataSet.First;
while not DataSet.Eof do
DataSet.Delete;
except
DataSet.EnableControls;
Raise;
end;
DataSet.EnableControls;
end;
procedure DataSetRemoveAllFields(DataSet:TDataSet);
begin //清除字段
DataSet.Active:=false;
while DataSet.Fields.Count>0 do
DataSet.Fields.Remove(DataSet.Fields[0]);
DataSet.FieldDefs.Clear;
DataSet.Fields.Clear;
end;
function DataSetGetFieldClass(FieldType:TFieldType):TFieldClass;
begin //获取字段类
Result:=FieldClasses[FieldType];
end;
procedure DataSetCopyFields(FromDataSet,ToDataSet:TDataSet;OnlyDataField:boolean);
begin //复制字段列表
DataSetRemoveAllFields(ToDataSet);
DataSetAddFields(FromDataSet,ToDataSet,OnlyDataField);
end;
procedure DataSetAddFields(FromDataSet,ToDataSet:TDataSet;OnlyDataField:boolean); //增加字段列表
var i:integer;
NewField:TField;
FType:TFieldType;
FieldClass:TFieldClass;
begin //增加字段列表
if not(assigned(FromDataSet)) or not(assigned(ToDataSet)) then exit;
for i:=0 to FromDataSet.Fields.Count-1 do
if not(OnlyDataField) or (FromDataSet.Fields[i].FieldKind=fkData) then
begin
FType:=FromDataSet.Fields[i].DataType;
FieldClass:=DataSetGetFieldClass(FType);
NewField:=FieldClass.Create(ToDataSet);
try
NewField.FieldName:=FromDataSet.Fields[i].FieldName;
NewField.Size:=FromDataSet.Fields[i].Size;
NewField.Required:=FromDataSet.Fields[i].Required;
NewField.SetFieldType(FType);
NewField.DataSet:=ToDataSet;
except
FreeAndNil(NewField);
raise;
end;
end;
end;
function DataSetCopyAllRecords(FromDataSet,ToDataSet:TDataSet;OnlyDataField:boolean):longint;
begin //复制所有记录
DataSetDeleteAllRecords(ToDataSet);
Result:=DataSetAddAllRecords(FromDataSet,ToDataSet,OnlyDataField);
end;
procedure DataSetCopyRecord(FromDataSet,ToDataSet:TDataSet;OnlyDataField:boolean);
begin //复制当前记录
DataSetDeleteAllRecords(ToDataSet);
DataSetAddRecord(FromDataSet,ToDataSet,OnlyDataField);
end;
procedure DataSetAddRecord(FromDataSet,ToDataSet:TDataSet;OnlyDataField:boolean);
var i:integer;
FieldName:string;
begin //增加当前记录
if not(assigned(FromDataSet)) or not(assigned(ToDataSet)) then exit;
if not FromDataSet.Active then FromDataSet.Active:=true;
if not ToDataSet.Active then ToDataSet.Active:=true;
try
FromDataSet.DisableControls;
ToDataSet.DisableControls;
ToDataSet.Append;
for i:=0 to FromDataSet.Fields.Count-1 do
if not(OnlyDataField) or (FromDataSet.Fields[i].FieldKind=fkData) then
begin
FieldName:=FromDataSet.Fields[i].FieldName;
ToDataSet.FieldByName(FieldName).Value:=FromDataSet.Fields[i].Value;
end;
ToDataSet.Post;
except
FromDataSet.EnableControls;
ToDataSet.EnableControls;
raise;
end;
FromDataSet.EnableControls;
ToDataSet.EnableControls;
end;
function DataSetAddAllRecords(FromDataSet,ToDataSet:TDataSet;OnlyDataField:boolean):longint;
var i,iRec:integer;
FieldName:string;
begin //增加所有记录
DataSetAddAllRecords:=0;
if not(assigned(FromDataSet)) or not(assigned(ToDataSet)) then exit;
if not FromDataSet.Active then FromDataSet.Active:=true;
if not ToDataSet.Active then ToDataSet.Active:=true;
try
FromDataSet.DisableControls;
ToDataSet.DisableControls;
iRec:=0;
FromDataSet.First;
while not FromDataSet.Eof do
begin
inc(iRec);
ToDataSet.Append;
for i:=0 to FromDataSet.Fields.Count-1 do
if not(OnlyDataField) or (FromDataSet.Fields[i].FieldKind=fkData) then
begin
FieldName:=FromDataSet.Fields[i].FieldName;
ToDataSet.FieldByName(FieldName).Value:=FromDataSet.Fields[i].Value;
end;
ToDataSet.Post;
FromDataSet.Next;
end;
FromDataSet.First;
ToDataSet.First;
except
FromDataSet.EnableControls;
ToDataSet.EnableControls;
raise;
end;
FromDataSet.EnableControls;
ToDataSet.EnableControls;
DataSetAddAllRecords:=iRec;
end;
procedure DataSetAddBlankRecords(DataSet:TDataSet;AddCount:longint);
var iCount:integer;
begin //增加空记录
if AddCount=0 then exit;
for iCount:=0 to DataSet.Fields.Count-1 do
DataSet.Fields[iCount].Required:=false;
try
DataSet.DisableControls;
for iCount:=1 to AddCount do
begin
DataSet.Append;
DataSet.Fields[0].Value:=null;
DataSet.Post;
end;
DataSet.First;
except
DataSet.EnableControls;
raise;
end;
DataSet.EnableControls;
end;
//中大方略版权所有
//www.cnflag.net