小问题! 大家来抢分!!(200分)

  • 主题发起人 主题发起人 karxios
  • 开始时间 开始时间
K

karxios

Unregistered / Unconfirmed
GUEST, unregistred user!
有如下结构的表
姓名 日期 考勤情况
张三 1月1日上午 出勤
张三 1月1日下午 出差
张三 1月2日上午 出差
李四 1月2日上午 迟到
................
.................
最后每月要求打印这样的出勤表
1日 2日 3日 4日 5日.....................31日
上午 下午 上午 下午 上午 下午
张三
李四
,.....,,,,,,,,,,
,,,,,,,,,,,,,,,,

怎么实现?
 
建议在Excel中用数据透视表完成,很简单的。
 
select 姓名, 考勤情况,日期 from table
group by 姓名
然后一条一条的判断。这是比较实用的方法了
 
由列在打印的时候改成行?
用视图~
搜一下,以前很多的!
 
但是还必须有上下午的时间限制!
若是select 姓名,考勤情况,日期 from table
只是显示的是几月几日,显示不到上下午的.是吧?[:(]
 
select 日期 再判断最后两位是上午还是下午,这样不是找出来了吗?
 
建议建立临时表:姓名,年,月,1,2,3,4…
然后用触发器自动填充,省事很多。
 
可參考:
select 姓名,
1日上午=(select a.考勤情況 from tablename a where a.姓名=tablename.姓名 and a.日期='1月1日上午'),
1日下午=(select a.考勤情況 from tablename a where a.姓名=tablename.姓名 and a.日期='1月1日下午'),
...
31日下午=(select a.考勤情況 from tablename a where a.姓名=tablename.姓名 and a.日期='1月31日下午')
from tablename group by 姓名
order by 姓名
 
好办法,但是二月怎么办?三月呢?
又来改SQL吗?
 
这跟本就不是一个简单问题!
技术上可以用decode()函数解决,只不过SQL写起来很长。。
 
把‘月、日、上下午’这个改为变量
 
不改怎么半,每个月的天数不同,二月还要分闰月
 
用决策支持组件。
 
数据库的日期最可恨,最好把year,month,day...等等分开。
便于sql查询。这是我的经验。
 
当然还要搞定名字的问题,以名字分组吧!呵呵!
L1...L31都放在组的明细中。
看到这里的问题就这样打上去了,情况可以考虑得不全面,你自己试一下吧。
不行的话继续计论,大原理是对的!^&^
 
呵呵,Value为String,数据类型的转换方面的你们比我熟!^&^
 
呵呵,三维表?我会用内存表来解决!
因用内存表用习惯了!^&^
maolu28的方法不错!
也可以用QuickReport的OnPrint事件来搞定,但报表比较复杂!
以姓名和日期排序,
NAME L01 L02.....L31
L01...L31为QRLabel
要注意L01...L31的TabOrder,一定要顺着。
分别设L01的TAG为1,L02的TAG为2.....L31的TAG为31
把L1..L31的OnPrint事件设为同一个OnPrint事件,
if <日期中的日>=TQrLabel(Sender).Tag then
begin
Value:=<考勤情况>;
<数据表>.Next;
end
else
Value:='';
这种方法原理上只能作用于一个月,多月的情况就要多想点办法了。

 
以前我有類似的問題,但是我經過和上司的分析,不用這种方法做了!
 
ReportMachine可以處理交叉表的問題!正在研究中。。。。。
 
用交叉表,很简单
http://reportmachine.delphibbs.com
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部