要给一批设备建立资料卡片档案,卡片大概有10多种,每个设备都有若干卡片但又不尽相同;为了能够维护这些卡片,把卡片字段做成动态的,用一个表存储字段名称;用一个表存储所有字段值。
关键情况是有的卡片是单条记录,如设备名称、编号等,有的卡片却记录多条,如按日期的检验情况。我都把他们的值存在一个数据表里。
数据表大致如下:
设备:equipTable(eid,equipname,equiptype)
卡片:cardTable(cardid,cardname)
设备卡片:equipCard(ecid,eid,cardid)
 1 1 checkequip
卡片字段:cardField(fid,cardid,fieldname)
 1 1 checkdate
 2 1 checkman
 3 1 checkresult
字段值表:fieldValue(fvid,fid,fvalue)
 1 1 "2005-01-01"
 1 2 "tom"
 1 3 "ok"
 2 1 "2005-01-02"
 2 2 "jack"
 2 3 "ok"
相关sql语句(已知参数为eid和cardid):
得到设备:select * from equipTable where eid=:eid
得到设备所有卡片:select cardTable.* from cardTable,equipCard where cardTable=equipCard and equipCard.eid=:eid
得到当前卡片字段:select * from cardField where cardid=:cardid
得到当前字段值:select * from fieldValue where fid in (select ecid from cardField where cardid=:cardid)
最后一条语句执行得到的结果跟前面字段值表:fieldValue存储的结构基本相同,在输出时想做成同一条记录横向循环,但是存在一个潜在的可能,如果卡片字段在某天增加一个字段,得到的数据条数可能前后不一致。
我尝试写的代码如下:
          HashMap map = new HashMap(),map2;
          int fvid = 0;
          while (rs.next()) {
            fvid = rs.getInt("fvid");
            map2 = new HashMap();
            map.put("fvid", String.valueOf(fvid));
            for(int i=1;i<size;i++){
              if(fvid!=rs.getInt("fvid")) break;
              map2.put(rs.getString("fid"),rs.getString("fvalue"));
              rs.next();
            }
            map.put("value",map2);
            list.add(map);
          }
可是好像得不到预期的结果。困惑了两天,现在思路更加混乱,请各位给点意见和提示。如果回答有效,还可以到这里接分: http://community.csdn.net/Expert/topic/4249/4249259.xml?temp=.6814844

解决方案 »

  1.   

    1、你的表述有些不准确和简洁,按照我的理解你的主要担心是在‘但是存在一个潜在的可能,如果卡片字段在某天增加一个字段,得到的数据条数可能前后不一致。’
    2、如果你说的是‘字段’我的建议,增加一条统计该表字段个数的sql,把统计后的个数作为你下面代码循环的次数。
    3、统计表字段个数的sql,如:
       select count(*) from user_tab_columns where table_name=upper('cardField')4、如果你说的是纪录个数,追加一个下面统计记录个数的sql,如:
       select count(*) from  cardField
      

  2.   

    我的意思是说,所有卡片信息存在一个table里,这些卡片上所有需要填写的项(字段)信息存在另外一个table里。某个卡片上的项很可能在今后被增加或减少,这可能是存在的隐患,导致输出项不正确。
    为什么呢,因为卡片上项的排列方式是不同的,有的是简单的单项表单形式如form状,有的是多项列表如list状。但是这些卡片所有项的所有值都存在一个table里。
      

  3.   

    设备:equipTable(eid,equipname,equiptype)
    卡片:cardTable(cardid,cardname)
    设备卡片:equipCard(ecid,eid,cardid)
     1 1 checkequip
    卡片字段:cardField(fid,cardid,fieldname)
     1 1 checkdate
     2 1 checkman
     3 1 checkresult
    疑惑:设备卡片中checkequip是cardid?ka卡片字段中1是cardid?
    为什么不一样??比较晕.不知道是你表达问题,还是偶理解问题
      

  4.   

    是我打错了,应该是id,为1,
    设备卡片:equipCard(ecid,eid,cardid)
     1 1 1