|
楼主 |
发表于 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, 下载次数: 783
|