ClientDataset 多表操作测试方法





//手动创建TClientDataset及字段,此方法可清空原表数据,
//emptydataset操作无效,原因不详.

procedure TForm1.FlushData(ttype:integer);
var
  i,j:integer;
  tado:TADODataSet;
  ss,sn:Currency;
  cd:Tclientdataset;
  tFF:TFloatField;
  tSF:TStringField;
  tIF:TintegerField;
begin
  case ttype of     //grid隐藏无效列
    0:
    begin
      tado:=dsMX;
      self.DBGridEh1.Columns.Grid.FieldColumns['月份'].Visible:=true;
      self.DBGridEh1.Columns.Grid.FieldColumns['团号'].Visible:=true;
      self.DBGridEh1.Columns.Grid.FieldColumns['组团社'].Visible:=true;

      self.DBGridEh1.Columns.Grid.FieldColumns['季度'].Visible:=false;
      self.DBGridEh1.Columns.Grid.FieldColumns['半年度'].Visible:=false;
      self.DBGridEh1.Columns.Grid.FieldColumns['年度'].Visible:=false;
    end;
    1:
    begin
      tado:=dsYF;
      self.DBGridEh1.Columns.Grid.FieldColumns['月份'].Visible:=true;

      self.DBGridEh1.Columns.Grid.FieldColumns['团号'].Visible:=false;
      self.DBGridEh1.Columns.Grid.FieldColumns['组团社'].Visible:=false;
      self.DBGridEh1.Columns.Grid.FieldColumns['季度'].Visible:=false;
      self.DBGridEh1.Columns.Grid.FieldColumns['半年度'].Visible:=false;
      self.DBGridEh1.Columns.Grid.FieldColumns['年度'].Visible:=false;
    end;
    2:
    begin
      tado:=dsJD;
      self.DBGridEh1.Columns.Grid.FieldColumns['季度'].Visible:=true;

      self.DBGridEh1.Columns.Grid.FieldColumns['月份'].Visible:=false;
      self.DBGridEh1.Columns.Grid.FieldColumns['团号'].Visible:=false;
      self.DBGridEh1.Columns.Grid.FieldColumns['组团社'].Visible:=false;
      self.DBGridEh1.Columns.Grid.FieldColumns['半年度'].Visible:=false;
      self.DBGridEh1.Columns.Grid.FieldColumns['年度'].Visible:=false;
    end;
    3:
    begin
      tado:=dsBND;
      self.DBGridEh1.Columns.Grid.FieldColumns['半年度'].Visible:=true;

      self.DBGridEh1.Columns.Grid.FieldColumns['月份'].Visible:=false;
      self.DBGridEh1.Columns.Grid.FieldColumns['团号'].Visible:=false;
      self.DBGridEh1.Columns.Grid.FieldColumns['组团社'].Visible:=false;
      self.DBGridEh1.Columns.Grid.FieldColumns['季度'].Visible:=false;
      self.DBGridEh1.Columns.Grid.FieldColumns['年度'].Visible:=false;
    end;
    4:
    begin
      tado:=dsND;
      self.DBGridEh1.Columns.Grid.FieldColumns['年度'].Visible:=true;

      self.DBGridEh1.Columns.Grid.FieldColumns['月份'].Visible:=false;
      self.DBGridEh1.Columns.Grid.FieldColumns['团号'].Visible:=false;
      self.DBGridEh1.Columns.Grid.FieldColumns['组团社'].Visible:=false;
      self.DBGridEh1.Columns.Grid.FieldColumns['季度'].Visible:=false;
      self.DBGridEh1.Columns.Grid.FieldColumns['半年度'].Visible:=false;
    end;
  end;
  tado.close;
  tado.open;
  if cd<>nil then 
    begin
        //TCDS.EmptyDataSet;
        datasource1.DataSet:=nil;//此处不可省,否则会导致指针错误
        cd.free;
    end; 
  cd:=Tclientdataset.Create(self);
  with cd do
  begin
    data:=null;
    fielddefs.Clear;
    //创建字段
    for i:=0 to tado.FieldCount-1 do
    begin
      if tado.Fields[i].DataType=ftinteger then
      begin
