第一张是编程时的效果,第二张是编译运行时的效果图。
该程序实际用了四个表,所以先用了四个ADOTable和四个DataSource,并用rybh(人员编号)关联起来。
但是象性别、民族、文化程度、案件类别、刑期等多达20几个项目,其数据库里的字段值实际都是代码。我分析了一下数据库:数据库里有一个总的代码表,通过视图的查询方式(不知如何表达)把代码(比如01、02、11等)再转变为男、汉族、高中等。所以我不得不再用好多ADOTable和DataSource及人家的视图再把它们翻译过来。比如案件类别的视图是这样的:V_AJLB:(不是我弄的,原有的)  
SELECT DM, HZ, PYZT  //(代码、汉字、拼音字头)
FROM dbo.DMB         //(代码表)
WHERE (DMLX = 11)    //(代码类型)我虽然实现了原软件的全部效果,但心里老有点疑问,请问到底有没有这样编程的?居然用了这么多的ADOTable和DataSource?直接用真实的数据不就行了,非要转换一下,难道这样有什么优点吗?
还有就是刑期显示的问题,数据库里实际也是数字不是汉字,但不是用视图转换的(我没有找到相应的视图,前两天我已经发贴问了)。为什么非要弄这么复杂,还是有简单的方法,而我弄的太复杂了?
请大家指点,谢谢!!!

