这样的水晶报表程序如何实现?

lqhly 2008-11-13 04:53:22
系统vs2005,sql server 2000.
我建了一个水晶报表,是一个供应商清单的,主要字段为:供应商的产品类别(cplbmc),供应商名称(PropertyName),按cplb对供应商进行分组,这是很简单的,报表显示都正常,即把所有的供应商按产品类别都分组显示出来了。但我不光要显示全部的供应商,还要按产品类别分别显示,为此我在网页中加了个产品类别DropDownList控件,报表中设置参数为cpid,这样坏了,当打开网页时只能显示DropDownList中的第一个产品类别,而不是全部的产品类别了。前台主要代码为:
(1)产品类别
<asp:DropDownList ID="CplbList" runat="server" DataTextField="Cplbmc"
DataValueField="CplbId" Width="150px" >
</asp:DropDownList></td>
(2)报表及参数
<CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" AutoDataBind="True"
Height="1129px" ReportSourceID="CrystalReportSourceliuliu" Width="904px" />
<CR:CrystalReportSource ID="CrystalReportSource1" runat="server">
<Report FileName="CrystalReport_Gysmd.rpt">
<Parameters>
<CR:ControlParameter ControlID="CplbList" ConvertEmptyStringToNull="False" DefaultValue=""
Name="CpId" PropertyName="SelectedValue" ReportName="" />
</Parameters>
</Report>
</CR:CrystalReportSource>
(3)后台主要是先绑定产品类别的DropDownList
protected void Page_Load(object sender,EventArgs e)
{
CplbList.DataSource = bc.GetDataSet("select * from Cplb ", "Cplb");
CplbList.DataBind();
}
求助大侠:“如何先显示全部,然后选产品分类时再显示相应的分类”。
...全文
197 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
y842085833 2009-05-30
  • 打赏
  • 举报
回复
实用
jietuan 2008-11-14
  • 打赏
  • 举报
回复
你用后期bind ,首先根据选择好的 条件把正确的结果放到datatable里面,然后把datatable 作为报表的数据源!
阿泰 2008-11-14
  • 打赏
  • 举报
回复
哦,主要是这样的。

select top 1 '全部' as 字段a from Cplb union select 字段a from Cplb

这句,你这面应该是放了两个字段吧?一个是产品类别名称,一个是产品类别编号。然后绑定到dropdownlist上。

select top 1 '全部' as 字段a,-1 as 字段 b from Cplb union select 字段a,字段a from Cplb

公式应该是这个样子,不过你现在那个{?cpid}=0是怎么来的?原来库里就有?

if {?cpid}=-1 then
true
else
(
if {?cpid}=0 then
{Providers.CplbId} like "%"
else
{Providers.CplbId}={?cpid}
)
lqhly 2008-11-14
  • 打赏
  • 举报
回复
谢谢,终于解决了。要注意3点:
1.现在数据库的Cplb表中增加一个记录(cplbId=1,cplbmc='全部')
2.水晶报表中的条件为:
if {?cpid}=0 then
{Providers.CplbId} <> 1
else
{Providers.CplbId}={?cpid}
3.水晶报表参数字段中:
变量Cpid的“允许多个值”打√,
再选“离散和区域值”
lqhly 2008-11-14
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 babyt 的回复:]
if {?cpid}="全部" then
true
else
(
if {?cpid}=0 then
{Providers.CplbId} like "%"
else
{Providers.CplbId}={?cpid}
)
[/Quote]
================================
我试了,还是不对,if {?cpid}="全部" then 中的{?cpid}是数字型,不是字符串,保存时提示我为数值
阿泰 2008-11-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xiaoK 的回复:]
在你绑定DropDownList 后在DropDownList 中加入一个新listitem 如

this.drp.Items.Insert(0, new ListItem("-全部-", "0"));

[/Quote]

类似于这样,在你的DropList里增加一个“全部”的项,至于这个项的值,假设为0.
因为报表里用了记录选择公式,所以你可能需要编辑公式

你原来的公式应该为:

{字段}=cpid参数

现在更改下这个公式为

if cpid参数=0 then
true
else
{字段}=cpid参数
阿泰 2008-11-14
  • 打赏
  • 举报
