关于对数据集处理的通用函数

关于对数据集处理的通用函数

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值