用Query根据查询条件得到的记录在dbgrid中,
怎样能够对其编辑保存,系统告诉我是只读的

解决方案 »

  1.   

    你用的是QUERY组件,那么你的数据源一定是来自多个表吧!
    SQL语句如: select a.*,b.* from a,b也就是说,你用的是DELPHI的BDE来开发数据库软件!因为BDE可以说现在已进入了衰退期,没有什么前景,而且最关键的一点是:它不支持对数据表的查询结果进行多表更新!(也就是为什么你会有提示:数据源是只读的)建议:不要用BDE,用MS的ADO来编吧!
      

  2.   

    Drate,我会要干完工作了,很急着用,我的数据来自一个表,能有法补救吗?
    Query能对一个表进行更新吗?
      

  3.   

    dbgrid1.ReadOnly:=true;
    兄弟的意思是改为false吧,不行的
      

  4.   

    Query支持对一个表的更新的!当然,QUERY还有可能支持对视图的更新!(因为视图的更新是由数据库来完成的,而不是由BDE来完成的)所以,如果是一个表的话,就是QUERY直接更新!如果要有多个表的话,那就在数据库中写成视图,然后就可以直接用QUERY来更新了!
      

  5.   

    什么数据库?试试在select 语句后加上for update
      

  6.   

    很简单的access数据库,用的是其中的一个表
      

  7.   

    还有如果用ADO连接看看connectionString里是否Mode=ReadWrite
      

  8.   

    用ADOQuery的connectstring如下Provider=MSDASQL.1;Persist Security Info=False;Data Source=ky关键在Query中怎样实现
      

  9.   

    实现很容易阿TADOQuery.edit
    TADOQuery.insert
    TADOQuery.post
      

  10.   

    用adodataset1.commandtext:='select * from b1';
      adodataset1.open
    ok
      

  11.   

    都没说到要点!
    要这样query.requestlive:=true
    包你能行
      

  12.   

    建议你改用ADO吧!ADO支持多表更新!
      

  13.   

    当然用adoquery是可以实现的,俺想问在query中如何实现?
      

  14.   

    query中实现方法:
    将query中得到的结果放到一个临时表中,
    将BDGRID的TABLENAME设为临时表
    就可以了,我已经实现了这样的功能!
    百分百可以!
      

  15.   

    pdbird(老巢)
    水平比较菜
    能请你说的详细一点吗?帮帮小弟吧!
      

  16.   

    不用临时表的requestlive属性就行,我以前也用bded的,可以的
      

  17.   

    if Application.MessageBox('修改信息?','提示',mb_IconInformation+mb_okcancel)=mrOk then
      begin
        DMFrm.QrCl.RequestLive:=true;
      end;
    然后在与query相连的dbgrid中还是不能够修改阿什么原因阿
      

  18.   

    同意 ain2000(太上老君急急如令)
      

  19.   

    不用临时表的requestlive属性就行,我以前也用bded的,可以的
      

  20.   

    程序里用datasource.autoedit:=true or =false 就可以控制能否修改
      

  21.   

    不用Query,改用Table,吧sql语句写成filter
      

  22.   

    其实用TQuery和TUpdateSQL两个组件应行啦,
    把TQuery.UpdateObject设为TUpdateSQL,并设置TUpdateSQL的语句就行啦(通过点击Delphi会自然生成)
      

  23.   

    就是简单的个
    query.requestlive:=true
    分别给我,有人说对了
      

  24.   

    傻瓜!你是(来自一个表情况!,就是RequestLive呀!)
    if Query1.SQL语句 = 来自一个表 then
    begin
      Query1.RequestLive:= true;
      DBGrid1.ReadOnly:= False;
    end else
    begin
      也许有必要用ADO,我以前是对多表查询结果集进行修改时用了ADO,然后
      修改后你有必要在Query1的记录被修改事件里面写对应的另外表更新语句。
      //Drate 说的对。
    end;
      

  25.   

    你是不是用个dxDBGrdi控件,把它的LoadAllRecord属性设置为FALSE;
      

  26.   

    我正在写的一个程序中的有关更新的代码,一共参考。我以将qr_goods_out 的requestlive :=TRUE  cacheupdate=True.
    并且qr_goods_out 的纪录是从一个视图里取来的。
    完确实现多表更新。procedure Tfr_goods_out.btn_mdfyClick(Sender: TObject);
    begin
    try
       if btn_mdfy.Tag=0 then
        begin
           dm.Database1.StartTransaction;
           btn_mdfy.Tag:=1;
           dbgrid1.SelectedField.FocusControl;
           btn_mdfy.Caption:='确认修改';
           dbgrid1.ReadOnly:=false;
         end
      else
        begin
           btn_mdfy.Tag:=0;
           btn_mdfy.Caption:='修改';
           dbgrid1.ReadOnly:=true;
           dm.qr_goods_out.ApplyUpdates;
           dm.Database1.Commit;
           dm.qr_goods_out.CommitUpdates;
           cmb_ck_idChange(sender);
        end;
        pub.all_goods_out(cmb_ck_id.Text);
        edt_mustpay.Text:=format('%m',[pub.goods_money_pay('goods_out','bill_id_out',cmb_ck_id.Text)]);
     except
       begin
         dm.Database1.Rollback;
         messagebox(fr_goods_out.Handle,'纪录修改未能成功!',
                          '系统提示信息',mb_iconwarning+mb_ok+mb_taskmodal);
       end;
     end;
    end;
      

  27.   

    看看它的UpdateRecordType属性和UpdateMode属性!
      

  28.   

    好像只是改变一下那个auto什么地属性!将boolean改反过来
      

  29.   

    还有,SQL语句中不能有ORDER BY