第一张是编程时的效果,第二张是编译运行时的效果图。
该程序实际用了四个表,所以先用了四个ADOTable和四个DataSource,并用rybh(人员编号)关联起来。
但是象性别、民族、文化程度、案件类别、刑期等多达20几个项目,其数据库里的字段值实际都是代码。我分析了一下数据库:数据库里有一个总的代码表,通过视图的查询方式(不知如何表达)把代码(比如01、02、11等)再转变为男、汉族、高中等。所以我不得不再用好多ADOTable和DataSource及人家的视图再把它们翻译过来。比如案件类别的视图是这样的:V_AJLB:(不是我弄的,原有的)
SELECT DM, HZ, PYZT //(代码、汉字、拼音字头)
FROM dbo.DMB //(代码表)
WHERE (DMLX = 11) //(代码类型)我虽然实现了原软件的全部效果,但心里老有点疑问,请问到底有没有这样编程的?居然用了这么多的ADOTable和DataSource?直接用真实的数据不就行了,非要转换一下,难道这样有什么优点吗?
还有就是刑期显示的问题,数据库里实际也是数字不是汉字,但不是用视图转换的(我没有找到相应的视图,前两天我已经发贴问了)。为什么非要弄这么复杂,还是有简单的方法,而我弄的太复杂了?
请大家指点,谢谢!!!
该程序实际用了四个表,所以先用了四个ADOTable和四个DataSource,并用rybh(人员编号)关联起来。
但是象性别、民族、文化程度、案件类别、刑期等多达20几个项目,其数据库里的字段值实际都是代码。我分析了一下数据库:数据库里有一个总的代码表,通过视图的查询方式(不知如何表达)把代码(比如01、02、11等)再转变为男、汉族、高中等。所以我不得不再用好多ADOTable和DataSource及人家的视图再把它们翻译过来。比如案件类别的视图是这样的:V_AJLB:(不是我弄的,原有的)
SELECT DM, HZ, PYZT //(代码、汉字、拼音字头)
FROM dbo.DMB //(代码表)
WHERE (DMLX = 11) //(代码类型)我虽然实现了原软件的全部效果,但心里老有点疑问,请问到底有没有这样编程的?居然用了这么多的ADOTable和DataSource?直接用真实的数据不就行了,非要转换一下,难道这样有什么优点吗?
还有就是刑期显示的问题,数据库里实际也是数字不是汉字,但不是用视图转换的(我没有找到相应的视图,前两天我已经发贴问了)。为什么非要弄这么复杂,还是有简单的方法,而我弄的太复杂了?
请大家指点,谢谢!!!
如(所有表用key来关联):
select * from 表1 a,表2 b,表3 c,表4 d where a.key=b.key and b.key=c.key and c.key=d.key
就可以了
(当然最好select 字段1,字段2....,不要用*)
其次
代码库可用多种解决方案
1.直接用sql,如:
select 姓名,(select 性别 form 代码表 where 代码标识='性别' and 代码值 =a.代码) from 你的表 a;
但这种方法一般不推荐使用,原因是SQL看上去很复杂
2.用数据库写一个函数
select 姓名,getxb(性别) as 性别 from 你的表
3.在程序中实现用:
TField.OnGetText方法
4.先将代码表读入本地变量(或结构),用本地函数来转代码。
-------------------------------
数据库结构设计没问题,一般不会将所有字段放入一个表中(一般稍大一点的系统都会有代码表)主要你的程序设计,多参考别人的吧。
TDMList=class
读取所有的代码,保存在列表中。
通过参数得到显示的内容。
function DMCodeToCaption(DMLX,DM:String):String;
end;其它的内容,分成四块,分别定义四个结构,在定义一个总的类包含这四个结构。
1.要么就用数据感知控件,即一个Query+DataSource显示一个列表
2.要不就在onShow时用普通控件进行AddObject()
老大指点一下,您一般都用什么高招才能让人看起来像高手?:)
2. 如果是像这样的窗口,可以分一下页,这样看的就眼不晕了,比如windows的像显示属性等,还分为背景,屏保,外观,设置等页
3.数据方面,看使用者的要求,思想也是能一目了然最好,如果不能,尽量一目了然和简洁,操作者能尽量少操作就尽量少操作,这样编程稍微多一点,用户省事的就是好程序我也是外行出身,不是高手,共同学习
1.你多考虑下代码重构,例如大量的转化,可以封装成通用函数进行。将代码01,02,11等以参数进行传入
2.增加一套静态的ADO控件,实际使用时会增加5M左右的内存,虽然现在机器性能不错,但不建议使用如此
多的查询控件
3.可以使用同一套控件,例如保存链接,留1-2个query组件做临时查找即可,其他如有需要可动态创建
4.看了下你的界面,从规划上抽象,大体有五大块,模块化之后不该超过10个QUERY组件。
我是上班时闲着没事琢磨一下我们用的软件,全省通用的,是北京一个公司弄的。
我是想先实现人家的功能和效果,再寻找最佳的解决方案。我的方法只是显示图片和转换刑期用了些代码,其它没有写一行代码,但弄起来其实也挺麻烦的,外人看起来更容易眼晕。
非常感谢大家的帮助,看来还是可以做得简单点的,我没把源码拷回家,回单位后试试。现在我想也就是用两个ADOQuery和两个DataSource就可以解决。
以下是代码转汉字的编码,大家再提提意见,有这样弄的吗?总觉得太复杂,不过显示应该是正确的。
所有的视图都是这样的,比如:V_AJLB://案件类型(不是我弄的,原有的)
SELECT DM, HZ, PYZT //代码、汉字、拼音字头
FROM dbo.DMB //代码表
WHERE (DMLX = 11) //代码类型select a.hz as xb,a.dm,b.hz as zzmm,b.dm,c.hz as mz,c.dm,//性别、政治面貌、民族
d.hz as whcd,d.dm,e.hz as hyzk,e.dm,f.hz as zjlx,f.dm,//文化程度、婚姻状况
g.hz as gj,g.dm,h.hz as zy,h.dm,i.hz as sf,i.dm,//国籍、专业、身份
j.hz as tssf,j.dm,k.hz as zc,k.dm,l.hz as xzqh,l.dm,
m.hz as rsyy,m.dm,n.hz as sypz,n.dm,o.hz as rygllb,o.dm,
p.hz as zxf,p.dm,q.hz as wffzjl,q.dm,r.hz as cylx,r.dm,
s.hz as ajlb,s.dm,t.hz as csyy,t.dm,u.hz as badwlx,u.dm,
v.hz as ssjd,v.dm,w.hz as cljg,w.dm
from v_xb a,v_zzmm b,v_mz c,v_whcd d,v_hyzk e,v_zjlx f,v_gj g,
v_zy h,v_sf i,v_tssf j,v_zc k,v_xzqh l,v_rsyy m,v_sypz n,
v_rygllb o,v_sfdm p,v_wffzjl q,v_cylx r,v_ajlb s,v_csyy t,
v_badwlx u,v_ssjd v,v_cljg w
where (a.dm=:xb) and (b.dm=:zzmm) and (c.dm=:mz) and
(d.dm=:whcd) and (e.dm=:hyzk) and (f.dm=:zjlx) and
(g.dm=:gj) and (h.dm=:zy) and (i.dm=:sf) and
(j.dm=:tssf) and (k.dm=:zc) and (l.dm=:jg) and
(m.dm=:rsyy) and (n.dm=:sypz) and (o.dm=:rygllb) and
(p.dm=:zxf) and (q.dm=:wffzjl) and (r.dm=:cylb) and
(s.dm=:ajlb) and (t.dm=:csyy) and (u.dm=:badwlx) and
(v.dm=:ssjd) and (w.dm=:cljg)
SQL中,居然用中文名字建表,不是挺好吧!~
你说中文名字建表是什么意思?难道不能用中文的拼音字头当表名吗?可知这个软件是北京一家公司弄的,河北全省通用(其它省用没用不知道)。我曾在网上见一个人说,如果他的员工用中文的拼音字头当字段名或表名,马上开除,我觉得太过分了吧,难道你的英语水平比汉语水平还高?用英文就那么得心应手?
字典代码和实际内容的对照完全可以在内存中动态建立其对照表,然后在主表(非字典表)显示的时候,动态翻译就是了,用table来处理字典那不是自己给自己找麻烦吗。
至于为什么用字典而不直接使用原始内容,一个是为了数据的准确性,还有就是为了加快查询速度,这个可能有些人不理解,当涉及到统计报表的时候,查询速度非常重要的。
至于用查询的方式将所有的字典编入到一个查询语句中,呵呵,这是给数据服务器找麻烦,当千百个人同时用你的这种查询方式的时候,你的数据服务器基本就会罢工了
系统加载时,先把这个结构表用一个ClientDataSet保存在内存中(如果你不怕麻烦,这个ClientDataSet中的内容也可以动态地增加,用到什么表加载什么表,加载了就留下来,下次用就直接用了)。
这是对数据结构信息的处理
字典的处理是这也的,创建一个TStringList,保存字典代码,其格式是:代码=字典名称->字典内如
因为TStringList的每一个Item都可以指定一个TObject,将一个TStringList给这个TStringList,用来保存字典内容,大概的结构如下:101=性别->
1=男
2=女102=籍贯
......具体涉及的代码大概是这样DicList := TStringList.Create;
function AddDic(DicInfo: String): TStringList;
begin
Result := TStringList.Create
DicList.AddObject(DicInfo, Result);
end;
.....
//增加性别字典
with AddDic('101=性别') do
begin
Add('1=男');
Add('2=男');
end;
.....这种字典的增加是动态的,使用性别字典时,先在字典列表中查找代码为101的字典是否存在,如果不存在,则从服务器上下载这个字典,然后将这个字典加入到列表中,如果存在这个字典,则返回字典对应的TStringList
在打开某个需要使用字典的数据表时,先找到每个需要字典翻译的字典对用的字典列表,然后在显示数据时,就可以利用这些列表去翻译相应的代码。
如果字典列表是排序的,查找速度是非常快的。上面写的比较乱,但是大体思路就是这样,剩下你自己发挥吧