我有一个主从表, qryMaster, qryDetail,我在qryDetail上增加了一个计算字段ID.
然后在qryDetail的OnCalcFields中写入下面的事件:
 qryDetail.FieldByName('ID').AsInteger := qryDetail.Recno;
可是结果却全都是-1,真是搞不明白?!

解决方案 »

  1.   

    hi, jiezhi:
      这样做并不是一个好方法。以前我在单个表时,在Query的OnCalcFields中写事件是可以的,为什么换成主从表就不行了呢?想不通
      

  2.   

    ID:是否是整形?还是自动赋值?关键是类型匹配吗?
    不过可以用:qryDetail.FieldByName('ID').AsInteger :=1;测试以下
      

  3.   

    qryDetail.Recno显示的是当前行号的
    是不是你的数据集没有后滚呢 所以显示的是-1
      

  4.   

    hi,killghost(kill--ghost):
      ID当然是整形喽,它只不过是我在Query中的一个新增字段,类别设成了计算字段而已。
      

  5.   

    hi, angle097113:
      注意我是写在qryDetail的OnCalcFields事件中的,它是自动向下移动记录的。现在问题的关键是 为什么得出的Recno是-1????  说一说我主表qryMaster的SQL语句:SELECT * FROM SCJS_JHGL_BMSCJHZB
      细表qryDetail: SELECT * FROM SCJS_JHGL_BMSCJH WHERE JHBH=:JHBH
      qryDetail的DataSource设成了qryMaster的DataSource
      
      

  6.   

    因为你的从表中的数据是和主表的数据相连的
    在你OnCalcFields的时候你的从表中是没有数据的 所以显示为-1
    而且如果你是一条数据对应一条数据的化 你的从表的recno就算计算出来以后也是1 
    不会增加的 因为你的数据集中最多就一条数据
    你把qryDetail.FieldByName('ID').AsInteger := qryDetail.Recno;
    后面得qryMaster
      

  7.   

    to angle097113:
      我的主表只有一条记录,但从表却有十一条,并且他们也都打开了。为什么还会得到-1呢?
      

  8.   

    先要搞清楚你究竟用什么控件和什么驱动程序,这关系到Recno这个属性是否有效,如果用bde驱动paradox,用ttable,tquery等bde的控件访问而且filtered属性设置为false那么recno就有效,如果filtered设置为true那么访问任何数据库都无效(返回-1),作为从表相当于设置了filtered为true所以肯定无效,如果访问access不管filtered为什么都无效。如果要ADO系列控件访问则都有效,如果recno无效那么dbgrid的垂直滚动条不能连续滚动,如果有效还要分情况,对于ado控件系列先看看CursorLocation属性,如果为clUseServer则不能连续滚动,如果filtered为为true也不能连续滚动,只有在clUseClient并且Filtered为false情况下才能连续滚动。建议你先用clientdataset缓存数据,因为clientdataset能够保证recno总有效而且dbgrid滚动条能够连续滚动而不管filtered属性设置为什么
      

  9.   

    谢谢 manfeng 大虾, 感谢您这么精彩的描述!
      我也发现了同样的问题。我一开始用DBE连Oracle,发现Recno的值总是-1,然后用ODAC(一套连接Oracle的控件),却能够得到正确的记录号!!
      看来还是对数据库某些方法的使用不够深入哇!再次感谢 manfeng!