TDataSetProvider.BeforeUpdateRecord(...; Var Applied : boolean); 中,参数
Applied = True (默认) 表示让TDataSetProvider执行更新,
Applied = False 表示TDataSetProvider 忽略更新,由程序代码进行更新。
问题来了:begin
  Applied := False;
  if (条件)  then Applied := True;
  if Applied then begin
     ....
  end;
end;无论如何,不管Applied是真是假,TDataSetProvider 都忽略更新。如果写成:
begin
  if (条件) begin
    .....
    Applied := True;
  end;
end;
则可以执行正常,是何道理???未知各位侠们,有否遇此情况。TAdoQuery.SQl.Text := 'select A...., B.... from A left join B on A.Key = B.Key'
此TAdoQuery连接到TDataSetProvider,
TAdoQuery.AfterOpen();
begin
  主键.ProviderFlag := [pfInKey];
  其他键.ProviderFlag := [pfInUpdate];
end;只想更新A中的内容,而不想(也不需要)更新B中的内容,在ClientDataSet中更新A的内容,则新则没问题,而对B的内容有所更新时,需要防止DataSetProvider对B进行更新,故采用如下语句防止对B进行更新:1  . DataSet.FieldByName('B.FieldName').ProviderFlag := []
2  . if (pfInUpdate in DataSet.FieldByName('B.FieldName').ProviderFlag := DataSet.FieldByName('B.FieldName').ProviderFlag - [pfInUpdate];不论执行 1 或 2 都提示“Update语句执行错误”之类的错误信息,如果不执行 1 或 2,则提示“一个或多个参数未被指定值”之类的错误。可是教程资料,也是第2种写法(当然第一种是我自已写出来的),不过是在D5,而我用的是D7。以上两上问题,请储侠讨论。

解决方案 »

  1.   

    上面的第2句应该是:
    if (pfInUpdate in DataSet.FieldByName('B.FieldName').ProviderFlag) then
      DataSet.FieldByName('B.FieldName').ProviderFlag := DataSet.FieldByName('B.FieldName').ProviderFlag - [pfInUpdate];
      

  2.   

    if Applied = true then
    试试,好像 if applied 不一定表示真或假
      

  3.   

    楼主:
    我记的 Applied = True 意思是已更新过了(appliED麻),所以实为不更新。要对某字段不进行更新操作,改cds的字段的providerFlagS(有s的)
    if cdsDataSet.Fields[i].FieldName=FDsBillHeadInfo.FieldByName('DispName').AsString then
           begin
              cdsDataSet.Fields[i].ProviderFlags:=cdsDataSet.Fields[i].ProviderFlags-[pfInUpdate];
              break;
           end;
             //<<<<<<<<<<[pfInUpdate]也可标识是否insert操作>>>>>>>>>>>
      

  4.   

    foxe(火狐) 
    if Applied = true then
    试试,好像 if applied 不一定表示真或假如果 if Applied then 不成立而 if Applied = TRUE then 成立的话,我倒。
    我喜欢用 if Applied then 此类的写法,一直很正常的呀。cocoboy79(准备成为高手) 
    我记的 Applied = True 意思是已更新过了(appliED麻),所以实为不更新。的确,Applied = True 时表示已经更新过了,让TDataSetProvider忽略更新。但请仔细读我上面所贴的源码框架。所表示的是:在事件中,Applied的值不能出现True和False,如果需要让TDataSetProvider更新,则不能给Applied赋任何值(TRUE or FALSE),好像是一赋值,就会忽略更新一样。就如上面的 Applied := False; 让它保留原值,就会执行更新(当然TRUE的时候不会执行更新)。
    if cdsDataSet.Fields[i].FieldName=FDsBillHeadInfo.FieldByName('DispName').AsString then 中,
    FDsBillHeadInfo.FieldByName('DispName').AsString是何意呀???能否解释一下。
      

  5.   

    Applied设定为false,则会自动生成sql语句来做更新操作。
    Applied设定为true,则要自己写函数进行更新操作。
    没错的
    第二个问题 偶水平有限没看懂
      

  6.   

    或许我没注意吧,我以前用的时候是出现过问题,所以保险起见我就写的很清楚了&_&,你的问题可能帮不上忙,帮你DING一下
      

  7.   

    decem(天地) Applied设定为false,则会自动生成sql语句来做更新操作。
    Applied设定为true,则要自己写函数进行更新操作。
    这个知道,我的意思不是这样子。你再仔细看看我的贴子(或者俺表达不清)。呵呵。。