发信人: plenilune88(望月) 
整理人: soaringbird(2002-02-02 09:05:38), 站内信件
 | 
 
 
关于对数据集处理的通用函数
 
 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
 
  ----                 .-'''''-.
              .'         `.
             :             :
            :               :
            :      _/|      :
             :   =/_/      :
              `._/ |     .'
           (   /  ,|...-'
            \_/^\/||__
         _/~  `""~`"` \_
      __/  -'/  `-._ `\_\__
    /     /-'`  `\   \  \-.\ 
 
 孤意望月 血泪无痕 
 
 http://plenilune.top263.net
 http://www.cnflag.net   | 
 
 
 |