在一个表中复制一条同样的记录到同一个表中,只修改主键内容(200分)

  • 主题发起人 主题发起人 yobdrow
  • 开始时间 开始时间
Y

yobdrow

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,有什么好办法
 
摘自:HUBDOG大虾的葵花宝典

通常,你完成此项任务时使用 TBatchMove 构件。但 TBatchMove 也有不合适的情况:
- 你并不希望拷贝所有的记录,也不想使用过滤器。
- 你希望用到目的 DataSet 的有效事件(如 BeforPost,OnValidate,等)。
- 或者更坏的情况,两 DataSet 的结构并不相同。
使用下面的简单过程,上面的问题都可以被解决,所有字段中的数据将被拷贝到另外一个 Dataset 中的同名字段中。但这里面也存在一些限制:
- 不能拷贝查找和计算字段
- 当存在相同字段名但数据类型不同时,你需要先使用 Assign 判断。
- 当然,目的字段不能是只读的。

procedure CopyRecord(Source, Destination: TDataSet);
var Ind:longint;
SField, DField: TField;
begin
for Ind:=0 to Source.FieldCount - 1 do
begin
SField := Source.Fields[ Ind ];
DField := Destination.FindField( SField.FieldName );
if (DField <> nil) and (DField.FieldKind = fkData) and
not DField.ReadOnly then
if (SField.DataType = ftString) or
(SField.DataType <> DField.DataType) then
DField.AsString := SField.AsString
else
DField.Assign( SField )
end;
end;

旧方法:

DEST.Open;
ORIGIN.Open;
while not ORIGIN.Eof do
begin
if ORIGINTYPE.AsString = 'T' then
with ORIGIN do
begin
DEST.Append;
DEST.FieldByName('TYPE').AsString := ORIGINTYPE.AsString;
DEST.FieldByName('FIRSTNAME').AsString := ORIGINFIRSTNAME.AsString;
DEST.FieldByName('LASTNAME').AsString := ORIGINLASTNAME.AsString;
DEST.FieldByName('CPF').AsString := ORIGINCPF.AsString;
DEST.FieldByName('PARTY').AsString := ORIGINPARTY.AsString;
DEST.Post;
end;
ORIGIN.Next;
end;

使用该过程的调用示范:

DEST.Open;
ORIGIN.Open;
while not ORIGIN.Eof do begin
if ORIGINTYPE.AsString = 'T' then begin
DEST.Append;
CopyRecord( ORIGIN, DEST );
DEST.Post;
end;
ORIGIN.Next;
end;
 
假设你给一个人员表a复制记录,id是主键(整型值),就可以这样写:
insert into a (id,name,sex,age) select 2,name,sex,age from a where id=1;
 
我在ORACLE中测试成功。
Create Table Test
(ID varchar2(5),
Name Varchar2(50)
);
insert into test values('10000','ABC');
insert into test select ID+1,Name from test where ID='10000';
你只要动态的改ID+1和后面的条件ID=10000就可以了。其它的数据库,只要支持SQL的都差不
多。
 
用Insert into ... Select ... SQL语句就搞定了。
先找到那个表中最大的主键值MaxKeyValue,然后用下面的SQL:
insert into TableName(ID, FieldList) select ID + MaxKeyValue, FieldList from TableName;
 
我用的是ado+access,有多个表的内容需要复制,而且是每个表的内容复制后放在本身那个表中

access不支持create table tablename as selecet *.....的吗

 
这跟多个表没有关系啊, 你只要对每个表执行一下那个语句就行了。
你查一查ACCESS的帮助吧,里面说得太详细了!
 
朋友们,我自己已经解决,友情送分了,哈哈
 

Similar threads

回复
0
查看
995
不得闲
D
回复
0
查看
881
DelphiTeacher的专栏
D
D
回复
0
查看
850
DelphiTeacher的专栏
D
后退
顶部