主题:  讨论:有什么高招

蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#12006/5/24 15:04:14
最近在做个系统, 是单位支出费用统计系统,统计查询如下结构:

交通费用支出    7200    ┈ 统计数
├差旅费用        5200    ┈ 统计数
│├市内        1500    ┈ 查询数
│├省内        2500    ┈ 查询数
│└国内        1200    ┈ 查询数
└交通津贴        2000    ┈ 查询数
办公费用支出    5500    ┈ 统计数
├通讯费        2000    ┈ 查询数
└办公用品        3500    ┈ 统计数
 ├文具        1500    ┈ 查询数
 └办公用纸    2000    ┈ 查询数

从上结构看,是一树形分支结构,即每一大类包含小类,最末端的节点是实际输入数据或可以直接查询的数据存放项。
父类:包含各子节点,没有直接数据,但要求统计各子节点的数据,也即父节点是各子节点数据的总和。

输入方法:
是按逐项输入的,如输入:办公用纸--300--(2006-5-18支出时间),按确定,这300元是随时可以查询到,并可修改。

难点:
(1)该报表结构不是固定的,各年度的报出项可能是要求定制。
(2)要实现灵活的查询,即按月、年、和指定日期内的统计数据,所以比较难考虑生成数据表的方法
(3)父节点的数据是无法直接查询的,但通过查询子节点(末端)的数据,统计生成。

难度比较大些,各位有什么高招,或有什么想法可不必顾忌,一句二句都行。

编辑历史:[此帖最近一次被 蓝鲸 编辑过(编辑时间:2006-05-24 15:32:23)]

非常大鱼

studyASP

职务:普通成员
等级:1
金币:0.0
发贴:44
#22006/5/24 15:10:32
这个不是和论坛分坛一样的吗?



studyASP

职务:普通成员
等级:1
金币:0.0
发贴:44
#32006/5/24 15:13:30
哦,需要实现多次分坛。
无限级分坛我也还没考虑过
不过动网论坛实现了这个
可以参考研究一下



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#42006/5/24 15:13:58
studyASP在上个帖子中说
引用:
这个不是和论坛分坛一样的吗?


有点类似分论坛结构,也即树形结构,
不过需要有统计功能


非常大鱼

蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#52006/5/24 15:15:12
另外定制的可暂时不要考虑,难度比较大些


非常大鱼

studyASP

职务:普通成员
等级:1
金币:0.0
发贴:44
#62006/5/24 15:25:03
哦 哦哦
暂时没招
先花点时间考虑



缺缺

职务:管理员
等级:8
金币:41.0
发贴:9620
#72006/5/24 15:41:56
我凭空想象了一下,或者我没有能够理解吧.感觉不会有什么问题.
一个树行结构,录入应该没有什么难度,查询似乎也不是什么问题.不知道所说的灵活查询是灵活到什么程度

比如查询两个不是一个级别的节点的总和?



Tassadar

职务:普通成员
等级:1
金币:-1.0
发贴:38
#82006/5/24 16:24:21
问个问题,ASP。NET有自带的树控件么
我上次用的是第三方控件,特别不稳定。
如果没有有什么办法实现树形列表。



studyASP

职务:普通成员
等级:1
金币:0.0
发贴:44
#92006/5/24 16:52:38
我有这样的办法,不过我自己都觉得不够满意,一定还有更好的办法。
希望通过我这笨拙的办法能让你想到更好的思路,但一定要贴出来哦!我暂时也还想不到更加灵活的查询办法。

数据库这样设计
表名:table
id 自动编号
idno 数字 和上一级id关联
item 文本 所有项目
money 货币



假如现在存在的数据
id idno item money
1 0 交通费用支出 7200
2 0 办公费用支出 5500
3 1 差旅费用 5200
4 1 交通津贴 2000
5 2 通讯费 2000
6 2 办公用品 3500
7 3 市内 1500
8 3 省内 2500
9 3 国内 1200
10 6 文具 1500
11 6 办公用纸 2000


<%
'一次性打开全部记录
set rs = Server.CreateObject("ADODB.RecordSet")
sql = "select * from table"
rs.open sql,conn,3,2


for i=1 to 2 '无条件循环两次,让所有子节点全部更新,再更新父节点
if not rs.Bof and not rs.Eof then
do until rs.Eof=0
    set rs2 = Server.CreateObject("ADODB.RecordSet")
    sql="select"&rs("money")&" from table where idn0="&rs("id")
    rs2.open sql,conn,1,1 '每个id都检测一遍,没有选择性,这也是我自己觉得不满意的地方
    all=0'记录总资金
    if not rs2.Bof and not rs2.Eof then
    do until rs2.Eof
        all=all+rs("money")
        rs.movenext
    loop
    rs.addnew
    rs("money")=all
    rs.update
    rs2.close
    set rs2=nothing
    end if
    rs.movenext
