| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7872 人关注过本帖
标题:将竖向排列的人名改为横向排列
只看楼主 加入收藏
IHORSE
Rank: 1
等 级:新手上路
帖 子:41
专家分:5
注 册:2007-2-11
结帖率:100%
收藏
已结贴  问题点数:30 回复次数:14 
将竖向排列的人名改为横向排列
有一个表(见附件)只有一列,其中每行对应一个名字,现在希望按以下要求将其分行,存放到另一个新表中:

①提示输入数字“10",创建一个有10列的新表,表的字段名为 name1直到name10,,(新表的字段数要根据输入的数字自动创建,比如输入10就创建10列,输入11就创建11列……)

②从头开始连续取原始数据表中的前10人到新表的第一行,11-20则到第二行……,以此类推。如果输入的数字是11,则从头开始连续取11人到第一行,12-22到第二行,,,

总之就是希望能根据输入的数字自动建相应列数的表,并将原始表中所有人按每行有相应个数的姓名来存放。

希望大师们能不吝赐教,非常感谢!!
xsxx.rar (906 Bytes)
搜索更多相关主题的帖子: 数据表 
2016-01-29 09:56
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
怎么论坛上老是有这种问题?是老师布置的作业吧?

泉城飞狐
2016-01-29 10:06
IHORSE
Rank: 1
等 级:新手上路
帖 子:41
专家分:5
注 册:2007-2-11
收藏
得分:0 
话说不是老师布置的作业,而是,我只是一名业余弄弄vfp的其他科目老师。
2016-01-29 10:09
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:20 
CLOSE TABLES ALL
c = INPUTBOX('请输入目标表的列数:')
nCols = INT(VAL(c))
IF nCols < 1
    MESSAGEBOX('列数无效!')
    RETURN
ENDIF
CREATE CURSOR t1 (name1 c(10))
FOR i = 2 TO nCols
    ALTER table t1 ADD ('name'+TRAN(i)) c(10)
NEXT
SELECT 0
USE xsxx
DO WHILE NOT EOF()
    APPEND BLANK IN t1
    i = 1
    DO WHILE NOT EOF() AND i <= nCols
        REPLACE ('name'+TRAN(i)) WITH xsxx.name IN t1
        i = i + 1
        SKIP
    ENDDO
ENDDO
SELECT t1
GO TOP
BROWSE

泉城飞狐
2016-01-29 10:30
IHORSE
Rank: 1
等 级:新手上路
帖 子:41
专家分:5
注 册:2007-2-11
收藏
得分:0 
回复 4楼 liuxingang28
谢谢,以上代码相当完美。

再问,怎样将姓名为两个字的变更为在姓和名之间加上空格(如“张三”变更为“张  三”),然后再填入对应的单元格中?
2016-01-29 12:51
su0527
Rank: 2
等 级:论坛游民
帖 子:452
专家分:79
注 册:2015-1-10
收藏
得分:0 
学习了.
2016-01-29 13:01
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:10 
CLOSE TABLES ALL
c = INPUTBOX('请输入目标表的列数:')
nCols = INT(VAL(c))
IF nCols < 1
    MESSAGEBOX('列数无效!')
    RETURN
ENDIF
CREATE CURSOR t1 (name1 c(10))
FOR i = 2 TO nCols
    ALTER table t1 ADD ('name'+TRAN(i)) c(10)
NEXT
SELECT 0
USE xsxx
DO WHILE NOT EOF()
    APPEND BLANK IN t1
    i = 1
    DO WHILE NOT EOF() AND i <= nCols
        cName = IIF(LEN(TRIM(name))=4,STUFF(name,3,0,SPACE(2)),name)
        REPLACE ('name'+TRAN(i)) WITH cName IN t1

        i = i + 1
        SKIP
    ENDDO
ENDDO
SELECT t1
GO TOP
BROWSE

泉城飞狐
2016-01-29 13:12
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
程序代码:
CLOSE DATABASES
USE XSXX IN 0 ALIAS XSXX
DO WHILE .T.
    INPUT "请输入列数:" TO NCOL
    IF NCOL<=1
        MESSAGEBOX("输入列数无效!")
        LOOP
    ELSE
        EXIT
    ENDIF
ENDDO
CSTRU=""
FOR I=1 TO NCOL
     CSTRU=CSTRU+"NAME"+TRANSFORM(I)+" C(6),"
ENDFOR
CSTRU=LEFT(CSTRU,LEN(CSTRU)-1)
*MESSAGEBOX(CSTRU)
CREATE CURSOR TT (&CSTRU)
SELECT XSXX
LOCAL XS[1,NCOL]
XS=""
N=0
SCAN
   XM=IIF(LEN(ALLTRIM(NAME))=4,LEFT(NAME,2)+"  "+SUBSTR(NAME,3,2),NAME)
   N=N+1
   XS[1,N]=XM
   IF N=NCOL OR RECNO()=RECCOUNT()
       INSERT INTO TT FROM ARRAY XS
       N=0
       XS=""
   ENDIF
ENDSCAN
SELECT TT
BROWSE
USE IN XSXX

坚守VFP最后的阵地
2016-01-29 14:10
IHORSE
Rank: 1
等 级:新手上路
帖 子:41
专家分:5
注 册:2007-2-11
收藏
得分:0 
回复 8楼 sdta
很好,大体上看懂了,用二维数组取值。
2016-01-29 15:00
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
条条大路通罗马。现在分析一下我的代码与sdta版主的代码的异同:
1. 在让用户指定列数时,我使用了inputbox()函数,该函数的返回值是字符型,因此对返回结果进行了类型转换:nCols = int(val(c))。并且当用户输入无效列数时,直接退出。
  sdta版主使用了input命令,该命令可直接输入一个数值,无需转换,并且当用户输入无效值时,系统会提示继续输入,直到输入一个有效值为止。
  优缺点:inputbox()函数打开的是一个标准的widnows对话框,界面美观,但返回值需要转换。input命令是VFP兼容以前DOS版本的老命令,界面不美观,但是其返回值本身就是数值型的,无需转换。
2. 我们的代码都是根据列数建立一个游标。
   我的代码是先建立一个仅包含一个字段的游标,然后再使用“alter table add”逐个添加其他字段。
   sdta版主的代码是生成一个建立游标的字符串,然后再用宏替换执行该语句,从而一次性创建该游标。
3. 在将原表数据转换到目标表时,我使用了嵌套的两个循环,第一个循环用于添加空记录,第二个循环用于更新字段内容。
   sdta使用了一个循环,在循环体内将字段内容先暂存到数组,待到达一定记录数时再将数组内容添加到新表。
   个人意见:两层循环比较好理解,不易出错;单个循环更简练,但需要对计数变量做精准控制,对编程水平有更高的要求。
4. 再对两个汉字姓名的处理上,我使用了stuff()函数,在第一个汉字后面直接插入2个空格。sdta使用了“取前2个字符+2个空格+后2个字符”的方式。

泉城飞狐
2016-01-29 16:22
快速回复:将竖向排列的人名改为横向排列
数据加载中...
 
   



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

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