救命 ClientDataSet Post 问题 ( 积分: 200 )

  • 主题发起人 主题发起人 maxim
  • 开始时间 开始时间
M

maxim

Unregistered / Unconfirmed
GUEST, unregistred user!
大侠们:
clientDataset.Data:=DataPrivoder.Data
DataPrivoder.DataSet:=TAdoQuery
TAdoQuery.SQL 如下:
Select N'' as Col,a.Code,b.Name from vCode a inner join vName b on a.Code=b.Code
我在查询结果修改了Col,保存时POST,系统总是提示该字段不能修改,请问是什么原因,该如何处理能修改保存,我不提交结果到数据库中
 
顶,别沉下去
 
这本身就是一只读SQL语句,与TClientDataSet无关
 
to dgtg0710
我知道是只读,问题是类似问题该如何处理!
 
N'' as Col 这是一个虚拟的列,他的属性是在取得元数据信息中是被置为只读的,我也用类似的操作过,后来研究了一天,终于搞定
用下列语句取得数据后
clientDataset.Data:=DataPrivoder.Data
DataPrivoder.DataSet:=TAdoQuery
TAdoQuery.SQL 如下:
Select N'' as Col,a.Code,b.Name from vCode a inner join vName b on a.Code=b.Code
然后定义另一个CliendDataSet2,ClientDataSet1中的数据,用下列函数复制过去,
Procedure CopyCDS(SourceCDS, TargetCDS:TClientDataSet);
var tpBM:TBookMark;
I:integer;
begin
with TargetCDSdo
begin
FieldDefs := SourceCDS.FieldDefs;
if FieldDefs.Count > 0 then
begin
For i:=0 to FieldDefs.Count - 1do
FieldDefs.Items.Attributes := FieldDefs.Items.Attributes -[faReadonly];
//重点,关键就在于这一句,一定要把列元数据中的只读属性去掉
CreateDataSet;
end
else
Exit;
if Not Active then
Active := True;
end;
tpBM := Nil;
with SourceCDSdo
try
DisableControls;
tpBM := GetBookMark;
First;
while not eofdo
begin
TargetCDS.Append;
for i:=0 to Fields.Count - 1do
if Assigned(Fields.OnGetText) then
TargetCDS.Fields.AsString := Fields.DisplayText
else
TargetCDS.Fields.Value := Fields.Value;
Next;
end;
Finally
if (RecordCount > 0) and (tpBM <> Nil) then
begin
if BookmarkValid(tpBM) then
GotoBookmark(tpBM);
FreeBookmark(tpBM);
end;
EnableControls;
end;
if TargetCDS.State in [dsInsert,dsEdit] then
TargetCDS.Post;
end;

这是从我代码中拷贝出来的,楼主其实自己还可以改装一下,比如只传递
DataProvider.Data (OleVariant) 就可以了
 
三层系统对于ClientDataSet的写数据有很多种,
其中用ClientDataSet1.ApplyUpdates(数字);
 
临时字段是不能修改的
 
雙擊AdoQuery 加入所有查詢的字段,把Col的ReadOnly設為False即可 TClientDataSet中Col的ReadOnly也要設為False
 
视图或者统计等临时子端是只读的无法修改
 
后退
顶部