服务器端ADODataSet -> DataSetProvider -> RemObject ->客户端 ClientDataset -> 在cxGrid中显示“记录表”与“人名表、产品名表”连接
后两张名称表都是“ID, 名称”这样的字段,固定不更新;
记录表中是“ID, 日期, 人名ID, 产品名ID, 数量, 备注”这样的字段。
连接后得数据集字段“记录表.ID, 日期, 人名ID, 产品名ID, 数量, 备注, 人名表.名称, 产品名表.名称”。
只要求更新记录表,而名称表不动。之前提过问题http://topic.csdn.net/u/20090226/14/19d4b638-baf3-4a72-bfac-2e0fe8c376c3.html,也看了很多帖子,总结一下,说是要把数据集(ADODataSet)里不更新的字段“人名表.名称, 产品名表.名称”的属性ProviderFlags.pfInWhere,pfInUpdate都设置为False,而客户端对连接后的表的所有字段赋值,然后可以像更新单表一样更新。不知道我这样理解有没有错?如果“记录表”中要更新的字段在“连接表”中也存在,就可以直接在连接表中对其赋值,它会自动保存到“记录表”中?所以我的连接表中本来不要“人名ID, 产品名ID”,但为了能更新,所以也要取过来?别人似乎这样做都成功了,可是我怎么做都是错误,把DataSetProvider.UpdateMode设为upWhereKeyOnly也不行,ADODataSet.CommandText中也是取连接表的语句,只不过真正取到客户端时多了些 where 限制而已。
我到底哪里错了呢?急!救命啊!!

解决方案 »

  1.   

    DataSetProvider 的 [poAllowCommandText] 设为true
      

  2.   

    只需在 datasetProvider.OnGetTableNamez指定需要更新的表即可,如
    tableName := '记录表';DataSetProvider 的 [poAllowCommandText] 设为true ,意思是:client可以向ap端傳遞sql語句
      

  3.   

    楼上两位,我把你们的方法都试过了,还是不行。不过我也觉得就是设置的问题,再帮我看看1.“连接表(ADODataSet)”中来自“名称表”的各不要更新字段的属性ProviderFlags的[pfInUpdate,pfInWhere]都设为False;
    2.DataSetProvider.UpdateMode设为upWhereKeyOnly;(另几种也都分别试过了)
    3.DataSetProvider 的 [poAllowCommandText] 设为true;//其它条件不同时,这里都true、False试过
    3.
    procedure TDSService.DSPGetTableName(Sender:TObject;DataSet:TDataSet;var TableName:String);
    begin
      //DataSet:=ADODataSet1;//放不放都试过了
      TableName:='JlTable';//JlTable是记录表名
    end;
    4.“连接表”的ADODataSet.CommandText默认就是“left join XX on”这样的取表语句;
    5.客户端 ClientDataset.ProviderName设为“连接表”所对应的DataSetProvider名;
    6.在ClientDataset中对连接表里的所有字段赋值;
    7.ApplyUpdates()通过RemObject上传。单张表时只要4、5、6、7这几步就行了,但连接表就是不行。
      

  4.   

    设置ADODataSet的字段的ProviderFlags属性即可。
      

  5.   

    不需設定第二個步驟;
    設定tablename後,
    確認DataSetProvider.resovelToDataSet是否為True? 若為true,改為false
      

  6.   

    楼主还没解决吗?
    设置数据集主键的ProviderFlags中pfInkey的为True
      

  7.   

    第二步不设置,就是使用默认属性updateMode:=upWhereAll,
    resovelToDataSet默认就是False,没改动。
    结果还是不行,完全没变化。是指设置“连接表”中字段“记录表.ID”的属性ProviderFlags:=[pfInUpdate,pfInWhere,pfInKey]吗?
    那其它几个也需要更新的字段是否保持默认属性[pfInUpdate,pfInWhere]?(名称表所属字段已经改为[]了)
    可是这样做也是一点变化也没有,完全不行。很有可能和这个有关,可是我不太理解,我的名称表分别与好几张不同的记录表相连接的,并且每张名称表都另外单独分配一个ADODataSet,作为一张独立的表读取,用来设置名称用。
    是否说的是这个原因?如果是,那这个问题要怎么解决呢?不可能不添加新名称吧?
    而且我试着把几个名称表的ADODataSet全断开,只读取一张连接表,却还是老样子,一直是Provider.ApplyUpdates时,说ErrorCount>0了,不能更新。
      

  8.   

    能不能麻烦哪位高手也把这个步骤从头到尾写一下?
    3楼我那样的步骤肯定有错误,一直到7楼为止各位大大说的再加上去也没有变化,应该是还少了什么。
    请从取得连接表后,各数据控件设置属性开始,一直到ApplyUpdates(),这中间所有的属性设置、注意事项等,完整的写下来好吗?我用到的控件是:服务器端ADODataSet -> DataSetProvider -> RemObject ->客户端 ClientDataset -> 在cxGrid中显示
    显示的是读取的是连接表,我现在只要更新记录表中的数据,但名称表在其它地方有单独读取,有需要时也会添加一下名称的。
      

  9.   


    数据集主键的ProviderFlags中pfInkey的为True