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.