//        with TIntegerField.Create(Self) do
//        begin
//          FieldName:=tado.Fields[i].FieldName;
//          DataSet :=cd;
//        end;
          with FieldDefs.AddFieldDef do
          begin
            Name:=tado.Fields[i].FieldName;
            DataType:=ftInteger;
            tIF:=CreateField(cd) as TIntegerField;
          end;
      end
      else if tado.Fields[i].DataType=ftfloat then
      begin
//        with TFloatField.Create(Self) do
//        begin
//          FieldName:=tado.Fields[i].FieldName;
//          DataSet :=cd;
//        end;
        with FieldDefs.AddFieldDef do
        begin
          Name:=tado.Fields[i].FieldName;
          DataType:=ftFloat;
          tFF:=CreateField(cd) as TFloatField;
        end;
      end
      else
      begin
//        with TStringField.Create(Self) do
//        begin
//          FieldName:=tado.Fields[i].FieldName;
//          Size:=tado.Fields[i].size;
//          //Required:=True;
//          DataSet :=cd;
//        end;
        with FieldDefs.AddFieldDef do
        begin
          Name:=tado.Fields[i].FieldName;
          DataType:=ftString;
          tSF:=CreateField(cd) as TStringField;
        end;
      end
    end;

    with FieldDefs.AddFieldDef do
    begin
      Name:='合计';
      DataType:=ftFloat;
      tFF:=CreateField(cd) as TFloatField;
//      tFF.MinValue:=0;
//      tFF.MaxValue:=150;
    end;
    with FieldDefs.AddFieldDef do
    begin
      Name:='人均';
      DataType:=ftFloat;
      tFF:=CreateField(cd) as TFloatField;
    end;
    with FieldDefs.AddFieldDef do
    begin
      Name:='人均达标等级';
      DataType:=ftString;
      tSF:=CreateField(cd) as TStringField;
    end;

    close;
    //EmptyDataSet;
    CreateDataSet;
    open;
    edit;


    while not tado.Eof do
    begin
      append; //post前加append,否则出错
      //j:=0;
      for i:=0 to tado.FieldCount-1 do
      begin
        Fields[i].Value:=tado.Fields[i].Value;
//        case ttype of       //字段处理
//          0: //明细
//          begin
//            if i in [4,5,6] then
//            begin
//              Fields[i].Value:='';
//              Continue;
//            end;
//          end;
//          1: //月份
//          begin
//            if i in [2,3,4,5,6] then
//            begin
//              Fields[i].Value:='0';
//              Continue;
//            end;
//          end;
//          2:  //季度
//          begin
//            if i in [1,2,3,5,6] then
//            begin
//              Fields[i].Value:='0';
//              Continue;
//            end;
//          end;
//          3: //半年度
//          begin
//            if i in [1,2,3,4,6] then
//            begin
//              Fields[i].Value:='0';
//              Continue;
//            end;
//          end;
//          4:
//          begin
//            if i in [1,2,3,4,5] then
//            begin
//              Fields[i].Value:='0';
//              Continue;
//            end;
//          end;
//        end;
        //ShowMessage(IntToStr(j));
        //ShowMessage(tado.Fields[j].FieldName);
//        if not tado.Fields[j].IsNull then Fields[i].Value:=tado.Fields[j].Value else Fields[i].Value:='';
//        j:=j+1;
      end;

      //合计
      for i:=0 to Qty_Class-1 do
      begin
        ss:=ss+fieldbyname('类'+inttostr(i+1)).value;
      end;
      fieldbyname('合计').Value:=ss;
      //人均
      fieldbyname('人均').Value:=StrToCurr(formatfloat('0.00',(fieldbyname('合计').asfloat/fieldbyname('人数').asfloat)));

      sn:=fieldbyname('人均').Value;
      if (length(TLs)>0) and (sn>0) then // 计算等级
      begin
        for i:=0 to length(tls)-1 do
        begin
          fieldbyname('人均达标等级').Value:='无'; //防止空
          if (sn>=tls[i].mini) and (sn<=tls[i].maxi) then
          begin
            fieldbyname('人均达标等级').Value:=tls[i].name;
            break;
          end;
        end;
      end
      else fieldbyname('人均达标等级').Value:='无';

      post;
      tado.Next;
    end;
    First;
  end;

  datasource1.DataSet:=cd;
