如何交换数据库中的两条记录的位置?(50分)

  • 主题发起人 主题发起人 zgp
  • 开始时间 开始时间
Z

zgp

Unregistered / Unconfirmed
GUEST, unregistred user!

请问有什么办法可对数据库中的任意两条记录交换位置,就象LISTBOX中的EXCHANGE命令一样.
 
1.用什么数据库?
2.什么enchange命令?
 
有必要吗?
1、一般数据库有主键,数据库自动按其排序,改变主键,顺序自动改变;
2、逻辑上可按索引排序,索引关键字改变,顺序自动改变;
3、胡乱改变不是很混乱?
 
有些数据库就象没有物理顺序一样,以key键和索引为主。
 
就算要改:
1、没有 EXCHANGE
3、建立临时表/直接用变量,复制记录,进行交换,不要告诉我你不会利用第三个变量交换两个变量
 
EXCHANGE,其实只是交换MASTER KEY的值
 
我的主要目的是将相邻的两条记录进行交换,将指定记录移到数据库的任何位置.

我是这样实现的(如下),我个人认为这种方法很麻烦(当设计字符串较多时)

各位看看以为如何?

procedure TForm1.Button1Click(Sender: TObject); //往上移动
var str1,str2:string;
begin
str1:=table1.Fields[0].asstring;
table1.Next;
str2:=table1.Fields[0].asstring;
table1.Edit;
table1.Fields[0].asstring:=str1;
table1.Prior;
table1.Edit;
table1.Fields[0].asstring:=str2;
table1.next;
end;

procedure TForm1.Button2Click(Sender: TObject); // 往下移动
var str1,str2:string;
begin
str1:=table1.Fields[0].asstring;
table1.prior;
str2:=table1.Fields[0].asstring;
table1.Edit;
table1.Fields[0].asstring:=str1;
table1.Next;
table1.Edit;
table1.Fields[0].asstring:=str2;
table1.Prior;
end;

 
这段代码可用来创建任何table,只要设置tablename,和databasename:

procedure TForm1.Createtable(Sender: TObject);
var
MyTable: TTable;
MyDataSource: TDataSource;
MyGrid: TDBGrid;
begin
MyTable := TTable.Create(Self);

with MyTable do
begin
DatabaseName := 'waxico';
TableName := 'Test';
OnCalcFields := TaxAmountCalc;

with FieldDefs do
begin
Add('ItemsTotal', ftCurrency, 0, false);

FieldDefs[0].CreateField(MyTable);
Add('TaxRate', ftFloat, 0, false);
FieldDefs[1].CreateField(MyTable);
TFloatField(Fields[1]).DisplayFormat := '##.0%';
TaxAmount := TFloatField.Create(MyTable);

with TaxAmount do
begin
FieldName := 'TaxAmount';
Calculated := True;
Currency := True;
DataSet := MyTable;
Name := MyTable.Name + FieldName;
MyTable.FieldDefs.Add(Name, ftFloat, 0, false);
end;
end;
MyTable.CreateTable;

end;

MyDataSource := TDataSource.Create(Self);
MyDataSource.DataSet := MyTable;
MyGrid := TDBGrid.Create(Self);

with MyGrid do
begin
Parent := Self;
Align := alClient;
DataSource := MyDataSource;
end;

MyTable.Active := True;
Caption := 'New table ' + MyTable.TableName;
end;
 
to zgp:
你的方法“当设计字符串较多时,是很麻烦”,最好是执行SQL语句,直接修改主键或索引,我的程序中有交换任意两个相邻记录的功能就是这么实现的。
 
既然直接用TTable, 那好办:
var
buffer1: pchar;
buffer2: pchar;
l: Integer;
begin
...... // goto rec u wanna change
l := table1.recordsize;
buffer1 := allocmem(l);
buffer2 := allocmem(l);
table1.getcurrentrecord(buffer1);
...... // goto next rec
table1.getcurrentrecord(buffer2);
move(buffer1^, table1.activebuffer^, l);
table1.flushbuffers;
...... // goback to prev-rec
move(buffer2^, table1.activebuffer^, l);
table1.flushbuffers;
freemem(buffer1, l);
freemem(buffer2, l);
end;
 
多人接受答案了。
 
后退
顶部