编程论坛
注册
登录
编程论坛
→
VFP论坛
姓名列转行
杂七杂八
发布于 2020-08-26 23:20, 2097 次点击
如附件,将表的姓名列转成行,姓名有很多行。想每20个姓名转成一行,且每个姓名之间加“,”英文逗号。如何实现?
谢谢!!!
只有本站会员才能查看附件,请
登录
8 回复
#2
schtg
2020-08-27 04:29
回复 楼主 杂七杂八
提供一个常见思路和关键代码,未上机测试,办法不是最好的,但易理解、操作,仅供参考。
1.将“姓名”字段的值按要求(20条记录)读入数组:
select 姓名 from 姓名列转行 into array arr where 记录号<21
2.将数组值转为一字符串:
cStr = ""
for each scvar in arr
cName = scvar
cStr = cStr + alltrim(cName) + ","
endfor
cStr = left(alltrim(cStr),len(alltrim(cStr))-1)
? cStr
3.将得到的字符串作为字段值写入数据表的记录中
repl …… 或 update ……
4.循环操作,完成转换。
#3
sdta
2020-08-27 05:58
方法一(不建议对原表进行操作)
程序代码:
CLOSE
DATABASES
USE
姓名列转行
REPLACE
新姓名
WITH
""
ALL
lnR
=
2
&&
设置lnR人为一行
lcStr
=
""
LOCAL aa
[
CEILING(RECCOUNT() / lnR)
]
lnCnt
=
0
SCAN
lcStr
=
lcStr
+
","
+
ALLTRIM(姓名)
IF
RECNO()
=
RECCOUNT()
OR
RECNO()
%
lnR
=
0
lcStr
=
SUBSTR(lcStr,
2
)
lnCnt
=
lnCnt
+
1
aa
[
lnCnt
]
=
lcStr
lcStr
=
""
ENDIF
ENDSCAN
SCAN
FOR
RECNO()
%
lnR
=
1
REPLACE
新姓名
WITH
aa
[
CEILING(RECNO() / lnR)
]
ENDSCAN
BROWSE
[此贴子已经被作者于2020-8-27 05:59编辑过]
#4
sdta
2020-08-27 06:03
方法二(不对原表进行操作)
程序代码:
CLOSE
DATABASES
CREATE
CURSOR
tt (xh n(
4
), xm c(
200
))
USE
姓名列转行
IN
0
ALIAS xm
SELECT
xm
lnR
=
5
&&
设置lnR人为一行
lcStr
=
""
lnCnt
=
0
SCAN
lcStr
=
lcStr
+
","
+
ALLTRIM(姓名)
IF
RECNO()
=
RECCOUNT()
OR
RECNO()
%
lnR
=
0
lcStr
=
SUBSTR(lcStr,
2
)
lnCnt
=
lnCnt
+
1
INSERT
INTO
tt
VALUES
(lnCnt, lcStr)
lcStr
=
""
ENDIF
ENDSCAN
SELECT
tt
BROWSE
#5
杂七杂八
2020-08-27 06:38
回复 2楼 schtg
谢谢你,我已测试过了,可以用。
#6
杂七杂八
2020-08-27 06:40
回复 4楼 sdta
谢谢,不对原表修改那是最好了。生成另一个表来处理。谢谢
#7
杂七杂八
2020-08-27 06:44
回复 4楼 sdta
我已用了,高效率!!!
再一次谢谢!!!
#8
吹水佬
2020-08-27 09:03
程序代码:
SELECT
姓名
FROM
姓名列转行
INTO
ARRAY axm
nCol
=
20
nRow
=
CEILING
(ALEN(axm)
/
nCol)
DIMENSION axm
[
nRow,nCol
]
DIMENSION axms
[
nRow,1
]
FOR
i
=
1
TO
nRow
axms
[
i
]
=
axm
[
i,1
]
FOR
j
=
2
TO
nCol
IF
VARTYPE(axm
[
i,j
]
)
==
"C"
axms
[
i
]
=
axms
[
i
]
-
","
-
axm
[
i,j
]
ENDIF
ENDFOR
ENDFOR
CREATE
CURSOR
xms (xms C(
240
))
APPEND
FROM
ARRAY axms
BROWSE
[此贴子已经被作者于2020-8-27 09:08编辑过]
#9
schtg
2020-08-27 17:04
@sdta、吹水佬俩版主,高!学习啦,谢谢!
1