超难的中国式树型报表, 100分求解决方案(在Web页面上显示出来)
超难的中国式树型报表, 求解决方案(在Web页面上显示出来)因为查询条件就是WEB页面上的选择(chk)框.实际上就是动态组合查询报表
1、第一种统计查询(按年查询)的时候 ,如下显示
年查询 送审项目数 送审金额 完成项目数 完成送审金额
2007年 10 80 6 45
合计 10 80 6 45
2、第二种统计查询(按年及其级别查询)
年查询 级别查询 送审项目数 送审金额 完成项目数 完成送审金额
---------------------------------------------------------------------------
|
|A 6 50 4 30
2007年|---------------------------------------------------------------------------
|B 4 30 2 15
|合计 10 80 6 45
---------------------------------------------------------------------------
3、第三种统计查询(按年,级别,分类查询)
3、第三种统计查询(按年,级别,分类查询)
年查询 级别查询 分类查询 送审项目数 送审金额 完成项目数 完成送审金额
---------------------------------------------------------------------------
|
| 分类一 3 25 2 15
| A 分类二 2 15 1 10
| 分类三 1 10 1 5
|
| 合计 6 50 4 30
2007年---------------------------------------------------------------------------
|
| 分类一 2 15 1 10
| B 分类二 1 5 1 5
| 分类三 1 10 0 0
|
| 合计 4 30 2 15
|
| 合计 10 80 6 45
---------------------------------------------------------------------------
。。。。还有各种查询,以此类推,根据用户的选择继续分组查询下次,相应的单元格也要补上
以上是用户选择第一种方式,第二种方式,第三种方式查询的结果。
其中:送审项目数为SJZB中的数据
完成送审项目数为WCZB中的数据 --------------------编程问答-------------------- 大虾们,希望你们帮帮忙 --------------------编程问答-------------------- 因为查询条件就是WEB页面上的选择(chk)框.实际上就是动态组合查询报表
++++++++++++++++++++++++++++++++++
没看出哪特别,最笨的方法,拼接选取值 传入逻辑处理 传值 返回值 ~~细节自己去想 --------------------编程问答-------------------- 就是查询方式,比如说按年,按分类等查询啊。 --------------------编程问答-------------------- select hj=null,a.SSXMS,a.SSZJ,b.WCXMS,b.WCSSZJ,b.WCSDZJ,b.WCSJE,b.WCSJL,c.WWCXMS
from
(select count(*) SSXMS,isnull(sum(ASSZJ),0) SSZJ from allinfo where sjbh=sjbh)a,
(select count(*) WCXMS,isnull(sum(Tsszj),0) WCSSZJ,isnull(sum(Tsdzj),0) WCSDZJ,isnull(sum(Tsje),0) WCSJE,
isnull(sum(Tsje)/sum(Tsszj),0) WCSJL FROM Allcomplete where sjbh=sjbh)b,
(select count(*) WWCXMS from allnone where sjbh=sjbh)c
以上的数据就是根据这种条件筛选出来的 --------------------编程问答-------------------- 如果你是要 分组式 的显示效果,用GridView,DataList嵌套就可以实现
如果你是想知道,如果设计业务逻辑,你在四楼的内容已经有一定的雏形,但还有问题~
别的,我真不知道你哪不明白? --------------------编程问答-------------------- 是啊,我知道要分组啊,问题是像这些前面添加的列你知道什么时候添加,添加几列?肯定不懂嘛 --------------------编程问答-------------------- 其实因为这个项目,我开了好几个CSDN,但是就没有人答,我又结帐了,重新问。就是希望大家帮忙 --------------------编程问答-------------------- ASP.NET2.0中给GridView动态添加模板列并自动绑定数据
http://www.cnblogs.com/lmarsy/archive/2007/03/27/564634.html
--------------------编程问答-------------------- 晕哦。还是搞不定。有没有人说一下中。开了那么多,既然一个高手都没有。晕。CSDN难道是假的吗 --------------------编程问答-------------------- 用Repeater控件,table套table的方式。根据选择的分组条件,动态的嵌套table。将没种分组的数据绑定到对应的table中。 --------------------编程问答-------------------- 行列合并.
http://blog.csdn.net/nicewon/archive/2007/08/31/1767185.aspx --------------------编程问答-------------------- 问题是你怎么样动态Table --------------------编程问答-------------------- 关注 --------------------编程问答-------------------- 晕死了,我实在是做不出来了。 --------------------编程问答-------------------- 考虑一下第3中情况,如果先忽略合计,然后每行都加上冗余数据,那么输出看起来就是这样:
年查询 级别查询 分类查询 送审项目数 送审金额 完成项目数 完成送审金额
---------------------------------------------------------------------------
2007年¦ A 分类一 3 25 2 15
2007年¦ A 分类二 2 15 1 10
2007年¦ A 分类三 1 10 1 5
---------------------------------------------------------------------------
2007年¦ B 分类一 2 15 1 10
2007年¦ B 分类二 1 5 1 5
2007年¦ B 分类三 1 10 0 0
这个不就是查询出来的原始数据?
那么现在考虑在什么位置插入合计行. 这里有3层,那么当第1,2层数据改变时应该插入合计.比如 A变到了B,2007变到了2008 or 结束.
要能够检查到这些变化就要记录最后一次处理的行的数据, 比如用last[0]保存年,last[1]保存级别.同时用个变量level记录层数,这里,level=3
伪码:
while (i < level-1) last[i] = ""; // -1是因为最后一层不用合计
对每行数据
{
// 检查哪层数据出了变化
changedColumn = -1;
while(j<level-1)
{
if(last[j]!=currentRow.columns[j]) changedColumn = j;
break;
}
if(数据有变化, changedColumn>=0)
{
计算合计;
输出合计;
保存/重置合计;
}
输出一行数据 (输出这行数据的时候可以根据changedColumn来去除冗余的'2007,A'这样的数据);
保存currentRow到last数组 (last[0]=2007,last[1]=A);
}
思路是这样,懒的写代码了,你参考下吧. 所谓输出一行数据就是write出一些html tag. --------------------编程问答-------------------- 没有写过这些的。能有些代码吗?时间紧。没有时间去研究 --------------------编程问答-------------------- C#
<%@ Page Language="C#" AutoEventWireup="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
ICollection CreateDataSource()
{
System.Data.DataTable dt = new System.Data.DataTable();
System.Data.DataRow dr;
dt.Columns.Add(new System.Data.DataColumn("学生姓名", typeof(System.String)));
dt.Columns.Add(new System.Data.DataColumn("语文", typeof(System.Decimal)));
dt.Columns.Add(new System.Data.DataColumn("数学", typeof(System.Decimal)));
dt.Columns.Add(new System.Data.DataColumn("英语", typeof(System.Decimal)));
for (int i = 0; i < 8; i++)
{
System.Random rd = new System.Random(Environment.TickCount * i); ;
dr = dt.NewRow();
dr[0] = "学生" + i.ToString();
dr[1] = System.Math.Round(rd.NextDouble() * 100, 2);
dr[2] = System.Math.Round(rd.NextDouble() * 100, 2);
dr[3] = System.Math.Round(rd.NextDouble() * 100, 2);
dt.Rows.Add(dr);
}
System.Data.DataView dv = new System.Data.DataView(dt);
return dv;
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
GridView1.BorderColor = System.Drawing.Color.DarkOrange;
GridView1.DataSource = CreateDataSource();
GridView1.DataBind();
}
}
protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Header)
{
GridViewRow rowHeader = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Normal);
rowHeader.BackColor = System.Drawing.Color.White;
rowHeader.Font.Bold = true;
TableCellCollection cells = e.Row.Cells;
TableCell headerCell = new TableCell();
headerCell.Text = "";
rowHeader.Cells.Add(headerCell);
headerCell = new TableCell();
headerCell.Text = "学生成绩";
headerCell.ColumnSpan = cells.Count - 1;
headerCell.HorizontalAlign = HorizontalAlign.Center;
rowHeader.Cells.Add(headerCell);
rowHeader.Visible = true;
GridView1.Controls[0].Controls.AddAt(0, rowHeader);
}
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
e.Row.Attributes.Add("style", "background:#FFF");
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>合并 GridView 的表头单元格</title>
</head>
<body>
<form id="Form1" runat="server">
<asp:GridView ID="GridView1" runat="server" CellSpacing="1" CellPadding="3"
Font-Size="12px" Width="300px" BackColor="orange" BorderWidth="0"
OnRowDataBound="GridView1_RowDataBound" OnRowCreated="GridView1_RowCreated">
</asp:GridView>
</form>
</body>
</html>
--------------------编程问答-------------------- 代码??? --------------------编程问答-------------------- 兄弟,你根据自己的需求进行改动吧!!!里面的数据都是我在页面创建的,不需要数据库!!! --------------------编程问答-------------------- 是的, --------------------编程问答--------------------
这事另外一种实现方式,你看那种适合你!!!
数据也是自己创建的Table
<%@ Page Language="C#" AutoEventWireup="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
// 计算数据,完全可以从数据库取得
ICollection CreateDataSource( )
{
System.Data.DataTable dt = new System.Data.DataTable();
System.Data.DataRow dr;
dt.Columns.Add(new System.Data.DataColumn("学生班级", typeof(System.String)));
dt.Columns.Add(new System.Data.DataColumn("学生姓名", typeof(System.String)));
dt.Columns.Add(new System.Data.DataColumn("语文", typeof(System.Decimal)));
dt.Columns.Add(new System.Data.DataColumn("数学", typeof(System.Decimal)));
dt.Columns.Add(new System.Data.DataColumn("英语", typeof(System.Decimal)));
dt.Columns.Add(new System.Data.DataColumn("计算机", typeof(System.Decimal)));
for (int i = 0; i < 8; i++)
{
System.Random rd = new System.Random(Environment.TickCount * i); ;
dr = dt.NewRow();
dr[0] = "班级" + i.ToString();
dr[1] = "学生" + i.ToString();
dr[2] = System.Math.Round(rd.NextDouble() * 100, 2);
dr[3] = System.Math.Round(rd.NextDouble() * 100, 2);
dr[4] = System.Math.Round(rd.NextDouble() * 100, 2);
dr[5] = System.Math.Round(rd.NextDouble() * 100, 2);
dt.Rows.Add(dr);
}
System.Data.DataView dv = new System.Data.DataView(dt);
return dv;
}
protected void Page_Load( object sender, EventArgs e )
{
if (!IsPostBack)
{
GridView1.BorderColor = System.Drawing.Color.DarkOrange;
GridView1.DataSource = CreateDataSource();
GridView1.DataBind();
}
}
protected void GridView1_RowCreated( object sender, GridViewRowEventArgs e )
{
if (e.Row.RowType == DataControlRowType.Header)
{
//创建一个GridViewRow,相当于表格的 TR 一行
GridViewRow rowHeader = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Normal);
string HeaderBackColor = "#EDEDED";
rowHeader.BackColor = System.Drawing.ColorTranslator.FromHtml(HeaderBackColor);
//实现确定要显示的表头样式,也可以通过计算生成
// <tr>
// <td rowspan='2'>关键单元格</td>
// <td colspan='2'>表头文字</td>
// <td colspan='2'>表头文字</td>
// <td>表头文字</td>
// </tr>
// <tr bgcolor='#FFF'>
// <td colspan='2'>表头文字</td>
// <td rowspan='2'>表头文字</td>
// <td colspan='2'>表头文字</td>
// </tr>
// <tr bgcolor='#FFF'>
// <td>表头文字</td>
// <td>表头文字</td>
// <td>表头文字</td>
// <td>表头文字</td>
// <td>表头文字</td>";
// </tr>
// 上面的样式可以设置斜线
Literal newCells = new Literal();
newCells.Text = @"表头文字1</th>
<th colspan='2'>表头文字2</th>
<th colspan='2'>表头文字3</th>
<th>表头文字4</th>
</tr>
<tr bgcolor='" + HeaderBackColor + "'>";
newCells.Text += @"
<th colspan='2'>表头文字5</th>
<th rowspan='2'>表头文字6</th>
<th colspan='2'>表头文字7</th>
</tr>
<tr bgcolor='" + HeaderBackColor + "'>";
newCells.Text += @"
<th>表头文字8</th>
<th>表头文字9</th>
<th>表头文字10</th>
<th>表头文字11</th>
<th>表头文字12";
TableCellCollection cells = e.Row.Cells;
TableHeaderCell headerCell = new TableHeaderCell();
//下面的属性设置与 <td rowspan='2'>关键单元格</td> 要一致
headerCell.RowSpan = 2;
headerCell.Controls.Add(newCells);
rowHeader.Cells.Add(headerCell);
rowHeader.Cells.Add(headerCell);
rowHeader.Visible = true;
//添加到 GridView1
GridView1.Controls[0].Controls.AddAt(0, rowHeader);
}
}
protected void GridView1_RowDataBound( object sender, GridViewRowEventArgs e )
{
if (e.Row.RowType == DataControlRowType.Header)
{
e.Row.Attributes.Add("style", "background:#9999FF;color:#FFFFFF;font-size:14px");
}
else
{
e.Row.Attributes.Add("style", "background:#FFF");
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>为 GridView 添加多层表头</title>
</head>
<body>
<form id="Form1" runat="server">
<asp:GridView ID="GridView1" runat="server" CellSpacing="1" CellPadding="3" Font-Size="12px"
Width="600px" BackColor="#000000" BorderWidth="0" OnRowDataBound="GridView1_RowDataBound"
OnRowCreated="GridView1_RowCreated">
</asp:GridView>
</form>
</body>
</html>
--------------------编程问答-------------------- 实在不行,使用REPORT SERVICES,每个空格都是一个查询语句即可。 --------------------编程问答-------------------- 我看不到图片 --------------------编程问答-------------------- 不对,我要求横也要相应的添加行 --------------------编程问答-------------------- 你的理解就是前面那个2007要单元格合并. A,B也再继续合并,这点难度
我原来做的是根据参数读取数据后,看有多少行数据,合并单元格的形式直接构造自己的table. --------------------编程问答-------------------- 是啊。这些都要的。 --------------------编程问答-------------------- 25楼,你的结果是怎么样的呢?还有大家帮忙有那么难吗 --------------------编程问答-------------------- 话说要是完全写死不得 累死啊....到时候业务改一点...哭去吧...
楼主可以找找那种完全自定义的 报表插件....话说我也在找免费的...话说找到了互相分享一下啊 --------------------编程问答-------------------- http://www.cnblogs.com/waxdoll/archive/2006/07/30/463114.html
或许有楼主需要的答案
补充:.NET技术 , ASP.NET