代码如下:
procedure TForm1.ClientDataSet1AfterApplyUpdates(Sender: TObject;
var OwnerData: OleVariant);
begin
ClientDataSet1.open;
ClientDataSet1.first;
StrSQL:='select * from Output';
ClientDataSet2.CommandText:=StrSQL;
while not ClientDataSet1.eof do
begin
if ClientDataSet1.Fields[9].AsBoolean = True and ClientDataSet1.Fields[11].AsBoolean = True then
begin
ClientDataSet2.Open;
ClientDataSet2.Append;
ClientDataSet2.FieldByName('序号').AsString:=ClientDataSet1.FieldByName('序号').AsString;
ClientDataSet2.FieldByName('点号').AsString:=ClientDataSet1.FieldByName('点号').AsString;
ClientDataSet2.post;
ClientDataSet2.ApplyUpdates (0);
end;
end;
ClientDataSet1.Next;
end;
procedure TForm1.ClientDataSet1AfterApplyUpdates(Sender: TObject;
var OwnerData: OleVariant);
begin
ClientDataSet1.open;
ClientDataSet1.first;
StrSQL:='select * from Output';
ClientDataSet2.CommandText:=StrSQL;
while not ClientDataSet1.eof do
begin
if ClientDataSet1.Fields[9].AsBoolean = True and ClientDataSet1.Fields[11].AsBoolean = True then
begin
ClientDataSet2.Open;
ClientDataSet2.Append;
ClientDataSet2.FieldByName('序号').AsString:=ClientDataSet1.FieldByName('序号').AsString;
ClientDataSet2.FieldByName('点号').AsString:=ClientDataSet1.FieldByName('点号').AsString;
ClientDataSet2.post;
ClientDataSet2.ApplyUpdates (0);
end;
end;
ClientDataSet1.Next;
end;
ApplyUpdates会自动调用Reconcile函数,进而调用应用服 务器上的TProvider构件的ApplyUpdates函数去更新远程的数据库服务器。没有被DBMS服务器认可的记录通过Reconcile返回给 客户端,此时将在客户端触发OnReconcileError事件让您更正错误。最后,ApplyUpdates函数返回仍然没有被认可的记录数。
while not ClientDataSet1.eof do
begin
if ClientDataSet1.Fields[9].AsBoolean = True and ClientDataSet1.Fields[11].AsBoolean = True then
begin
ClientDataSet2.Open;
ClientDataSet2.Append;
ClientDataSet2.FieldByName('序号').AsString:=ClientDataSet1.FieldByName('序号').AsString;
ClientDataSet2.FieldByName('点号').AsString:=ClientDataSet1.FieldByName('点号').AsString;
ClientDataSet2.post;
ClientDataSet2.ApplyUpdates (0);
ClientDataSet1.Delete;
ClientDataSet1.ApplyUpdates (-1);
end;
end;
end;
ClientDataSet1.Next;
end;
运行后会出现not in edit or insert mode的错误。
cds_1.ApplyUpdates(0) ;
cds_1.ApplyUpdates(0) ;
改掉后之后,运行程序会出现clientdataset1“Record not found or changed by another user的错误
cds_1.ApplyUpdates(0) ;
改掉后之后,运行程序会出现clientdataset1“Record not found or changed by another user的错误不应该啊,把你的demo发过来试试
var
StrSQL,Todata:string;
begin
StrSQL:='select * from Output';
ClientDataSet2.CommandText:=StrSQL;
ClientDataSet1.open;
ClientDataSet1.first;
while not ClientDataSet1.eof do
begin
if ClientDataSet1.Fields[9].AsBoolean = True then
begin
ClientDataSet1.Edit;
ClientDataSet1.FieldByName('运维班核对人').AsString:=loginForm.edit2.Text;
ClientDataSet1.Post;
end;
if ClientDataSet1.Fields[11].AsBoolean = True then
begin
Todata:=datetostr(Date());
ClientDataSet1.Edit;
ClientDataSet1.FieldByName('监控核对人').AsString:=loginForm.edit2.Text;
ClientDataSet1.FieldByName('核对日期').AsString:=Todata;
ClientDataSet1.Post;
end;
if ClientDataSet1.Fields[9].AsBoolean = True then
begin
if ClientDataSet1.Fields[11].AsBoolean = True then
begin
ClientDataSet2.Open;
ClientDataSet2.Append;
ClientDataSet2.FieldByName('运维班核对人').AsString:=ClientDataSet1.FieldByName('运维班核对人').AsString;
ClientDataSet2.FieldByName('监控核对人').AsString:=ClientDataSet1.FieldByName('监控核对人').AsString;
ClientDataSet2.FieldByName('核对日期').AsString:=ClientDataSet1.FieldByName('核对日期').AsString;
ClientDataSet2.post;
ClientDataSet2.ApplyUpdates (0);
ClientDataSet1.Delete;
ClientDataSet1.ApplyUpdates (0);
end;
end;
ClientDataSet1.next;
end;
end;
lz注意下,这可能有两种原因
1.TDataSetProvidor UpdateMode请设置成upWhereKeyOnly,ResolveToDataSet设置成false,服务器的query打开后需要设置主键,和数据库相同即可,如
qry1.Open;
qry1.FieldByName('JobType').ProviderFlags := qry1.FieldByName('JobType').ProviderFlags+[pfInKey];
qry1.FieldByName('JobNo').ProviderFlags := qry1.FieldByName('JobNo').ProviderFlags+[pfInKey];
qry1.FieldByName('BoardNo').ProviderFlags := qry1.FieldByName('BoardNo').ProviderFlags+[pfInKey];
2.你要更新的表如果有触发器的话,可能触发器写的有问题,里面没有加头尾加
set rowcount off
....
set rowcount on