固定的SQL语句中取回的数据表,根据需要部分列不能反应到客户端,必须保证列确实在前端不存在了,又不得影响数据的正常提交.
比如服务端传过来的有(A,B,C,D)列,我针对有些用户则不能让其显示和修改D但需要正常的编修ABC,也不能说简单的把控件的D列显示与否,一定得让前端的TClientDataSet中没有D.采用了很多种方法都没办到.
FieldDefs,Fields设置基本都无效果.
采用按需要字段重新赋值的方式,结果又不能提交回服务端(Delta变化)请高手出招.

解决方案 »

  1.   

    ClientDataSet1.FieldList.Delete(index);这个不行吗
      

  2.   

      i:=cdsDetailData.FieldList.Find('Price').Index;
      cdsDetailData.FieldList.Delete(i);
      执行的时候报错:cdsDetailData: Property is read-only
      

  3.   

    cdsDetailData.FieldByName('Price').Visible := False;
      

  4.   

    举例如下:
    方法有很多,现在举一个比较简单的给你:
    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.我只将代码写到一个按钮中去目的演示一下,如果效果更好应该是用一个数据表来记录各用户的相关显示修改权限,再从表中读出相关信息来做控制.
      

  5.   

    使用FieldByName('Price').Visible 如果界面上是比如DBGrid的控件只是可以隐藏列,如果是InfoPower的wwDBGrid连列都隐藏不了,还有如果采用
     for i:=0 to (fieldcount-1) do begin
     s:=s+(fields[i].asstring)+',';
     end; 
    这样的话列内容还是会出去的,求个更好的解决办法..
      

  6.   

    用非数据控件来显示、用SQL来提交修改
      

  7.   

    刚才没有考虑到WWDBGRID,用下面的应该可以吧。
    cdsDetailData.FieldByName('Price').Destroy;
      

  8.   

    或者用 cdsDetailData.FieldByName('Price').Destroy;
    执行这句后再打开数据。
      

  9.   

    谢谢各位的参与,DataSet中要想真正去掉一列可能是行不通的,Destory也会报错,
    我现在只能绕弯子去解决,就是在控件显示方面用
      i:=cdsDetailData.Fields.FindField('Price').Index;
      cdsDetailData.Fields[i].Visible:=false;
      dbgDetailData.RemoveField('Price',true);
    而在数据导出的时候再加上Fields[i].Visible去判断了但我想这个问题应该还是会有更好的办法,主要是运用在多用户对数据表的权限上面,范围还是比较广,希望大家多想想,经常会用的到..晚上再散分了.
      

  10.   

    DataSet中要想真正去掉一列可能是行不通的,Destory也会报错
    ==================================================
    destory之前肯定先要创建数据集的。这样就不会出错。