目前的数据显示路线为:DBGrid->DataSource->ClientDataSet->DataSetProvider->AdoQuery,采用SqlServer数据库,显示的数据为一个多级分类汇总结果。
当前的问题是我需要对分类汇总结果进行一定的处理,可是发现无法修改ClientDataSet的内容(更让我纳闷的是可以删除整条记录)
如果修改当前记录的某个字段时,提示“can't be modified”的错误
附:修改代码举例
    self.ClientDataSet1.First;
    self.ClientDataSet1.Edit;
    self.ClientDataSet1.Fields[0].AsString:='00000';
这个问题很菜,但是还是希望高手指点,因为我能查的资料都查了(包括葵花宝典),郁闷ing

解决方案 »

  1.   

    只能修改源数据集,使用sql语句得到的分类汇总数据是只读的,当然不能修改。
      

  2.   

    试就把AdoQuery的RequestLive改为真!!
      

  3.   

    查一下是不是DataProvider的Options的poDisableEdits=True了。
      

  4.   

    中间层DataSetProvider控件的updatemode属性应该确认为upWhereAll。
      

  5.   

    谢谢大家的回答!
    star_of_light(星星之光)和chenquan(嘉威王子):DataSetProvider的属性设置没有问题。
    boynicky(鱼干儿):使用临时表是我一贯的做法,不过这次特殊需求不允许  :(我觉得好像不只是汇总的原因,因为我后来用AdoTable做了一下,也是同样的错误。
    有没有其他更好的思路?要不然只能偷着用临时表了
      

  6.   

    可以添加一个本地TClientDataSet(不连接远程数据库),ClientDataSet2:
    ClientDataSet2.Data := ClientDataSet1.Data;
    ClientDataSet1.Close;
    就可以对ClientDataSet2进行数据操作了。
      

  7.   

    maozefa(之源):这种方法好像也是同样的错误
    是不是本质上就是只读的?如果真是这样的话,我觉得TClientDataSet类的意义好像不是很大。
      

  8.   

    目前的数据显示路线为:DBGrid->DataSource->ClientDataSet->DataSetProvider->AdoQuery
    是不是写反了,我觉得应是:DBGrid<-DataSource<-ClientDataSet<-DataSetProvider<-AdoQuery
    你在修改完以后是不是applyupdate了,applyupdate是要将数据写回数据库,如果你只是要临时修改一个而不必回写到数据库的话用POST就可以了,CLIENTDATESET中的POST只是保存修改而不写入数据库,APPLYUPDATE则是写入数据库。但是上次我在使用ADO控件时如果在SQLSERVER中写有触发器则ADO会报错,现在还不清楚为何.