标题:姓名列转行
只看楼主
杂七杂八
Rank: 1
等 级:新手上路
帖 子:217
专家分:7
注 册:2018-2-20
结帖率:96%
已结贴  问题点数:20 回复次数:8 
姓名列转行
如附件,将表的姓名列转成行,姓名有很多行。想每20个姓名转成一行,且每个姓名之间加“,”英文逗号。如何实现?
谢谢!!!
姓名列转行.rar (327 Bytes)
搜索更多相关主题的帖子: 逗号 多行 姓名 英文 转成 
2020-08-26 23:20
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:4 
回复 楼主 杂七杂八
提供一个常见思路和关键代码,未上机测试,办法不是最好的,但易理解、操作,仅供参考。
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.循环操作,完成转换。
2020-08-27 04:29
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:4 
方法一(不建议对原表进行操作)
程序代码:
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编辑过]

收到的鲜花
  • 瓜瓜19902020-08-27 07:56 送鲜花  1朵  

坚守VFP最后的阵地
2020-08-27 05:58
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:4 
方法二(不对原表进行操作)
程序代码:
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 
收到的鲜花
  • 瓜瓜19902020-08-27 08:16 送鲜花  1朵  

坚守VFP最后的阵地
2020-08-27 06:03
杂七杂八
Rank: 1
等 级:新手上路
帖 子:217
专家分:7
注 册:2018-2-20
得分:0 
回复 2楼 schtg
  谢谢你,我已测试过了,可以用。
2020-08-27 06:38
杂七杂八
Rank: 1
等 级:新手上路
帖 子:217
专家分:7
注 册:2018-2-20
得分:0 
回复 4楼 sdta
谢谢,不对原表修改那是最好了。生成另一个表来处理。谢谢
2020-08-27 06:40
杂七杂八
Rank: 1
等 级:新手上路
帖 子:217
专家分:7
注 册:2018-2-20
得分:0 
回复 4楼 sdta
我已用了,高效率!!!
再一次谢谢!!!
2020-08-27 06:44
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:8 
程序代码:
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编辑过]

2020-08-27 09:03
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:0 
@sdta、吹水佬俩版主,高!学习啦,谢谢!
2020-08-27 17:04



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-502966-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.179192 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved