ado数据集(断开连接)后,单条调整记录顺序

原始地址:http://blog.csdn.net/lwm08106542000/article/details/6594183

运行截图

//界面中,我们有时候需要,单条调整其记录顺序,上移,或者下移动某条记录的位置

//本文中,提供的方法,可以供参考.



 

//2011-07-09 09:30

unit uMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, Grids, DBGrids, ADODB;

type
  TfrmMain = class(TForm)
    AdoConn: TADOConnection;
    adoQry: TADOQuery;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    Button1: TButton;
    btnUp: TButton;
    btnDown: TButton;
    procedure Button1Click(Sender: TObject);
    procedure btnUpClick(Sender: TObject);
    procedure btnDownClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

function adoSwapRecord(mt:TDataSet;RecNoA,RecNoB:Integer):Boolean;
 function CopyRec():TStrings;
  var
    Index:Integer;
  begin
    Result := TStringList.Create();
    for Index := 0 to mt.Fields.Count - 1 do
    begin
      if mt.Fields[Index].IsNull then
        Result.AddObject('',TObject(1001))
      else
        Result.Add(mt.Fields[Index].AsString);
    end;
  end;
 
  procedure WriteRec(Data:TStrings;Flags:string);
  var
    Index:Integer;
  begin
    for Index := 0 to mt.Fields.Count - 1 do
    begin
      if Pos(mt.Fields[Index].FieldName,Flags) > 0 then Continue;
      if Integer(Data.Objects[Index]) = 1001 then
        mt.Fields[Index].Clear()
      else
        mt.Fields[Index].AsString := Data.Strings[Index];
    end;
  end;

 function getReadOnlyFields(mt:TDataSet):string;
 var
   Index:integer;
   FD:TFieldDef;
 begin
   Result := '';
   for Index := 0 to mt.FieldDefs.Count - 1 do
   begin
     FD := mt.FieldDefs.Items[Index];
     if (faReadonly in FD.Attributes) or
        (faFixed    in FD.Attributes) or
        (FD.DataType = ftAutoInc) then
       Result := Result + ',' + FD.Name;
   end;
 end;


var
  ItemsA,ItemsB:TStrings;
  Flags:string;// 不允许修改的字段
begin
  Result:= (RecNoA >=1) and
           (RecNoA<=mt.RecordCount) and
           (RecNoB >=1) and
           (RecNoB<=mt.RecordCount);
  if not Result then
    Exit;
  if RecNoA = RecNoB then
    Exit;

  Flags := getReadOnlyFields(mt);

  mt.RecNo := RecNoA;
  ItemsA := CopyRec();
  mt.RecNo := RecNoB;
  ItemsB := CopyRec();

  mt.RecNo := RecNoA;
  mt.Edit();
  WriteRec(ItemsB,Flags);
  mt.Post();

  mt.RecNo := RecNoB;
  mt.Edit();
  WriteRec(ItemsA,Flags);
  mt.Post();

  ItemsA.Free();
  ItemsB.Free();

end;

 

//打开数据集
procedure TfrmMain.Button1Click(Sender: TObject);
var
  SQL:string;
begin
  SQL := 'Select ID,UID,PWD,EmpName,InsertTime from a_gysuser';
  AdoConn.Connected := TRUE;
  //\\
  adoQry.SQL.Text := SQL;
  adoQry.Open();
  adoQry.Connection := nil; //断开与adoConnection 的连接
end;

 

//上移记录位置
procedure TfrmMain.btnUpClick(Sender: TObject);
begin
 adoSwapRecord(adoQry,adoQry.RecNo,adoQry.RecNo-1);
end;

 

//下移记录位置
procedure TfrmMain.btnDownClick(Sender: TObject);
begin
  adoSwapRecord(adoQry,adoQry.RecNo,adoQry.RecNo+1);
end;

end.

posted @ 2012-02-09 15:05  byronming  阅读(271)  评论(0编辑  收藏  举报