注册 登录
编程论坛 VFP论坛

请教dbf表排序

hyf8285 发布于 2022-07-12 11:27, 2759 次点击
请教大佬:现有一个表结构如下,想实现这样的效果,如果把c移到最上,则c的序号变为1,a变为2,b变为3,d还是4,e还是5,请问如何实现?谢谢!
字段     序号      新序号
 a         1          2
 b         2          3
 c         3          1
 d         4          4
 e         5          5
24 回复
#2
mywisdom882022-07-12 11:50
无规律,无法批量处理
如果非要做,只能交换位置
#3
sdta2022-07-12 12:14
按RECNO()重新排序试试
#4
hyf82852022-07-12 12:16
回复 2楼 mywisdom88
是的,就是要交换位置,想知道如何交换?就是交换后要重新排,记录前面的要变,记录后面的不变
#5
csyx2022-07-12 12:21
select 字段, 新序号 as 序号 from 原表 order by 2 into dbf 新表
#6
wengjl2022-07-12 12:24
以下是引用hyf8285在2022-7-12 11:27:37的发言:

请教大佬:现有一个表结构如下,想实现这样的效果,如果把c移到最上,则c的序号变为1,a变为2,b变为3,d还是4,e还是5,请问如何实现?谢谢!
字段     序号      新序号
 a         1          2
 b         2          3
 c         3          1
 d         4          4
 e         5          5

go 1
x=字段
go 3
y=字段
repl 字段 with x
go 1
repl 字段 with y
#7
sdta2022-07-12 12:32
CREATE CURSOR tt (字段 c(1), 序号 n(2))
INSERT INTO tt VALUES ("a", 1)
INSERT INTO tt VALUES ("b", 2)
INSERT INTO tt VALUES ("c", 3)
INSERT INTO tt VALUES ("d", 4)
INSERT INTO tt VALUES ("e", 5)
SELECT * FROM tt WHERE 字段 = "c" INTO CURSOR tt1 READWRITE
INSERT INTO tt1 SELECT * FROM tt WHERE 字段 != "c"
REPLACE 序号 WITH RECNO() ALL
BROWSE
#8
hyf82852022-07-12 12:33
感谢各位大佬,这只是其中的一种情况,我想任意实现移动记录,比如,我想把d移到第一个,或者把b移到第一个,移动的记录是不固定的
#9
sdta2022-07-12 12:42
CREATE CURSOR tt (字段 c(1), 序号 n(2))
INSERT INTO tt VALUES ("a", 1)
INSERT INTO tt VALUES ("b", 2)
INSERT INTO tt VALUES ("c", 3)
INSERT INTO tt VALUES ("d", 4)
INSERT INTO tt VALUES ("e", 5)
lc = "c"
SELECT * FROM tt WHERE 字段 = lc INTO CURSOR tt1 READWRITE
INSERT INTO tt1 SELECT * FROM tt WHERE 字段 != lc
REPLACE 序号 WITH RECNO() ALL
BROWSE
#10
mywisdom882022-07-12 13:07
以下是引用hyf8285在2022-7-12 12:33:10的发言:

感谢各位大佬,这只是其中的一种情况,我想任意实现移动记录,比如,我想把d移到第一个,或者把b移到第一个,移动的记录是不固定的

是不是要这样的效果,
原来
只有本站会员才能查看附件,请 登录

变化
只有本站会员才能查看附件,请 登录
#11
mywisdom882022-07-12 13:16
CREATE CURSOR t0(序号 i,姓名 C(10),其他 C(10))
INSERT INTO T0(序号,姓名,其他) VALUES(1,'A1','其他1')
INSERT INTO T0(序号,姓名,其他) VALUES(2,'A2','其他2')
INSERT INTO T0(序号,姓名,其他) VALUES(3,'A3','其他3')
INSERT INTO T0(序号,姓名,其他) VALUES(4,'A4','其他4')
INSERT INTO T0(序号,姓名,其他) VALUES(5,'A5','其他5')
INSERT INTO T0(序号,姓名,其他) VALUES(6,'A6','其他6')

BROWSE

swap(2,5,'t0')

BROWSE


FUNCTION swap(n1,n2,dbf1)
 SELECT * FROM (dbf1) WHERE 序号 = n1 INTO ARRAY a1
 SELECT * FROM (dbf1) WHERE 序号 = n2 INTO ARRAY a2
 SELECT (dbf1)
 GO n1
 GATHER FROM A2
 REPLACE 序号 WITH n1
 GO n2
 GATHER FROM A1
 REPLACE 序号 WITH n2
ENDFUNC
#12
laowan0012022-07-12 13:18
“现有一个表结构如下,想实现这样的效果”

如果是改表结构:
select c,a,b,d,e from 旧表 into table 新表

如果是改记录顺序:
select * from 旧表 order by 新序号 into table 新表
#13
hyf82852022-07-12 13:28
回复 11楼 mywisdom88
谢谢版主,你这个是交换两个记录的顺序吧?
#14
hyf82852022-07-12 13:29
sdta版主的方法可行
#15
hyf82852022-07-12 13:35
回复 11楼 mywisdom88
交换两个记录的顺序正好也是我需要的,谢谢!
#16
mywisdom882022-07-12 13:46
以下是引用hyf8285在2022-7-12 13:28:57的发言:

