小弟在项目里遇到两个非常棘手的问题,在这里请教大家,求大家给我点思路,当然越具体越好,最好有一小段代码,问题是1、小弟在从单片机里通过串口读出数据,这个数据是以日期和时间做记录的,经过我程序的处理(把字符串拆分开)根据日期和时间存在数据库里。小弟是这样想的,做两个表
表1
id字段(不可重复的递增字段)        日期表2
id字段(与表1的id字段相对应,以表1的id为主键)        后面是详细的数据分类值(大概有17个字段)问题是在数据库空的时候,我直接把数据写入数据库里就可以了,但是用户在第一天读一次单片机里的数据,他不把数据清空(有可能用户要保留这个数据),第二天再读一次,这样在数据表里,会有日期和时间(数据重复)重复的现象发生。我自己想:
一、是我在每次写的时候,都先到表1里去检索是不是有日期重复的记录,如果有,把id字段的主键得到,在表2里删除id号相同的字段,再删表1里日期重复的字段。这样可以办到,但问题是当我的数据非常多,我就要判断很多次,效率会非常的低,感觉不太可行。二、我在读取出来的数据里,找到日期最小的,到表1里去比较,如果有相同的或是大于这个日期的,直接删表1里的数据,表2就不管了,以后读取直接根据表1的id号进行读取。但这样会造成大量的垃圾信息,因为主要是表2占的字段和数据多。
我不知道能不能根据表2的最小日期,把大于这个最小日期的其余日期的id号给检索出来,是全部都检索出来,再根据这些id号,统一删表2里的内容,就不用一个个判断了。但不知道怎么做。
大家有没有别的好办法?2、第二个问题就是报表的显示问题,因为我要显示表2的17个字段,字段非常多,一张A4纸纵向根本显示不全,横向也要65%而且是小字体才可以显示全。有没有什么好办法可以排列这些字段?我自己以前想如果分成一组显示这17个字段是可以一组一组显示下的,但用户看着太不方便了,所以不可行。3、水晶报表横向排表怎么排?请详细点说明,我看过海波的blog里的经典问题了,可是我没实现横向显示,请详细一点帮我说一下。另:以前我们的程序打印是用Excel表格来生成报表的,打印时还要用户去自己设置纸张大小啊,横向啊什么的,太麻烦了,所以现在想用水晶报表。还有,我用的是Vs.Net 2005。谢谢大家。

解决方案 »

  1.   

    livode(啊水)是这样的,我一个日期字段里可能包含多个时间记录的字段(而且多少个是不可确定的),也就是说一天里有多少个根据时间进行的记录,所以用一个表可能不行。
      

  2.   

    这个字段设置成datatime阿。这个字段包括日期,时间,精确到毫秒。即使是同一天有100个时间都没有问题。只要你不手动的修改系统时间,就不会出现重复的。
      

  3.   

    livode(啊水)我也想过把日期和时间放一起的,如果我放一起,是用日期和时间的这个datatime字段建立主键么?然后我把单片机里最小的读出来把大于这个时间的全删掉?
      

  4.   

    是啊,把这个datatime字段建立主键。为什么要删掉以前的数据?没有必要阿。不会有重复的
      

  5.   

    livode(啊水) 
    一定要删掉的,因为读取出来的数据是单片机存储器里的,如果用户第一天读一次,不删,第二天再读一次,因为存储器里的时间和第一天读出来的时间是完全一致的(时间),所以会有冲突的
      

  6.   

    如果,读取的速度过快,导致在毫秒级有重复的话,就再加一个id字段.
    id(主键)     时间字段              字段1                   字段2    字段3    字段4 
    自增       取存数时的系统时间  取从单片机中取出来的时间  取其他数据
      

  7.   

    livode(啊水) 但是我如果要读取,只用到单片机记录的时间就行。但是如果这样把日期和时间联合存储的话,我可以用sql语句来直接删除大于第二次读的最小日期的就可以了。但我是直接用日期键主键好还是再用一个id主键来做个标识好?但操作就直接按日期就行
      

  8.   

    用日期作主键就一定要保证没有重复,可显然达不到要求。要么用id主键来标示,要么用系统时间做主键。从设计上来看,如果你的程序的效率达不到每秒1000条记录以上,就没有必要增加id主键,用系统时间完全可以胜任。从扩展性方面考虑,你每天都要删处数据,这样没有办法做数据统计,所以不建议你删除数据。也可以把日期和时间联合起来做主键。
      

  9.   

    to livode(啊水) 我的数据最密集的时间间隔是1分钟一条数据,算下来一天会有1400多条的,但接收并不是每天都接收。
    我的另外两个问题也帮我看看,谢谢