主DataSet是TClientDataSet,name是DataSetOrder,存合同数据,关键字段ID
子DataSet是TClientDataSet,name是DataSetProducts,存合同多个商品,外键字段OrderID,另外有一个RowNo,行号.
想要实现DataSetProducts通过外键与DataSetOrder关联,并按RowNo升序排列,请问如何实现?目前:
DataSetProducts.IndexFieldNames := 'OrderID';
DataSetProducts.MasterSource := DataSetOrder;
DataSetProducts.MasterFields := 'ID';
能实现关联,但不知道如何按RowIndex排序,请指点一二,多谢.我Delphi外行.

解决方案 »

  1.   


    这个是对dbgrid的指定列进行排序,原理就是这样你修改一下就可以用了procedure TGLBusinessMgr.aGridTitleSort(Column: TColumn);
    var s,cFieldName:string;
        i:integer;
        DataSet:TDataSet;
        procedure setTitle;
        var ii:integer;
            cStr:string;
            c:TbsColumn;
        begin
          for ii:=0 to TDBGrid(Column.Grid).Columns.Count-1 do
          begin
            c:=TDBGrid(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;