解决方案 »

  1.   

    我有点晕,第一次看见有人用怎么多的DataSource,首先,4个表有关联的话可以一个SQL查到所有数据,
    如(所有表用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.先将代码表读入本地变量(或结构),用本地函数来转代码。
    -------------------------------
    数据库结构设计没问题,一般不会将所有字段放入一个表中(一般稍大一点的系统都会有代码表)主要你的程序设计,多参考别人的吧。
      

  2.   

    可以不用数据源绑定的方式,先将所有的代码类型都读取出来。
    TDMList=class
      读取所有的代码,保存在列表中。
      通过参数得到显示的内容。
      function DMCodeToCaption(DMLX,DM:String):String;
    end;其它的内容,分成四块,分别定义四个结构,在定义一个总的类包含这四个结构。
      

  3.   

    不用每个都用adotable,直接用一个SQL就查出来了。
      

  4.   

    汗,很遗撼很多人这么用Delphi.....
      

  5.   

    对于这种类型表来说,在快速开发过程中
    1.要么就用数据感知控件,即一个Query+DataSource显示一个列表
    2.要不就在onShow时用普通控件进行AddObject()
    老大指点一下,您一般都用什么高招才能让人看起来像高手?:)
      

  6.   

    不要告诉我您是动态创建的Query+Datasource
      

  7.   

    1. 如果是临时性的数据,可以用动态创建的Query,或者在DM中定义一个公用的Query,用完关闭;
    2. 如果是像这样的窗口,可以分一下页,这样看的就眼不晕了,比如windows的像显示属性等,还分为背景,屏保,外观,设置等页
    3.数据方面,看使用者的要求,思想也是能一目了然最好,如果不能,尽量一目了然和简洁,操作者能尽量少操作就尽量少操作,这样编程稍微多一点,用户省事的就是好程序我也是外行出身,不是高手,共同学习
      

  8.   

    4.这种窗口的数据源,可以在DM中用一个Query实现,打开的时候用sql 检索,保存的时候,也用sql 语句保存,这样是好控制,但是需要写许多程序,也就是字符串拼接部分,如果嫌这样麻烦,那就用数据感知控件,这样是不好控制,只能用数据感知控件的功能
      

  9.   


    1.你多考虑下代码重构,例如大量的转化,可以封装成通用函数进行。将代码01,02,11等以参数进行传入
    2.增加一套静态的ADO控件,实际使用时会增加5M左右的内存,虽然现在机器性能不错,但不建议使用如此
    多的查询控件
    3.可以使用同一套控件,例如保存链接,留1-2个query组件做临时查找即可,其他如有需要可动态创建
    4.看了下你的界面,从规划上抽象,大体有五大块,模块化之后不该超过10个QUERY组件。
      

  10.   

    感谢大家的指点,我是自学者,在书上(包括下载的好多电子书)看到的复杂例子并不多,更没有参加过团队的开发,不知实际编程是怎么弄的,水平之差可想而知。
    我是上班时闲着没事琢磨一下我们用的软件,全省通用的,是北京一个公司弄的。
    我是想先实现人家的功能和效果,再寻找最佳的解决方案。我的方法只是显示图片和转换刑期用了些代码,其它没有写一行代码,但弄起来其实也挺麻烦的,外人看起来更容易眼晕。
    非常感谢大家的帮助,看来还是可以做得简单点的,我没把源码拷回家,回单位后试试。现在我想也就是用两个ADOQuery和两个DataSource就可以解决。
      

  11.   

    终于弄成了,几个表用了一个ADOQuery和一个DataSource,转换代码的视图用了一个ADOQuery和一个DataSource,图片专门用了一个ADOQuery。
    以下是代码转汉字的编码,大家再提提意见,有这样弄的吗?总觉得太复杂,不过显示应该是正确的。
    所有的视图都是这样的,比如: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)
      

  12.   

    太复杂,太混乱了,而且数据空间太多,为什么不用Date Moudel数据模型统一呢?
     SQL中,居然用中文名字建表,不是挺好吧!~
      

  13.   

    我只是模拟软件的一个模块,所以没有用moudel。
    你说中文名字建表是什么意思?难道不能用中文的拼音字头当表名吗?可知这个软件是北京一家公司弄的,河北全省通用(其它省用没用不知道)。我曾在网上见一个人说,如果他的员工用中文的拼音字头当字段名或表名,马上开除,我觉得太过分了吧,难道你的英语水平比汉语水平还高?用英文就那么得心应手?
      

  14.   

    这程序写的,神仙啊。
    字典代码和实际内容的对照完全可以在内存中动态建立其对照表,然后在主表(非字典表)显示的时候,动态翻译就是了,用table来处理字典那不是自己给自己找麻烦吗。
    至于为什么用字典而不直接使用原始内容,一个是为了数据的准确性,还有就是为了加快查询速度,这个可能有些人不理解,当涉及到统计报表的时候,查询速度非常重要的。
    至于用查询的方式将所有的字典编入到一个查询语句中,呵呵,这是给数据服务器找麻烦,当千百个人同时用你的这种查询方式的时候,你的数据服务器基本就会罢工了
      

  15.   

    感谢wxieyang的指点!你说的“字典代码和实际内容的对照完全可以在内存中动态建立其对照表,然后在主表(非字典表)显示的时候,动态翻译就是了”,我不明白怎么回事,麻烦再给详细解释一下或给点代码。先谢谢!!!
      

  16.   

    象这种经常不需要修改的数据(如字典表中的项),应该做成进程级共享的资源(查询缓存),仅需要第1次访问时与数据库交互,以后直接读内存,不需要用N个Query来查询!否则当窗体onShow时,会执行N个SQL,如果有N个点的话,数据库负载会是个问题
      

  17.   

    构建缓存比较简单,创建一个HASHMAP就可以了
      

  18.   

    我不清楚你的编码方式是什么,我以前的编码方式是:字典本身也有一个字典,比如 人的 性别 籍贯 什么的,这些也编一个字典代码,数据库中还有一个记录数据表结构信息的表,这个表记录着每个字段对应的字典的代码。
    系统加载时,先把这个结构表用一个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
    在打开某个需要使用字典的数据表时,先找到每个需要字典翻译的字典对用的字典列表,然后在显示数据时,就可以利用这些列表去翻译相应的代码。
    如果字典列表是排序的,查找速度是非常快的。上面写的比较乱,但是大体思路就是这样,剩下你自己发挥吧