在Delphi中自己建立交叉表

grwadcfzg

grwadcfzg

2016-02-19 18:25

想不想get新技能酷炫一下,今天图老师小编就跟大家分享个简单的在Delphi中自己建立交叉表教程,一起来看看吧!超容易上手~
 

  经常在CSDN上查阅名位大侠的文章,得益不少,近期因做一个项目,需要用到交叉表,报表上倒是有,但客户要求在Grid上能操作,没有办法,只好自己写了一段代码用于普通查询到交叉表的实现,不敢独享,故上传,望能抛砖引玉,请名位大侠不吝指教。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  
  function CreateTmptab(const AFieldDefs:TFieldDefs):TDataSet;
  var
  TempTable:TatClientDataSet;
  begin
  TempTable:=nil;
  Result:=nil;
  if AFieldDefsnil then
  begin
      try
          TempTable:=TatClientDataSet.Create(Application);
          TempTable.FieldDefs.Assign(AFieldDefs);
          TempTable.CreateDataSet;
          Result:=(TempTable as TDataSet);
      Except
      if TempTablenil then
          TempTable.Free;
          Result:=nil;
          raise;
      end
  end;
  end;
  {
  SouDataset源数据集
  ColField交叉表动态列字段
  RowField交叉表行字段
  DataField数据字段
  }
  function GenCrossTable(SouDataset:tdataset;ColField,RowField,DataField:string):tdataset;
  var
  Vdataset:tdataset;
  tmpdataset:tatclientdataset;
  DataSource:tdatasource;
  tmpstrs:tstrings;
  rowval,colval,dataval:string;
  i,j:integer;
  datatype:TFieldType;
  DataSize:integer;
  begin
  result:=nil;
  if (ColField='') or(RowField='')or(DataField='') then
    showmessage('All Field not be NULL!')
  else
  begin
    if (ColField=RowField)
        or(ColField=DataField)
        or(RowField=DataField) then
      showmessage('All Field not be Equ!')
    else
    if (self.SouDataSet.FieldByName(ColField).DataType=ftString)
      or (self.SouDataSet.FieldByName(ColField).DataTypeftWideString)
      or (self.SouDataSet.FieldByName(ColField).DataTypeftFixedChar)
      or (self.SouDataSet.FieldByName(ColField).DataTypeftMemo)
      or (self.SouDataSet.FieldByName(ColField).DataTypeftFmtMemo)  then
    begin
    try
      tmpstrs:=tstringlist.Create;
      Vdataset:=SouDataSet;
      Vdataset.First;
      for i:=0 to Vdataset.RecordCount-1 do
      begin
        if (varisnull(SouDataSet.FieldValues[colfield])=false) and (SouDataSet.FieldValues[colfield]'') then
          if tmpstrs.IndexOf(SouDataSet.FieldValues[colfield])=-1 then
          begin
            tmpstrs.Add(SouDataSet.FieldValues[colfield]);
          end;
        Vdataset.Next;
      end;
      //生成动态列标题
      tmpdataset:=TClientDataSet.Create(Self);
      tmpdataset.FieldDefs.Add(rowfield,ftstring,50,False);
      for i:=0 to tmpstrs.Count-1 do
      begin
        with tmpdataset.FieldDefs do
        begin
          Add(tmpstrs.Strings[i],ftInteger,0,False);
        end;
      end;
      tmpdataset.FieldDefs.Add('Sum',ftInteger,0,False);
      DataSource:=tdatasource.Create(self);
      DataSource.DataSet:=tmpdataset;
      with DataSource do
      begin
        dataset:=Createtmptab(tmpdataset.FieldDefs);
        dataset.Open;
      end;
      //建立临时表
      Vdataset.First;
      for i:=0 to Vdataset.RecordCount-1 do
      begin
        rowval:=SouDataSet.fieldbyname(rowfield).AsString;
        colval:=SouDataSet.fieldbyname(colfield).AsString;
        dataval:=SouDataSet.fieldbyname(datafield).AsString;
        if dataval='' then dataval:='0';
        if DataSource.DataSet.Locate(rowfield,rowval,[loPartialKey]) then
        begin
          DataSource.DataSet.Edit;
          DataSource.DataSet.FieldByName(colval).AsString:=dataval;
          DataSource.DataSet.FieldByName('Sum').AsInteger:=
            DataSource.DataSet.FieldByName('Sum').AsInteger+strtoint(dataval);
          DataSource.DataSet.Post;
        end
        else
        begin
          DataSource.DataSet.Append;
          DataSource.DataSet.FieldByName(rowfield).AsString:=rowval;
          for j:=1 to DataSource.DataSet.Fields.Count-1 do
            DataSource.DataSet.Fields[j].AsCurrency:=0;
          DataSource.DataSet.FieldByName(colval).AsString:=dataval;
          DataSource.DataSet.FieldByName('Sum').AsString:=dataval;
          DataSource.DataSet.Post;
        end;
        Vdataset.Next;
      end;
      result:=DataSource.DataSet;
      //生成交叉表数据集
      tmpstrs.Free;
    except
    end;
    end
    else
      showmessage('ColField Must be of Type String!') ;
  end;
  end;
  

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)
展开更多 50%)
分享

猜你喜欢

在Delphi中自己建立交叉表

编程语言 网络编程
在Delphi中自己建立交叉表

Delphi中API编程--在Delphi中调用API函数

Delphi
Delphi中API编程--在Delphi中调用API函数

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

在Delphi中定位文件位置

Delphi
在Delphi中定位文件位置

Eclipse中建立自己的JUnit测试

Java JAVA基础
Eclipse中建立自己的JUnit测试

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

在Word2024文档中插入书签交叉引用

word
在Word2024文档中插入书签交叉引用

在RHEL 3中建立软RAID

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
在RHEL 3中建立软RAID

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

用Delphi2005和DUnit搭建敏捷开发平台

用Delphi2005和DUnit搭建敏捷开发平台

Win7系统3种电源模式让笔记本更适应环境

Win7系统3种电源模式让笔记本更适应环境
下拉加载更多内容 ↓