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。以上两上问题,请储侠讨论。
if (pfInUpdate in DataSet.FieldByName('B.FieldName').ProviderFlag) then
DataSet.FieldByName('B.FieldName').ProviderFlag := DataSet.FieldByName('B.FieldName').ProviderFlag - [pfInUpdate];
试试,好像 if applied 不一定表示真或假
我记的 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操作>>>>>>>>>>>
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是何意呀???能否解释一下。
Applied设定为true,则要自己写函数进行更新操作。
没错的
第二个问题 偶水平有限没看懂
Applied设定为true,则要自己写函数进行更新操作。
这个知道,我的意思不是这样子。你再仔细看看我的贴子(或者俺表达不清)。呵呵。。