固定的SQL语句中取回的数据表,根据需要部分列不能反应到客户端,必须保证列确实在前端不存在了,又不得影响数据的正常提交.
比如服务端传过来的有(A,B,C,D)列,我针对有些用户则不能让其显示和修改D但需要正常的编修ABC,也不能说简单的把控件的D列显示与否,一定得让前端的TClientDataSet中没有D.采用了很多种方法都没办到.
FieldDefs,Fields设置基本都无效果.
采用按需要字段重新赋值的方式,结果又不能提交回服务端(Delta变化)请高手出招.
比如服务端传过来的有(A,B,C,D)列,我针对有些用户则不能让其显示和修改D但需要正常的编修ABC,也不能说简单的把控件的D列显示与否,一定得让前端的TClientDataSet中没有D.采用了很多种方法都没办到.
FieldDefs,Fields设置基本都无效果.
采用按需要字段重新赋值的方式,结果又不能提交回服务端(Delta变化)请高手出招.
cdsDetailData.FieldList.Delete(i);
执行的时候报错:cdsDetailData: Property is read-only
方法有很多,现在举一个比较简单的给你:
1.ClientDataSet1的sql语句为(select x_a,x_b,x_c from x_eng).2.我要控制其中一个用户无法显示字段:x_a,x_c3.我用DBEdit控件显示字段的,那么控制代码如下:procedure TForm1.Button1Click(Sender: TObject);
var
str:string;
i:integer;
begin
str:='x_a,x_c';
for i :=0 to ComponentCount - 1 do
if Components[i] is TDBEdit then
if pos(TDBEdit(Components[i]).Field.FieldName,str)>0 then
TDBEdit(Components[i]).Visible:=false;
end;
4.我只将代码写到一个按钮中去目的演示一下,如果效果更好应该是用一个数据表来记录各用户的相关显示修改权限,再从表中读出相关信息来做控制.
for i:=0 to (fieldcount-1) do begin
s:=s+(fields[i].asstring)+',';
end;
这样的话列内容还是会出去的,求个更好的解决办法..
cdsDetailData.FieldByName('Price').Destroy;
执行这句后再打开数据。
我现在只能绕弯子去解决,就是在控件显示方面用
i:=cdsDetailData.Fields.FindField('Price').Index;
cdsDetailData.Fields[i].Visible:=false;
dbgDetailData.RemoveField('Price',true);
而在数据导出的时候再加上Fields[i].Visible去判断了但我想这个问题应该还是会有更好的办法,主要是运用在多用户对数据表的权限上面,范围还是比较广,希望大家多想想,经常会用的到..晚上再散分了.
==================================================
destory之前肯定先要创建数据集的。这样就不会出错。