//  with cds do
//  begin
//    close;
//    //EmptyDataSet;
//    CreateDataSet;
//    open;
//    edit;
//
//    while not tado.Eof do
//    begin
//      append; //post前加append,否则出错
//      j:=0;
//      for i:=0 to FieldCount-4 do
//      begin
//        case ttype of       //字段处理
//          0: //明细
//          begin
//            if i in [4,5,6] then
//            begin
//              Fields[i].Value:='';
//              Continue;
//            end;
//          end;
//          1: //月份
//          begin
//            if i in [2,3,4,5,6] then
//            begin
//              Fields[i].Value:='0';
//              Continue;
//            end;
//          end;
//          2:  //季度
//          begin
//            if i in [1,2,3,5,6] then
//            begin
//              Fields[i].Value:='0';
//              Continue;
//            end;
//          end;
//          3: //半年度
//          begin
//            if i in [1,2,3,4,6] then
//            begin
//              Fields[i].Value:='0';
//              Continue;
//            end;
//          end;
//          4:
//          begin
//            if i in [1,2,3,4,5] then
//            begin
//              Fields[i].Value:='0';
//              Continue;
//            end;
//          end;
//        end;
//        //ShowMessage(IntToStr(j));
//        //ShowMessage(tado.Fields[j].FieldName);
//        if not tado.Fields[j].IsNull then Fields[i].Value:=tado.Fields[j].Value else Fields[i].Value:='';
//        j:=j+1;
//      end;
//
//      //合计
//      for i:=0 to Qty_Class-1 do
//      begin
//        ss:=ss+fieldbyname('类'+inttostr(i+1)).value;
//      end;
//      Fields[18].Value:=ss;
//      //人均
//      Fields[19].Value:=StrToCurr(formatfloat('0.00',(Fields[18].asfloat/Fields[7].asfloat)));
//
//      sn:=Fields[19].Value;
//      if (length(TLs)>0) and (sn>0) then // 计算等级
//      begin
//        for i:=0 to length(tls)-1 do
//        begin
//          Fields[20].Value:='无'; //防止空
//          if (sn>=tls[i].mini) and (sn<=tls[i].maxi) then
//          begin
//            Fields[20].Value:=tls[i].name;
//            break;
//          end;
//        end;
//      end
//      else Fields[20].Value:='无';
//
//      post;
//      tado.Next;
//    end;
//    First;
//  end;
end;

Delphi 6中,ClientDataSet的AddIndex方法用于手动添加索引。下面是使用AddIndex方法的示例代码: ``` // 假设有一个名为cds 的ClientDataSet对象 // 开始事务 cds.Active := True; cds.DisableControls; cds.IndexDefs.Update; try // 添加一个名为"IndexName"的索引 with cds.IndexDefs.AddIndexDef do begin Name := 'IndexName'; // 索引名称 Fields := 'FieldName1;FieldName2'; // 需要包含在索引中的字段名,多个字段之间使用分号分隔 Options := []; // 索引选项,可以根据需要设置选项,如Unique(唯一性)、Descending(降序)等 end; // 应用索引 cds.IndexName := 'IndexName'; // 打开数据集 cds.Open; // 在添加索引后,可以通过Locate或FindKey方法等进行定位和查找操作 finally // 结束事务 cds.EnableControls; end; ``` 上述代码首先启用ClientDataSet,然后禁用控件以提高效率。接着使用IndexDefs.AddIndexDef方法创建一个新的索引定义,并设置索引的名称、需要包含的字段以及其他选项。然后将创建的索引应用到ClientDataSet的IndexName属性中。最后打开数据集,并进行定位和查找操作。 需要注意的是,索引定义的添加和应用必须在数据集处于Active状态之前进行。另外,在使用AddIndex方法之前,建议先调用IndexDefs.Update方法更新索引定义,以确保索引定义与数据集的字段结构保持同步。 通过以上步骤,你可以在Delphi 6中使用ClientDataSet的AddIndex方法手动添加索引。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值