我用adotable打开一个表,同时给它添加了一个计算字段。在OnCalcFields事件给它数据。然后我想在dbgrid的中,单击title的时候,按照倒叙或者顺序的方式排序(adotable的sort设置)。
怎么就计算字段无法使用adotable的sort属性来排序?

解决方案 »

  1.   

    为什么不用sql语句返回计算字段需要的数据?
      

  2.   

    有些数据我要在程序中写入的。我用的是adotable,那个计算字段的数据来源另外几个表。这些表都无法用sql语句获取。
      

  3.   

    那你就不要使用adotable来排序,你可以对grid进行排序
      

  4.   

    用clientdataset做过 adotable没有试过
      

  5.   

    procedure aGridTitleSort(Column: TbsColumn);
    var s,cFieldName:string;
        i:integer;
        DataSet:TDataSet;
        procedure setTitle;
        var ii:integer;
            cStr:string;
            c:TbsColumn;
        begin
          for ii:=0 to TbsSkinDBGrid(Column.Grid).Columns.Count-1 do
          begin
            c:=TbsSkinDBGrid(Column.Grid).Columns[ii];
            cStr:=c.Title.Caption;
            if (pos('▲',cStr)=1) or (pos('▼',cStr)=1) then begin
              Delete(cStr,1,2);
              c.Title.Caption:=cStr;
            end;
          end;
        end;
    begin
      setTitle;
      DataSet:=Column.Grid.DataSource.DataSet;
      if Column.Field.FieldKind=fkLookup then
        cFieldName:=Column.Field.KeyFields
      else if Column.Field.FieldKind=fkCalculated then
        cFieldName:=Column.Field.KeyFields
      else
        cFieldName:=Column.FieldName;
      if DataSet is TCustomADODataSet then begin
        s:=TCustomADODataSet(DataSet).Sort;
        if s='' then begin
          s:=cFieldName;
          Column.Title.Caption:='▲'+Column.Field.DisplayName;
        end
        else begin
          if Pos(cFieldName,s)<>0 then begin
            i:=Pos('DESC',s);
            if i<=0 then begin
              s:=s+' DESC';
              Column.Title.Caption:='▼'+Column.Field.DisplayName;
            end
            else begin
              Column.Title.Caption:='▲'+Column.Field.DisplayName;
              Delete(s,i,4);
            end;
          end
          else begin
            s:=cFieldName;
            Column.Title.Caption:='▲'+Column.Field.DisplayName;
          end;
        end;
        TCustomADODataSet(DataSet).Sort:=s;
      end
      else if DataSet is TClientDataSet then begin
    //    TClientDataSet(DataSet).IndexFieldNames:=Column.FieldName;
    /////////////////////////
        if TClientDataSet(DataSet).indexfieldnames<>'' then
        begin
          i:=TClientDataSet(DataSet).IndexDefs.IndexOf('i'+Column.FieldName);
          if i=-1 then
          begin
            with TClientDataSet(DataSet).IndexDefs.AddIndexDef do
            begin
              Name:='i'+Column.FieldName;
              Fields:=Column.FieldName;
              DescFields:=Column.FieldName;
            end;
          end;
          TClientDataSet(DataSet).IndexFieldNames:='';
          TClientDataSet(DataSet).IndexName:='i'+Column.FieldName;
          Column.Title.Caption:='▼'+Column.Title.Caption;//.Field.DisplayName;
        end
        else
        begin
          TClientDataSet(DataSet).IndexName:='';
          TClientDataSet(DataSet).IndexFieldNames:=column.fieldname;
          Column.Title.Caption:='▲'+Column.Title.Caption;//.Field.DisplayName;
        end;
    ////////////////////
      end;
    end;
      

  6.   

    dataset 无法对计算字段排序
      

  7.   

    ado没有提供一种对内存中的数据集操作的功能。比如排序。