请帮我设计数据结构,好吗?(参与就有得分,给出完整方案(最佳)者另送300分) (300分)

  • 主题发起人 山木人
  • 开始时间

山木人

Unregistered / Unconfirmed
GUEST, unregistred user!
[?]辛苦大家[?]
| 项目号 | 项目名称 | 单位 | 单价 | 总数量 | 总金额 | 本期数量 | 本期金额 | 累计数量 | 累计金额 | 剩余数量 | 剩余金额 |
|--------|----------|------|------|--------|--------|----------|----------|----------|----------|----------|----------|
需要打印出如上表头的报表。
几点说明:
1>这是一个关于工程计量的,一般计量为一个月一次,本期为当月的数据。
2>累计数据是指从第一期累计至本期(包含本期)的和。
3>金额=数量*单价;剩余=总-累计。
4>项目基本上是固定的(暂时不做有变更考虑,当然这是不可能的)。
5>各项目号和项目名称是一一对应的,各计量期单价也是一样的。
6>如果有变更就牵涉到变更之前数量的单价和变更之后的单价不一样。
那么这个数据库怎么设计才便于统计出如上报表呢?
我正在写关于这个的论文,打算用TClientDataset做本地数据库存取。
希望你能给出完整解决方案(最好能包含数据字典),不胜感激!
我自己的思路:
每期为一个字段,当需要计量时,新增一个字段,所有数据在一个表中实现。如下:
| 项目号 | 项目名称 | 单位 | 单价 | 总数量 | 总金额 | 一期数量 | 一期金额 | 二期数量 | 二期金额 | 三期数量 | 三期金额 ....| 累计数量 | 累计金额 | 剩余数量 | 剩余金额 |
|--------|----------|------|------|--------|--------|----------|----------|----------|----------|----------|----------....|----------|----------|----------|----------|
可是在编程时,新增的字段TDBGrid显示不出,存储不了,计算不便....很多问题接重而来!
可见不可取,罢了.
所以来请大家帮助我,急急急!!4月底交论文。
山木人 3MRen@sohu.com 2/1'2002
 
学过foxbase吗?如果学过用Visual ForPro 吧!这些问题都迎刃而解了!
 
新增的字段TDBGrid显示得出,也能存储,有两种方式:1不定义tdbgrid的列名称,需要增加时关闭
数据库再重新打开即可;2动态加入tdbgrid的列,取出数据格式,在按照源数据格式改动。
其实你的数据格式不很合理,这涉及到一个交叉表和主从表的问题。看看以下的设计。
设置“项目信息”表
| 项目号 | 项目名称 | 单位 | 单价 | 总数量 | 总金额 |
|--------|----------|------|------|--------|--------|
设置“项目进度报表”
| 项目号 | 期号 | 数量 | 金额 |
|--------|------|------|------|
 
非常感谢t1122,暂不接受答案。
我也像你那样想过,可是增加了输入量,比如每月都有该项目,
那么每个月都得输入项目号、项目名称、单位.......
还有怎样计算,求累计值、和剩余值....
哦,告诉大家我对Delphi不是很懂,还请大家详细点。
 
t1122 说的有道理,你再好好想一下
 
使用主、细表吧
 
数据结构应该如t1122,实现没有问题啊,你可以使用cacheupdate更新,保存有
真实数据的列,或者每个月第一次生成所用项目的记录,数量付为0,那样输入和
统计都没有问题了
 
既然大家都这么说,我相信也是有一定道理的,谢谢大家。
但是,怎样解决如此这些问题呢:
项目非常多,期次也不少,输入的工作量相对增加了不少,
比如每月都有该项目,那么每个月都得输入项目号、项目名称、单位.......
还有怎样计算:求累计值、和剩余值....
 
数据结构应该是T1122所说的结构;
在设计数据结构时不应过多的考虑实现方式。应参照范式的要求,并尽量满足范式的要求;
关于实现问题,也不象你所说每次都要输入。有很多方法实现。
 
第三、至于求累计值、和剩余值的问题可建立相关视图来实现。
 
请你说清楚一点,
你提到的单位,单价每一期会变?是不是一个单位对应一个单价?
 
我知道这对于大家来说,是一个很简单的问题,可是我还是很懵懂,
所以还请大家更详细点,所以我还求完整解决方案呢。
别听我说是在写论文,其实我是一个函授生。
这都怪我平时不用功,现在工作上也忙,又到了交论文的时间,
因此就急中生这么回智,希望大家能帮我的忙,
我还一定会努力的,一起荡漾Delphi海洋!
附加说明:
项目(很多):就一个项目号,一个项目名称,一种单位,一种单价,一个总数量。
这是在没有变更的情况下,否则就会出现变更前后项目的单价或总数量发生了变化。
有兴趣的朋友,也可以发言,当然我暂时不作变更考虑。
 
to 山木人,
本来不想回答问题,忍不住再说两句。
>既然大家都这么说,我相信也是有一定道理的,谢谢大家。
>但是,怎样解决如此这些问题呢:
>项目非常多,期次也不少,输入的工作量相对增加了不少,
>比如每月都有该项目,那么每个月都得输入项目号、项目名称、单位.......
>还有怎样计算:求累计值、和剩余值....
我相信你的delphi没有问题,这些都是delphi的最基本的东西,关键是没有开发数据库的经验。
一般来讲,这种结构需要了解两个概念:主从表的概念和交叉表的概念。
主从表:是指两个表有主从关系,就是说主表的一个纪录中某一个字段可以对应从表中的几个纪录
得指定字段。针对你的问题,只有主表中的项目号存在的前提下,才有可以从表中的项目号存在;
主表的项目号修改后,从表中的项目号也必须随之修改。换句话说,项目号之用输入一次,以后
再从表中的项目号是从主表中选出来的,不用输入。你当然项目名称、单位都是不用输入的,都是
从主表中取出来的。
交叉表的概念:下面的就是交叉表:
| 项目号 | 期号 | 数量 | 金额 |
020204001 01 100 232
020204001 02 100 235
020204001 03 200 400
020204001 04 20 60
| 项目号 | 期号01数量 |期号02数量 |期号03数量 |期号04数量 |期号01金额 |期号02金额 |期号03金额 |期号04金额 |
020204001 100 100 200 20 232 235 400 60
如何能实现交叉表哪?很简单,一条语句就搞定了。
select 项目号 ,
sum(case 期号 when '01' 数量 ) as '期号01数量',
sum(case 期号 when '02' 数量 ) as '期号02数量',
sum(case 期号 when '03' 数量 ) as '期号03数量',
sum(case 期号 when '04' 数量 ) as '期号04数量',
sum(case 期号 when '01' 金额 ) as '期号01金额',
sum(case 期号 when '02' 金额 ) as '期号02金额',
sum(case 期号 when '03' 金额 ) as '期号03金额',
sum(case 期号 when '04' 金额 ) as '期号04金额',
from tablename
where 项目号 ='020204001'
至于如何在程序中灵活应用,就要看你的了。你总不至于让我给你做出来吧?
 
完全赞同t1122的观点。
 
该数据库建立三个表:1.项目表,字段:项目号;项目名称
2.单价表:项目号、价格、启用标志
3.期数表:项目号、期数、数量;
另外你的表头要准备基于价格调整打印只能以价格调为界线分定了。
 
这种简单得用EXCEL就能解决的问题值得讨论吗?
 
同意t1122
 
谢谢大家,特别感谢t1122!
 
顶部