回复
if {?cpid}="全部" then
true
else
(
if {?cpid}=0 then
{Providers.CplbId} like "%"
else
{Providers.CplbId}={?cpid}
)
lqhly 2008-11-14
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 babyt 的回复:]
。。
写错了
这样
CplbList.DataSource = bc.GetDataSet("select top 1 '全部' as 字段a from Cplb union select 字段a from Cplb ", "Cplb");
CplbList.DataBind();
[/Quote]
---------------------
你太厉害了,用此方法终于加进去了。但是往下再怎么设置?我设置了一下不行,太复杂了。
我在报表里是这样设的:
if {?cpid}=0 then
{Providers.CplbId} like "%"
else
{Providers.CplbId}={?cpid}
关键是为true时,{Providers.CplbId} like "%" 设置的不对,这里怎么设?


阿泰 2008-11-14
  • 打赏
  • 举报
回复
。。
写错了
这样
CplbList.DataSource = bc.GetDataSet("select top 1 '全部' as 字段a from Cplb union select 字段a from Cplb ", "Cplb");
CplbList.DataBind();
阿泰 2008-11-14
  • 打赏
  • 举报
回复
简单点,可以这样


字段a换成你绑定的那个字段

CplbList.DataSource = bc.GetDataSet("select top 1 '全部' as 字段a union select 字段a from Cplb ", "Cplb");
CplbList.DataBind();
lqhly 2008-11-14
  • 打赏
  • 举报
回复
我也试了,单独this.CplbList.Items.Insert (0,"全部");插是可以的,但加上绑定就不可以了,只是绑定的数据.
我的语句是:
protected void Page_Init(object sender, EventArgs e)
{
CplbList.DataSource = bc.GetDataSet("select * from Cplb ", "Cplb");
CplbList.DataBind();
this.CplbList.Items.Insert(0, "全部");
}
应该也没错误的。
阿泰 2008-11-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 babyt 的回复:]
if {?cpid}="全部" then
true
else
{你进行过滤的那个字段}=cpid参数
[/Quote]


if {?cpid}="全部" then
true
else
{你进行过滤的那个字段}={?cpid}
阿泰 2008-11-14
  • 打赏
  • 举报
回复
实际测试了下,以下方法已经通过:

this.drp.xxx drp只是个示例,换成你的dropdownlist名称CplbList即可
1:cs代码,增加如下


protected void Page_Init(object sender, EventArgs e)
{

this.CplbList.Items.Insert (0,"全部");

}

如果init已经存在,那么就把this.CplbList.Items.Insert (0,"全部");加进去

2:修改报表模板

在模板上点右键,报表--选择专家,这个界面上应该显示的是CpId ={?cpid}
点击这个界面上的显示“显示公式”按钮,点“公式编辑器”按钮
输入以下公式

if {?cpid}="全部" then
true
else
{你进行过滤的那个字段}=cpid参数

即可

保存模板。
重新执行。
lqhly 2008-11-14
  • 打赏
  • 举报
回复
在语句this.drp.Items.Insert(0, new ListItem("-全部-", "0")); 中
drp是个什么东西,为什么提示我:并不包含“drp”的定义,而我用
CplbList.Items.Insert(0, new ListItem("-全部-", "0"));“全部”也没插进去
xiao_fan85 2008-11-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 babyt 的回复:]
引用 1 楼 xiaoK 的回复:
在你绑定DropDownList 后在DropDownList 中加入一个新listitem 如

this.drp.Items.Insert(0, new ListItem("-全部-", "0"));



类似于这样,在你的DropList里增加一个“全部”的项,至于这个项的值,假设为0.
因为报表里用了记录选择公式,所以你可能需要编辑公式

你原来的公式应该为:

{字段}=cpid参数

现在更改下这个公式为

if cpid参数=0 then
true
else
{字段}=cpid参数
[/Quote]
我觉得这样是可行的
tanktang811010 2008-11-14
  • 打赏
  • 举报
回复
支持6楼的
lqhly 2008-11-14
  • 打赏
  • 举报
回复
试了,但出错了,DataValueField="CplbId",该值不能为负数,错误提示为:
System.ArgumentOutOfRangeException: 插入索引已超出范围。必须为非负值,并且必须小于或等于大小。
llsen 2008-11-14
  • 打赏
  • 举报
回复
CplbList.Items.Insert(-1, new ListItem("-全部-", "0"));

试试

选全部时候
筛选不加条件就好
lqhly 2008-11-14
  • 打赏
  • 举报
回复
我在绑定CplbList后,加入语句
CplbList.Items.Insert(0, new ListItem("-全部-", "0"));
为什么在DropDownList中并没有“全部”这项?
lqhly 2008-11-13
  • 打赏
  • 举报
回复
没高手?
加载更多回复(3)

111,119

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