楼主   我用query1查询多个表结果显示在dbgrid中。我想修改查询到的结果。但是数据不能修改,是只读数据。我查了一下书,书中讲,要加另外一个query2用update语句修改query1中的数据才可以,但是书中没有讲的很清楚。请各位大哥讲一下,举一个例子,在下多谢了
---------- 

解决方案 »

  1.   

    可以修改呀,除非你的dbgrid做了只读设置
      

  2.   

    楼上说的是.看看dbgrid的readonly是不是被改成true了。
      

  3.   

    这种情况得到的视图很多情况是只读的。
    如果需要修改可以结合TUpdateSQL + TQuery 来完成,理论上他两个的组合能修改任何只读视图。
    具体看看帮助,挺好理解的。
      

  4.   

    楼主讲的很正确。在单表查询的query中,可将query1的requestlive属性设置为true,而相应的dbgrid设置为readonly:=false,才可直接在dbgrid中修改相应的表数据。在多表查询的query中,requsetlive属性不起作用。而解决方法只有按楼上所说的。你没交代具体情况,没法给你写具体语句。请自己参照TUpdateSQL + TQuery来完成你的工作,而不要采用query2修改query1的方法(我认为该方法只是在加几个edit,然后用query2直接将edit.text中的内容修改到数据库中)。
      

  5.   

    这只能用在BDE上,用在ADO上能行吗?
      

  6.   

    可以修改呀,看看是不是你的readonly屬性設為了只讀.
      

  7.   

    问题是这样子的,我用SQL语句,查找两个表中的数据如
    query1.close;
    query1.sql.add('select a.aa ,b.aa ,a.bb,b.bb,a.cc from a,b');
    query1.sql.add('where a.aa=b.aa and a.bb=:bb')
    query1.parambyname('bb'):=edit1.text;
    query1.open;
    之后我想修改查询到的数据,如a表的cc 的值(用程式修改,不是在dbgrid中修改)。
    但是不能修改好像是只读数据,哪位讲一下。怎么样修改,tupdatesql+tquery怎么使用,大哥讲一下吧
    如在加一个query又要怎么样做
      

  8.   

    将DBGird的属性ReadOnly改为false
    至于多个表的问题,用SQL语言来控制,和单个表的区别不大。
      

  9.   

    自己到网上搜索一下 tupdatesql 有很多例子。没必要在这浪费时间。
      

  10.   

    我用query1查询到的数据是想修改一部份,当我用query2时,他把数据库不要修改反而全改了。如
    query1.close;
    query1.sql.clear;
    query1.sql.add('select a.a1,a.a2,b.a1,b,b2 from a,b}
    query1.sql.add('wherea.a1=b.a1)
    query1.open;
    这是查询到的数据。然后我用query2
    i:=1;
    j:=i;
    K;=query1.recordcount;
    for i:=1 to k do 
    begin
    if i=j+100 then//第隔100就修改/query2.close;
    query2.sql.clear;
    query2.sql.add('update a)
    query2.sql.add('set a1=....);
    query2.execopen;;
    程式运行后。把a表的a1值全改了
    哪位大哥讲讲
    ----------------------------------------------
      

  11.   

    呵呵。你的语句作用不就是这样么?
    'update a  set a1=....的作用就是修改a表的相应a1字段的全部值
      

  12.   

    query1与query2的作用是孤立的呀。他们之间根本没关系。所以query2根本不可能只修改query1查询到的值
      

  13.   

    哪我怎么样就用,query修改查询到的值吗。另外,updatesql+query可不可以查询语句在程式中写
    而不是程式运行之前就写在updatesql中
      

  14.   

    我一般是用两个QUERY,一个负责查询,一个负责修改
      

  15.   

    你主要问题在SQL语句上,你可以使用Left join on来连接表,具体查一下SQL语句,你使用Where一般都是适用于查询,而无法更新.
      

  16.   

    给你一个简单有效的方法:将表a加一个id标示字段(数字型每条记录自动增1的字段),然后修改你的两个query如下:
    query1.close;query1.sql.clear;
    query1.sql.add('select a.id,a.a1,a.a2,b.a1,b,b2 from a,b}
    query1.sql.add('wherea.a1=b.a1)
    query1.open;
    这是查询到的数据。然后我用query2
    i:=1;j:=1;K;=query1.recordcount;
    for i:=1 to k do 
    begin
      query1.next;
      if i=j+100 then//第隔100就修改/
         query2.close;
         query2.sql.clear;
         query2.sql.add('update a)
         query2.sql.add('set a1=....);
         query2.sql.add('where id='''+query1.fieldbyname('id').asinteger+'''');
         query2.open;
    .....
      endif如此,将两个query1和query2 通过ID字段连接起来了。你的query2才能修改正确记录。
      

  17.   

    对了,错了一点。那就是query2的最后方法不是OPen,而应该是execsql
      

  18.   

    继续修改你的程序:你的i,j,k的循环浪费了资源和时间,不符合程序规范的。
    query1.close;query1.sql.clear;
    query1.sql.add('select a.id,a.a1,a.a2,b.a1,b,b2 from a,b}
    query1.sql.add('wherea.a1=b.a1)
    query1.open;//上面都一样
    while not(query1.eof)do 
    begin     query2.close;query2.sql.clear;query2.sql.add('update a);query2.sql.add('set a1=....);
         query2.sql.add('where id='''+query1.fieldbyname('id').asinteger+'''');
         query2.open;
         query1.moveby(100);//query1向下跳转100条记录。
     .....
    end;
    endif
      

  19.   

    好的, bxyqt(碧血银枪)大哥。我回去试试你的方法吧,你给我指明了一个方向呀。你可不可以讲讲
    tudpate+query的用法.及.+table用法也是一样的吗。update的sql语句可以在运行时写吗,不是在设计时写。如上面你的教的方法。在update中怎么样用呀。最后一个问题。明天就给分
      

  20.   

    你的教的程式我不能进行,我改动了一下才可以,while not(query1.eof)do 
    begin     query2.close;query2.sql.clear;query2.sql.add('update a);query2.sql.add('set a1=....);
         query2.sql.add('where id=:id);     query2.parambyname('id').asinteger:=query1.fieldbyname('id').asinteger;
         query2.open;
         query1.moveby(100);//query1向下跳转100条记录。
     .....
    end;