loop
end if
next
rs.close
set rs=nothing
%>



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#102006/5/24 17:19:22
allinhands在上个帖子中说
引用:
我凭空想象了一下,或者我没有能够理解吧.感觉不会有什么问题.
一个树行结构,录入应该没有什么难度,查询似乎也不是什么问题.不知道所说的灵活查询是灵活到什么程度

比如查询两个不是一个级别的节点的总和?


如果结构正确了,可能查询也不算是问题,是一般的查询
比如2006-4-15至2006-5-8的各项支出小计、累计数等,就是要出一张统计报表,如顶楼的清单一样

我自己设计了一个结构,但由于这方面的讨论不是很多,而这种统计带有普遍性,并且稍有些难度,就先讨论一下。希望能有些高效的想法。


非常大鱼

蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#112006/5/24 17:20:56
Tassadar在上个帖子中说
引用:
问个问题,ASP。NET有自带的树控件么
我上次用的是第三方控件,特别不稳定。
如果没有有什么办法实现树形列表。



不是很有用,因为希望这个查询结构象一张报表一样,而不单单仅列出项目名称


非常大鱼

蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#122006/5/24 17:28:23
studyASP在上个帖子中说
引用:
我有这样的办法,不过我自己都觉得不够满意,一定还有更好的办法。
希望通过我这笨拙的办法能让你想到更好的思路,但一定要贴出来哦!我暂时也还想不到更加灵活的查询办法。

数据库这样设计
表名:table
id 自动编号
idno 数字 和上一级id关联
item 文本 所有项目
money 货币



假如现在存在的数据
id idno item money
1 0 交通费用支出 7200
2 0 办公费用支出 5500
3 1 差旅费用 5200
4 1 交通津贴 2000
5 2 通讯费 2000
6 2 办公用品 3500
7 3 市内 1500
8 3 省内 2500
9 3 国内 1200
10 6 文具 1500
11 6 办公用纸 2000


<%
'一次性打开全部记录
set rs = Server.CreateObject("ADODB.RecordSet"
sql = "select * from table"
rs.open sql,conn,3,2


for i=1 to 2 '无条件循环两次,让所有子节点全部更新,再更新父节点
if not rs.Bof and not rs.Eof then
do until rs.Eof=0
    set rs2 = Server.CreateObject("ADODB.RecordSet"
    sql="select"&rs("money"&" from table where idn0="&rs("id"
    rs2.open sql,conn,1,1 '每个id都检测一遍,没有选择性,这也是我自己觉得不满意的地方
    all=0'记录总资金
    if not rs2.Bof and not rs2.Eof then
    do until rs2.Eof
        all=all+rs("money"
        rs.movenext
    loop
    rs.addnew
    rs("money"=all
    rs.update
    rs2.close
    set rs2=nothing
    end if
    rs.movenext
loop
end if
next
rs.close
set rs=nothing
%>


表项结构和我想得差不多,用idno来自身链接
但是“交通费用支出”这项是不能输入的,这项应该是输入下属项后,统计出的结果,也就是只能输入最末端的项目(市内、省内)这些项目,有子类的项目不能直接输入。
可能我说得不是很明白
数据库结构上设置上与我原来想得差不多,谢谢

刚才的查询直接查询数据有

4 1 交通津贴 2000
5 2 通讯费 2000
7 3 市内 1500
8 3 省内 2500
9 3 国内 1200
10 6 文具 1500
11 6 办公用纸 2000
其它都不能用SQL查询出来


非常大鱼

studyASP

职务:普通成员
等级:1
金币:0.0
发贴:44
#132006/5/24 17:29:11
哦 ,晕了
没注意还需要按时间查询



studyASP

职务:普通成员
等级:1
金币:0.0
发贴:44
#142006/5/24 17:33:52
不用谢的
你帮助了这么多人的困难
我这点不算什么
而且 我都还没帮上你忙呢



yiliaocheng

职务:普通成员
等级:2
金币:2.0
发贴:631
#152006/5/24 17:43:46
我只说下查询方面。数据表设计成年、月、日三个字段,查询的时候可以按年月日查询,也可以按日期查询(要求日期输入格式为2006-05-01,然后分割成三个数字查询),还可以查询指定天数内等。