如何动态设计数据库结构及报表
我现在帮一家公司开发一个项目,主要是做会员管理(会员信息包括会员的基本信息、车辆信息、车辆保险等等),现在这家公司要求能够做到会员信息可以动态调整(即删除或增加字段),同时在做报表的时候要求可灵活调整(现在的报表是会员的基本信息(会员表的同一行的不同列数据)+保险的险种(险种表的不同行的同一列数据))
我现在考虑的是如果数据库动态调整界面架构如何搭建?
同时报表这一块也有一定的困难,由于保险的险种是动态调整的(我现在设计的是用一张表格来保存险种信息),那么如何做到上述的要求?
谢谢!!!
问题点数:0、回复次数:43Top
1 楼BigAngell(学而不思则罔 思而不学则殆)回复于 2004-12-02 11:44:21 得分 0
动态创建列,在SQL里有相关的命令。
动态创建报表是有一定的难度,但只要细心做还是没问题的。你是用的TQuickRep吗?可以在OnNeedData事件中根据条件控制显示的QLabel值,你还可以做个数据带,根据某一条件确定要显示的是哪个数据带,并为它赋值,更具体的操作只有你去亲身体验了,你只要明白OnNeedData的工作原理,一切都变得那么简单,它就是游戏手柄!Top
2 楼wyj1974(迷茫的帅哥)回复于 2004-12-02 11:54:02 得分 0
那如果数据库字段随意变动的话,界面如何适应呢?Top
3 楼newcar(newcar)回复于 2004-12-02 13:04:02 得分 0
本人也正在做一个工资管理,要求动态列,自定义报表。。
思路:用alter table动态创建,删除列。。用一个表保留动态表结构。(包括字段类型,列计算公式等) 界面用grid显示及编辑数据。grid列根据结构表动态创建。。
以上已经完成了。接下来就是报表问题。原理同上。不过报表就不用要结果表了,用户增加一列,表结构增加2个字段,一个存数据用一个存计算公式用。
还有一种方法。。
就是把数据的列变成显示数据的行。。如
id 属性 属性值
1 姓名 张三
1 年龄 21
1 其他 。。
2 姓名 李四
2 年龄 22
3 。。。
。。。
曾经有人说过,用第一种方法的一般是半路出家的程序员。用第二种方法的才是专业的程序员。。
呵呵。我就是半路出家。。。
这只是一点建议,具体还需要自己去实现。。Top
4 楼wyj1974(迷茫的帅哥)回复于 2004-12-02 13:21:10 得分 0
第一种方法我考虑过!
第二种方法倒是很新鲜,不知能否详细说明一下
Top
5 楼zdq801104(【☆这个杀手不太冷☆】)回复于 2004-12-02 13:34:58 得分 0
看起来满好的思路,好好关注一下!Top
6 楼wyj1974(迷茫的帅哥)回复于 2004-12-02 13:44:28 得分 0
我刚才和一个上海的同学沟通了一下,想采用如下方式:
数据库系统中存在两种表:
基本信息表:提前设置大量的字段,字段名可从Field1到Field100,字段类型全部为字符串型。
配置表:用于指定基本信息表中的有效字段和中文含义。
这样可解决动态调整的问题,但界面上却很难适应,如果采用 newcar(newcar)的方法用Grid来呈现和修改的话,则显得不够友好。
请各位继续关注!Top
7 楼zglwxb(假钞换贞操)回复于 2004-12-02 13:45:31 得分 0
严重关注
顶Top
8 楼wyj1974(迷茫的帅哥)回复于 2004-12-02 13:49:49 得分 0
就是把数据的列变成显示数据的行。。如
id 属性 属性值
1 姓名 张三
1 年龄 21
1 其他 。。
2 姓名 李四
2 年龄 22
3 。。。
。。。
---这种方法,如果数据量很大的话,那表不是很长吗?这样检索起来。。。!Top
9 楼BigAngell(学而不思则罔 思而不学则殆)回复于 2004-12-02 14:48:49 得分 0
界面的自动适,你可以写个专用的过程来控制,左边用个ListView,右边可以放置一些其它的控件,比如TEdit,根据搜到的字段来确定要生成多少列、TEdit...
我们公司就有这种专门的工俱(自主开发),我们用它来自动生界面、代码、存储过程等,如果说在你的软件里要实现这些功能,我提意你为用户单独做个客户工具,用户要修改表结构或其它一些操作都放到这里来统一实现,再与主应用程序挂勾...Top
10 楼cctv1111(小子)回复于 2004-12-02 15:03:17 得分 0
關注,
這種動態的確實很麻煩。
我們公司也有一張報表是動態的。。。寫得相當麻煩。還是用水晶 報表的特性加 SQL 費了好大的力氣才搞定的。 。Top
11 楼Changefish(小翼【嘘。。。别出声!我是从80端口进来的】)回复于 2004-12-02 16:14:48 得分 0
见过这样的软件 但不知道如何实现的Top
12 楼wyj1974(迷茫的帅哥)回复于 2004-12-03 11:10:37 得分 0
To: BigAngell(风雨英雄)
我们计划就是想把设置和主程序分开的。
如果都是一般的属性,按照你的方法是可以实现的,比如人的姓名、证件号码什么的,不和其他表发生关联。
如果出现诸如所属部门这样的必须和其他表发生关联的,怎么解决呢?
如果大家见过这样的软件,可能把其大概的流程描述一下,也许对我们有一定的帮助!
Top
13 楼GRWriter(重视报表开发)回复于 2004-12-03 11:34:18 得分 0
Grid++Report - 专为管理信息系统打造的报表构件
适用于管理信息系统软件产品的报表开发,如ERP、进销存、财务等。快速制作通用报表与动态报表,有专业的可视化设计器,使用简便。编写了VB、VC、Delphi、C++Builder下的丰富示例。安装程序中包括可执行的例子程序,马上可以体验其功能。另在中国大陆地区是完全免费的。
主页:www.GridppReport.comTop
14 楼wyj1974(迷茫的帅哥)回复于 2004-12-03 12:41:34 得分 0
楼上的,我不是完全要报表方面的东东呀!!!Top
15 楼BigAngell(学而不思则罔 思而不学则殆)回复于 2004-12-03 12:52:38 得分 0
如果出现诸如所属部门这样的必须和其他表发生关联的,怎么解决呢?
////////////////////////
还是一样的呀,在客户工具端修改就是了呀,不过你的SQL语句就不要写在程里了,最好保存为文本,修改文本内容就可以实现新的关联了Top
16 楼newcar(newcar)回复于 2004-12-03 14:54:24 得分 0
就是把数据的列变成显示数据的行。。如
id 属性 属性值
1 姓名 张三
1 年龄 21
1 其他 。。
2 姓名 李四
2 年龄 22
3 。。。
。。。
这个设计才是最标准的方法..记录数会很多,但是速度却并不慢.
如果不用grid的话也可以动态创建控件,不过这样写代码就太麻烦了..
-----------------------------------------------------------
数据库系统中存在两种表:
基本信息表:提前设置大量的字段,字段名可从Field1到Field100,字段类型全部为字符串型。
配置表:用于指定基本信息表中的有效字段和中文含义。
这个方法不科学,而且在列数据需要公式计算的话不好处理...Top
17 楼wyj1974(迷茫的帅哥)回复于 2004-12-07 10:03:44 得分 0
这两天在忙其他的事,请大家继续给予关注!Top
18 楼wyj1974(迷茫的帅哥)回复于 2004-12-07 10:05:46 得分 0
就是把数据的列变成显示数据的行。。如
id 属性 属性值
1 姓名 张三
1 年龄 21
1 其他 。。
2 姓名 李四
2 年龄 22
3 。。。
。。。
这个设计才是最标准的方法..记录数会很多,但是速度却并不慢.
如果不用grid的话也可以动态创建控件,不过这样写代码就太麻烦了..
-----------------------------------------------------------------------
这种方式,大家能否给段代码看看,或说的再详细点!Top
19 楼zzlazio(sritsb)回复于 2004-12-07 10:55:00 得分 0
说到底就是报表的地方..
严重关注...Top
20 楼masterjames(三月街)回复于 2004-12-07 12:52:31 得分 0
临时表Top
21 楼newcar(newcar)回复于 2004-12-07 14:47:20 得分 0
能做成那种数据库结构的软件一般是很难弄到原码的。。
有一个网友现在就在用这种方法作一个报表控件呢。Top
22 楼surpassable()回复于 2004-12-07 14:53:32 得分 0
学习
关注~~~Top
23 楼wyj1974(迷茫的帅哥)回复于 2004-12-07 15:47:59 得分 0
说说实现方式也可以或把设计思路写的详细点也行呀!!Top
24 楼wyj1974(迷茫的帅哥)回复于 2004-12-08 11:42:06 得分 0
难道大家都不关心吗?Top
25 楼herofy(雄鸡报晓)回复于 2004-12-08 12:08:11 得分 0
把数据列转变成行是一个好的方法,我也这样实现过。
不过有的时候就不是很方便,比如当浏览全部会员的时候,你要把行转化成列来显示出来,这样是一个很麻烦的事情,特别是当有的是两个属性有的是三个属性的时候,楼主的项目可以不设计到这个需求。Top
26 楼wyj1974(迷茫的帅哥)回复于 2004-12-08 12:55:46 得分 0
我感觉不光是这些,会员的基本属性有编号、姓名、.....,同时会员的车辆信息表还要和会员信息表发生关联,然后还有车辆保险表等等,同时针对会员还有驾驶证到期通知、车辆行驶证到期通知等等,感觉如果做成动态的实在太过麻烦了。Top
27 楼wyj1974(迷茫的帅哥)回复于 2004-12-08 12:57:59 得分 0
To:herofy(herofy.go.nease.net)
你们是如何编辑数据属性的呢?界面是如何架构的?Top
28 楼herofy(雄鸡报晓)回复于 2004-12-08 14:13:35 得分 0
我把字段的属性也做成了一个字段来处理了。Top
29 楼wyj1974(迷茫的帅哥)回复于 2004-12-08 14:17:50 得分 0
To:herofy(herofy.go.nease.net)
能否请的详细点,如果不方便可通过消息发给我
谢谢!!!!Top
30 楼newcar(newcar)回复于 2004-12-09 16:50:56 得分 0
这个东西只能具体问题具体分析了,没有办法说的很详细。最终还是需要自己多多琢磨。。Top
31 楼wyj1974(迷茫的帅哥)回复于 2004-12-09 16:55:23 得分 0
我现在采用配置表的方式来记录数据库表的信息,然后试用Alter Table的方式来动态调整。
还没有看到效果,先做着再说吧!Top
32 楼gzlcd()回复于 2004-12-09 17:19:51 得分 0
本人倒是做了个类似的系统,称为快速开发模板,解决了数据编辑界面、查询、数据库表关联等问题。并且支持三层结构。最近想移植到.NET下,发现.NET组件少了n多的事件与属性,居然解决不了动态生成数据编辑界面模板,该死的微软!还是VCL组件好啊!适合商用开发。Top
33 楼wyj1974(迷茫的帅哥)回复于 2004-12-10 09:23:45 得分 0
楼上的能否大概说一下实现原理?!Top
34 楼syfan(阿帆)回复于 2004-12-11 19:15:03 得分 0
用友的工资用的是第一种方法
金蝶的工资用的是第二种方法,
不过金蝶的工资在功能上比用友的差多的.Top
35 楼syfan(阿帆)回复于 2004-12-11 19:16:06 得分 0
To newcar(newcar)Top
36 楼tetsuya(小哲)回复于 2004-12-11 19:33:11 得分 0
还是用友U8的结构看上去比较好..至少给它做外挂方便...
金蝶的K3.今天刚刚装好还在研究.Top
37 楼wyj1974(迷茫的帅哥)回复于 2004-12-13 08:57:27 得分 0
期待楼上的研究结果!Top
38 楼wyj1974(迷茫的帅哥)回复于 2004-12-13 11:30:42 得分 0
由于楼上的两位的提醒,我下载了用友的U8进行了测试,只是简单分析了一下工资关联部分。个人感觉和我目前采用的方法基本上差不多,但其动态的多位字符型或数字型,而我们的系统则可能会有诸如日期等等类型,不过还是很有启发。
现在先不结贴,欢迎各位继续讨论。
等我做处理后,会第一时间公布我的设计思路。Top
39 楼JavaD(一竿残照(the way of delphi))回复于 2004-12-13 11:41:55 得分 0
1.报表,存储sql语句,条件宏(可由客户端输入,并替换,生成可执行的sql)
2.关联表,某个报表的所有字段名称,位置,字体(包括大小颜色),是否显示
3.在客户端生成某报表的checkboxList,供用户选择定制,并可修改位置
4.动态生成qreportLabel,或者(TfrMemo,如果用fastreport的化)Top
40 楼tycoonXP(剑帅)回复于 2004-12-13 12:00:59 得分 0
期待完美方案~~~Top
41 楼alonesnake(一盘菜)回复于 2004-12-13 15:44:56 得分 0
upTop
42 楼luckta(luckta)回复于 2004-12-13 16:13:53 得分 0
如果是會計系統的話建議不要隨便讓用戶加減字段,建議像U8一樣在數據庫中增加自定義項來解決,增加字段的問題,而刪除就只要直接將不需要的字段在介面上隱藏就可以Top
43 楼wyj1974(迷茫的帅哥)回复于 2004-12-13 16:46:00 得分 0
是一个管理软件不是财会系统的软件。Top