谢谢版主,你这个是交换两个记录的顺序吧?

*******如果序号,不是物理的序号,改改

CREATE CURSOR t0(序号 i,姓名 C(10),其他 C(10))
INSERT INTO T0(序号,姓名,其他) VALUES(1,'A1','其他1')
INSERT INTO T0(序号,姓名,其他) VALUES(3,'A3','其他3')
INSERT INTO T0(序号,姓名,其他) VALUES(5,'A5','其他5')
INSERT INTO T0(序号,姓名,其他) VALUES(2,'A2','其他2')
INSERT INTO T0(序号,姓名,其他) VALUES(4,'A4','其他4')
INSERT INTO T0(序号,姓名,其他) VALUES(6,'A6','其他6')

BROWSE

swap(2,5,'t0')

BROWSE

FUNCTION swap(n1,n2,dbf1)
SELECT * FROM (dbf1) WHERE 序号 = n1 INTO ARRAY a1
SELECT * FROM (dbf1) WHERE 序号 = n2 INTO ARRAY a2

SELECT (dbf1)
LOCATE FOR 序号=n1
GATHER FROM A2
REPLACE 序号 WITH n1
LOCATE FOR 序号=n2
GATHER FROM A1
REPLACE 序号 WITH n2
ENDFUNC
#17
hyf82852022-07-12 14:09
回复 16楼 mywisdom88
谢谢!你的方法具有通用性,可以任意调换记录的顺序
#18
吹水佬2022-07-12 15:03
以下是引用hyf8285在2022-7-12 14:09:40的发言:

谢谢!你的方法具有通用性,可以任意调换记录的顺序

以下是引用hyf8285在2022-7-12 11:27:37的发言:

请教大佬:现有一个表结构如下,想实现这样的效果,如果把c移到最上,则c的序号变为1,a变为2,b变为3,d还是4,e还是5,请问如何实现?谢谢!
字段     序号      新序号
 a         1          2
 b         2          3
 c         3          1
 d         4          4
 e         5          5

题目要求数据记录不变动的吧,只是重新定义序号(新序号)
#19
hyf82852022-07-12 15:35
回复 18楼 吹水佬
是的!吹版
#20
吹水佬2022-07-12 15:44
以下是引用hyf8285在2022-7-12 15:35:02的发言:

是的!吹版

那到底是 记录保持不变 还是要 交换记录 ?
#21
hyf82852022-07-12 15:55
回复 20楼 吹水佬
应该实现sdta版主的结果,不是交换记录,是移动记录,要的效果就是sdta的程序的效果!刚才发现mywisdom88的结果还是交换记录,不过交换记录我也需要
#22
bdx8082022-07-12 16:37
学习了
#23
吹水佬2022-07-12 17:19
以下是引用hyf8285在2022-7-12 15:55:34的发言:

应该实现sdta版主的结果,不是交换记录,是移动记录,要的效果就是sdta的程序的效果!刚才发现mywisdom88的结果还是交换记录,不过交换记录我也需要

明白
直接交换记录的方法无创建表过程,数据记录多时速度会快点。
程序代码:

CREATE CURSOR tt (字段 c(1), 序号 I)
INSERT INTO tt VALUES ("a", 1)
INSERT INTO tt VALUES ("b", 2)
INSERT INTO tt VALUES ("c", 3)
INSERT INTO tt VALUES ("d", 4)
INSERT INTO tt VALUES ("e", 5)
fun("c")
BROWSE
RETURN

FUNCTION fun(val)
    SELECT tt
    GO TOP
    SCATTER TO arr1
    LOCATE FOR  字段 == val
    SCATTER TO arr2
    GATHER FROM arr1
    GO TOP
    GATHER FROM arr2
    REPLACE ALL 序号 WITH RECNO()
ENDFUNC
#24
hyf82852022-07-12 18:35
感谢各位大佬的支持和帮助!sdta版主的方法直接解决了我提出的问题,吹版主和mywisdom88大佬解决了我后面将要解决的问题!感谢!

[此贴子已经被作者于2022-7-12 18:36编辑过]

#25
吹水佬2022-07-12 21:45
以下是引用hyf8285在2022-7-12 11:27:37的发言:

请教大佬:现有一个表结构如下,想实现这样的效果,如果把c移到最上,则c的序号变为1,a变为2,b变为3,d还是4,e还是5,请问如何实现?谢谢!
字段     序号      新序号
 a         1          2
 b         2          3
 c         3          1
 d         4          4
 e         5          5

这个遍历一次就可以
程序代码:

CREATE CURSOR tt (字段 c(1), 序号 I, 新序号 I)
INSERT INTO tt VALUES ("a", 1, 0)
INSERT INTO tt VALUES ("b", 2, 0)
INSERT INTO tt VALUES ("c", 3, 0)
INSERT INTO tt VALUES ("d", 4, 0)
INSERT INTO tt VALUES ("e", 5, 0)
n = 1
REPLACE ALL 新序号 WITH fun()
BROWSE
RETURN

FUNCTION fun()
    IF 字段 == "c"
        RETURN 1
    ENDIF
    n = n + 1
    RETURN n
ENDFUNC
1