起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 1886|回复: 6

透视数据集的说明

[复制链接]
发表于 2006-1-5 10:29:05 | 显示全部楼层 |阅读模式
1、透视后的,最大支持的单元格数为2000000000个

2、计算单元格的算法是:
(维A的值种类 + 1)*(维B的值种类 + 1)*(。。。)*项的个数

3、普通的机器超过百万就感觉慢了
回复

使用道具 举报

 楼主| 发表于 2006-5-17 08:52:43 | 显示全部楼层
透视数据集动态修改列的宽度,参考代码:

var
  I: Integer;
begin
  for I := 0 to DataGrid.ColumnCount - 1 do
  begin
    DataGrid.Columns.Width := 400;  设置列宽
  end;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-21 11:18:14 | 显示全部楼层

透视数据集的SQL和SQLFilter的使用

修改Sqlfilter,参考
TPivotDataSet(dsDataSet.dataSet).SQLFilter:='TSSJJLZ.SD = ''2''';
  TPivotDataSet(dsDataSet.dataSet).SQLFiltered:= true;

修改SQL,参考
dsDataSet.dataSet.close;
TPivotDataSet(dsDataSet.dataSet).DecisionDef.SQL :='SELECT * FROM TSSJJLZ  WHERE TSSJJLZ.SD = 2';
  dsDataSet.dataSet.open;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-4 15:42:21 | 显示全部楼层

修改透视数据集的列维转置后的显示名称

在数据集的 onCreateFieldName 中实现,参考代码
if AKind = TPivotFieldKind.pfkColField then  
ADisplayName  := StrUtils.LeftStr(ADisplayName,sysutils.StrLen(ADisplayName)-3);  //把后面三位删除,一个汉字是两位
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-4 15:47:22 | 显示全部楼层

通过透视数据集结合数据网格实现复杂表现

数据表结构如下
商品编号
商品名称
商品规格
型号
库存数量
库存金额
....

想实现报表的效果图如附件

实现步骤参考如下:
1、建一个透视数据集,设置,商品名称和商品编码为行维,仓库为列维,数量和金额为项。并选中列小计
2、根据这个透视数据集创建一个数据网格
3、选中数据网格的 ShowBands   和 ShowRowNumber 属性, 并取消 ShowIndicator 属性
4、在数据集的 AfterOpen 事件中,取动态创建bands,设置bands的caption,并控制透视数据集列维转制成字段的显示名称
根据 DataSetBrokerTSSJJ1.DataSet.FieldCount 创建bands,因为bands是字段的一半,
根据 DataSetBrokerTSSJJ1.DataSet.FieldCount 循环设置colunm 属于哪个bands
根据 TSQLDataSet(DataSetBrokerTSSJJ1.DataSet).BizFields.DisplayName 显示名称中是否有'_'这个,修改字段的显示名称
代码参考如下:
var
  i,ii: integer;
  s:String;
begin
  ii:= 0;
  for i:=0 to ((DataSetBrokerTSSJJ1.DataSet.FieldCount div 2)-1) do
  begin
    s:= TSQLDataSet(DataSetBrokerTSSJJ1.DataSet).BizFields[ii].DisplayName;
    if i<>0 then
    DataGrid.Bands.Add;
    if StringUtils.Pos('_',s)=0 then
       DataGrid.Bands.Items.Caption := '商品信息'
    else if StringUtils.Pos('*',s)=0 then
       DataGrid.Bands.Items.Caption := StrUtils.leftStr(TSQLDataSet(DataSetBrokerTSSJJ1.DataSet).BizFields[ii].DisplayName,6)
    else
       DataGrid.Bands.Items.Caption := '合计';
    ii:=ii+2;
  end;
  ii:=0;
  for i:=0 to  DataGrid.ColumnCount-1 do
  begin
    if (Trunc(i/2)<>0) then
       if (i mod 2 =0) then
          ii:=ii+1;
       DataGrid.Columns.BandIndex := ii;

  end;
  for i:=0 to  DataGrid.ColumnCount-1 do
  begin
    s:= TSQLDataSet(DataSetBrokerTSSJJ1.DataSet).BizFields.DisplayName;
    if StringUtils.Pos('_',s)>0 then
       TSQLDataSet(DataSetBrokerTSSJJ1.DataSet).BizFields.DisplayName:= StrUtils.rightStr(s,4)
  end;
end;

1.gif

50.26 KB, 下载次数: 735

回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-22 10:05:32 | 显示全部楼层

获取透视数据集的字段值

因为透视数据集是在打开的时候将列维自动转置为字段,所以它跟标准数据集获取字段值不一样,不能直接通过物理字,而是要通过转置后的字段来取

参考代码如下
var
  i : integer;
  lField :String;
begin
  for i:=0 to YWXX1.TSJWG1(DocView1.doc).DataGrid.ColumnCount-1 do
//循环一共生成多少个字段
  begin
    lField := YWXX1.TSJWG1(DocView1.doc).DataGrid.Columns.FieldName;
//或者字段的ID
    Memo1.Lines.add(lField+' - '+ dsDataSet.DataSet.FieldByName(lField).AsString+#13+#10);
end;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-28 10:55:50 | 显示全部楼层

代码控制决策列维、行维、项的展开和收缩

参考代码

var
  I: Integer;
  lMsg, lDimName: string;
  lDS: TDecisionSource;
begin
  lMsg := '';
  lDS := ADecisionBroker.DecisionSource;
  //遍历所有的维,nDims是维的总数
  for I := 0 to lDS.nDims - 1 do
  begin
    //根据“维绝对索引”获取维显示名称
    lDimName := lDS.GetDimensionName(I);
    //根据“维绝对索引”获取维的状态,并判断是否处于打开状态
    if (lDS.GetState(I) = TDimState.dmOpen) then
      lMsg := lMsg + 'Close: ' + lDimName + #13#10 else
      lMsg := lMsg + 'Open: ' + lDimName + #13#10;
    //根据“维索引”来切换维的状态
    lDS.ToggleDimIndex(lDS.GetGroup(I), lDS.GetIndex(I, False), False);
  end;
  jsDialogs.ShowMsg(lMsg, '');
end;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2024-3-29 15:32 , Processed in 0.047882 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表