数据库使用的是 access2000,delphi用的是6.0表结构如下:  商品清单  : 货号(主键),名称....
  供货商清单: 供货商号(主键),名称
  采购单    : id (自动增长,主键),货号,供货商号,数量,单价..
  采购单历史:id (自动增长,主键),货号,供货商号,数量,单价..(基本跟采购单相同)
  采购单为输入时的表,正式确认后按一表单上的记帐按钮存入"采购订单历史".  (为了简单,采购单没有使用主从表,只使用了单一表)输入界面:
   DBNavigator , DBDGrid,adoConnetion ,记帐按钮
   AdoDataSet采购单  :  select id,货号,供货商号,数量,单价 from 采购单
   adoDataSet商品清单:  select 货号,品名     from 商品清单
   adoDataSet供货商  :  select 供货商号,名称 from 供货商清单   AdoDataSet采购单,添加全部字段后,添加2个Lookup字段。
   一个为 PinMing(品名):
          LookUpDataSet:  adoDataSet商品清单
          KeyField:       货号,
          LookupKeyFields:货号,
          LookupResult:   品名 
  一个为 Mingcheng(供货商名称)  LookUp字段的设置应该是没问题的。  现在问题是,在dbGrid新增一记录后,post 或移动记录,毫无问题,但假如再
修改新增的记录,比如修改数量或单价后若post或移动记录,就会提示
  "无法为更新定位行。一些值可能已在最后一次读取后已更改"问题在哪里?怎么解决,或是否应当采用其他方法?
     

解决方案 »

  1.   

    我发现,AdoDataSet采购单 字段不添加 id,就没事,但我其实使用的是 dxDBGrid,假如没有主键就不能使用排序等功能。这不是太不方便了吗? 请问大家在使用  dxDBGrid 过程中有什么经验吗?
      

  2.   

    有可能是你在更新当前表时,出现试图更另外一个表的现象(比如你的LookUp字段关联到另外数据表),而且那个另外表的一些不能为空的字段试图插入空值.
    如果是这样的话,你得已经处理,让当前只对一个表操作insert等
      

  3.   

    就是在 dxDBGrid 里面,挪到最后一行就是新增,输入完毕后移动记录不就保存了吗。AdoDataSet采购单 字段不添加 id,就没事,好好的,随便加,随便改。但dxDBGride必须要有一个 keyField 才能有排序等好多功能。(随便输入一个字段名作为KeyField也可以,但有的功能不好使)
      

  4.   

    刷新一次就可以了
    或close,open
      

  5.   

    确实是刷新一下就可以了,或用缓冲,集中update一下也行。我现在 AdoDataSet采购单 字段不添加 Id 了,
    但 DXDBGrid 需要 Keyfield 的问题大家是怎么解决的?
      

  6.   

    试试UpdateRecord和UpdateCursorPos看看,有什么结果贴出来一下