海波大哥在吗?一个水晶报表的难题,会得也可以来帮我,高分阿

liulangxin 2004-12-18 10:47:26
一个折线图,每天绘制一个点(已经解决),但是横坐标有很多日期,排的密密麻麻,看也看不清,想实现如下效果:每七天显示一个日期,但是搞了半天,只是3天显示一个日期
到底怎么样作阿
...全文
367 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
TT008 2005-06-09
  • 打赏
  • 举报
回复
study
ET2004 2005-01-18
  • 打赏
  • 举报
回复
方法二:在水晶报表创建一个日期型的参数字段,{?StartDate}。(应该在程序中显示水晶报表之前,把数据集的第一个日期作为参数传入水晶报表。)
设置 sDate 列的抑制显示公式为:
({数据集名.sDate} - {?StartDate}) Mod 7 <> 0
ET2004 2005-01-18
  • 打赏
  • 举报
回复
其实楼主的问题很简单,只是被搞得复杂了。

方法一:在你的强类型 DataSet 上添加一个允许为空的列 Show,Boolean 类型。前面的流程不变,只是在 Merge 完数据之后,做下面这个循环(假设数据集实例是 ds,表名是 Table):
int rows = ds.Table.Rows.Count;
for(int index=0; index<rows; index++)
{
if ((index % 7) ==0)
{
ds.Table.Rows[index]["Show"] = true;
}
}
在水晶报表中,设置 sDate 列的条件深化公式为:{ 表名.Show } == false;
ET2004 2005-01-18
  • 打赏
  • 举报
回复
说些题外话,首先是楼主的程序逻辑。

假设强类型的 DataSet 类名为 myDataSet,是否可以这样理解你的程序逻辑:
myDataSet ds = new (myDataSet);
// 填充一些数据...
DataTable table = getWholeTable(ds.Table, StartDate, EndDate);
ds.Merge(table);

在 getWholeTable 中,循环 StartDate 开始到 EndDate 结束,
如果传入的 DataTable 中某一天有数据,就把数据放到新表中,没有就把 0 放到新表中,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
最后返回这个新表。然后再 Merge 到强类型的数据集中。
注意加了“^^^^”符号的这一行,我觉得程序逻辑就有点问题,既然那一天已经有数据了,为什么还要复制到一个新表中,到最后了又把这个表 Merge 回来?不如只填充没有数据的日期,再 Merge 到原数据集中,完全相同的记录 Merge 有意义吗?


强类型 DataSet -> getWholeTable -> 强类型 DataSet.Merge(返回的 DataTable)

另外:“没有习惯”?除非你是做兼职或者自己当老板 -.- 不过这样你的产品永远都不用维护,因为每次维护都等于重新把软件写一遍。
liulangxin 2005-01-18
  • 打赏
  • 举报
回复
受教,楼上的给我很大的震撼,的确,我的程序有这些问题,平时不太注意
先谢一下
我试一下
liulangxin 2005-01-17
  • 打赏
  • 举报
回复
不好意思,没有习惯~
我自己明白的
其实这是一个datatable,只是后来合并到强类型的dataset,用merge,太急,没有说明白
这个表就是取一个开始日期,一个结束日期,然后根据select的结果(有可能某天没有数据)
现在在表中强行补上,(2004-05-08,0)的结果形式~
ET2004 2005-01-17
  • 打赏
  • 举报
回复
你从服务器资源直接托一个表放到表单上就明白是怎么回事了。

另外,你的方法实在看不太明白,怎么一个字的注释都没有的?以后维护怎么办啊?
ET2004 2005-01-17
  • 打赏
  • 举报
回复
-.-" 你这个不是强类型的 DataSet 吧,都直接使用 DataSet 和 DataTable 了。
强类型的 DataSet 会自动生成类文件的,可以用这个类直接创建对象,这个对象才是强类型的 DataSet 实例。而不是像你的方法一样,直接使用 DataSet 和 DataTable。

还有,字段不是包含在 DataSet 里面的,而是包含在 DataTable 里面,DataTable 属于 DataSet。
liulangxin 2005-01-12
  • 打赏
  • 举报
