FastReport交叉表问题 ( 积分: 100 )

  • 主题发起人 主题发起人 ljstar421
  • 开始时间 开始时间
L

ljstar421

Unregistered / Unconfirmed
GUEST, unregistred user!
哪位兄弟,会fastReport?
怎么才能把交叉表左上角的地方补起来?[:(]

(交叉表的左上角)
 
哪位兄弟,会fastReport?
怎么才能把交叉表左上角的地方补起来?[:(]

(交叉表的左上角)
 
似乎这就是FR用来做交叉报表不好的地方,你还不如,先在数据集中实现在行列转换,再以数据集的方式在FR中显示出来好了。
 
to app2001
但,那样列标题就要动态创建了,是吗?
 
是的哦,这里有个资料,你看看吧

标题 在Delphi中自己建立交叉表 选择自 szlifei 的 Blog
关键字 Delphi 交叉表
出处

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

function CreateTmptab(const AFieldDefs:TFieldDefs):TDataSet;
var
TempTable:TatClientDataSet;
begin
TempTable:=nil;
Result:=nil;
if AFieldDefs<>nil then
begin
try
TempTable:=TatClientDataSet.Create(Application);
TempTable.FieldDefs.Assign(AFieldDefs);
TempTable.CreateDataSet;
Result:=(TempTable as TDataSet);
Except
if TempTable<>nil 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).DataType<>ftWideString)
or (self.SouDataSet.FieldByName(ColField).DataType<>ftFixedChar)
or (self.SouDataSet.FieldByName(ColField).DataType<>ftMemo)
or (self.SouDataSet.FieldByName(ColField).DataType<>ftFmtMemo) then
begin
try
tmpstrs:=tstringlist.Create;
Vdataset:=SouDataSet;
Vdataset.First;
for i:=0 to Vdataset.RecordCount-1do
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-1do
begin
with tmpdataset.FieldDefsdo
begin
Add(tmpstrs.Strings,ftInteger,0,False);
end;
end;
tmpdataset.FieldDefs.Add('Sum',ftInteger,0,False);
DataSource:=tdatasource.Create(self);
DataSource.DataSet:=tmpdataset;
with DataSourcedo
begin
dataset:=Createtmptab(tmpdataset.FieldDefs);
dataset.Open;
end;
//建立临时表
Vdataset.First;
for i:=0 to Vdataset.RecordCount-1do
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-1do
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;

以上代码在D7和SQL Server 7.0/2000测试通过
 
to app2001:
谢谢你的回答!
但,(可能我没说明白我的意思)我说,动态创建指摸版内的列标题!
因为报表横向的列是随一个表的记录变化而变化的,而临时表在连接到fr模版时,fr模版中列标题怎么能跟着变化呢(我已经知道数据能随着变化)??
 
关注下,我还以外可以在角上自己放一个Memo呢,我以前好像是调整出来了,好久没弄了
 
FR里面就得动态生成了
 
TO APP2001:
我也试过,但始终调不到表格线的完全闭合!
你用过FRX(就是FASTREPORT3.0)吗?他能不能动态补那个空缺?
 
FR我只用到2.5,还是可以动态生成表格线的,就在于怎么慢慢调它了。3.0的就不晓得了
 
to app2001:
能不能给我一份,fr2.5的自动创建表格的例子?
还有能画斜线吗??
谢谢了(给了也算答了哈!!)!!
 
to app2001:
能不能给我一份,fr2.5的自动创建表格的例子?
还有能画斜线吗??
谢谢了(给了也算答了哈!!)!!
 
不能画斜线的,那个已很久了,现在一下找不到,我本想做一个示例给你的,但今天事太多,如果你等得的话,先等等吧
 
to app2001 :
先谢谢哈!!
 
你看看这个中不中,我的机子重装过,原来那玩意找不到了.
http://www.delphibbs.com/keylife/iblog_show.asp?xid=11760
作者?: zgl198171
标题?: 1、报表动态生成的类单元:
另外这个例子
http://35397.tomore.com/1/11176.html
资源名称 FastReport25動態邊接庫
就是这个了,你下下来看吧
 
to app2001
谢了,这会太忙!不能确定哈!
以后还请多多指教哈!!
 
to app2001
对不起,错了!我从新发个补分帖!!
 
后退
顶部