回复
汗,鄙人实在愚笨,先谢一下
其实我的目的很明确:
通过一个强类型的dataset将数据传到水晶报表
这个dataset包含两个字段: date 和数量
处理这个dataset的函数:(写的不好不要扁我)
public DataTable getWholeTable(DataTable dt,DateTime StartDate,DateTime EndDate)
{
DataTable fillDt=new DataTable("dateandnum");
fillDt.Columns.Add(new DataColumn("sDate",System.Type.GetType("System.DateTime")));
fillDt.Columns.Add(new DataColumn("sNumber",System.Type.GetType("System.Int32")));
DateTime nDate=StartDate;
int sCount=0;
while(true)
{
if(DateTime.Compare(nDate,EndDate)>0)
break;
DataRow dr=fillDt.NewRow();
dr["sDate"]=nDate;
if(dt.Rows.Count>0 && nDate.Equals((DateTime)dt.Rows[sCount][0]))
{
dr["sNumber"]=dt.Rows[sCount][1];
if(sCount<dt.Rows.Count-1)
sCount=sCount+1;
}
else
{
dr["sNumber"]=0;
}
fillDt.Rows.Add(dr);
nDate=nDate.AddDays(1);
}
return fillDt;
}
这张报表其实很简单,就是一个日期和一个数量,横坐标为日期,纵坐标为数量
但是有可能就是某些日子的测量的数量可能为0,但是也要求在图上画一个点
这样日期就有好多(比如,from09-09to10/08有31个日子),在横坐标上的日期有这样一个要求
,以一个礼拜为间隔显示一个日期,比如2004-05-05,下一个要显示的日期就是2004-05-12,但是中间
是有七个点的,
ET2004(ET2004) 说的,如果单纯显示数据的话,可以办到,但是现在问题是日期是横坐标上的值
我曾经试过编辑公式,但是好像不行,可能我水平不够,汗就一个字
诸位,帮帮我把
海峰 2005-01-12
  • 打赏
  • 举报
回复
楼主怎么就不会变通呢,你的日期型字段是不允许为空吗?我只是让你在ds中修改又没有要你修改到数据库,你怎么就不明的呢?????猴急!猴急!猴急!猴急!
在水晶报表中没有的数据就不会显示,按照日期分类与报表显示你就不可以分开处理吗?!!!!!
海峰 2005-01-11
  • 打赏
  • 举报
回复
用一段代码,把你不要显示的日期清空,这你应该会做吧!你只是在ds中操作不返回到数据库,对你的数据是不会有影响的!
海峰 2005-01-11
  • 打赏
  • 举报
回复
有一个简单的方法,在你为报表提供数值的ds中,把不要显示的日期删除掉!
ET2004 2005-01-11
  • 打赏
  • 举报
回复
既然楼主不会举一反三,so...no way...
liulangxin 2005-01-11
  • 打赏
  • 举报
回复
不行,首先日期型字段允许为空,
其次我的横坐标是按照日期分类的,如果没有日期的话,我想不出来会出现什么情况
liulangxin 2005-01-11
  • 打赏
  • 举报
回复
谢谢诸位,我试一下
zouzoujianjian 2005-01-10
  • 打赏
  • 举报
回复
只显示日,不显示年月。就直接在数据集里头设置好了,不就可以了
liulangxin 2005-01-10
  • 打赏
  • 举报
回复
看来没有希望了
ET2004 2005-01-07
  • 打赏
  • 举报
回复
深化公式:RecordNumber Mod 7 <> 1
liulangxin 2005-01-07
  • 打赏
  • 举报
回复
再顶一下,谁来帮帮我啊
ET2004 2005-01-07
  • 打赏
  • 举报
回复
我也只是提供一个思路。首先,我假设你的报表起始日期是通过日期类型的参数传递进来的,而具体的报表日期及数据是从数据库中读取的,那么,将每一天的日期与传递进来的日期参数相减,得到一个差值。用这个差值对7求模,就能得到一个周期性的值。举例如下:

起始日期:2005-1-1

日期........差值..结论
2005-1-1....0.....显示
2005-1-2....1.....不显示
2005-1-3....2.....不显示
2005-1-4....3.....不显示
2005-1-5....4.....不显示
2005-1-6....5.....不显示
2005-1-7....6.....不显示
2005-1-8....7.....显示

结论就是对7取模为 0 的才显示日期,而取模不为0的日期全部抑制显示。
所以文本对象的抑制显示公式是 offset Mod 7 <> 0 (上面用的是记录号,不太好用)
其中,offset 要自己对日期进行相减。
加载更多回复(18)

4,818

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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