| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3223 人关注过本帖
标题:请教二表随机整行替换代码中的一个错误提示
只看楼主 加入收藏
fdxxhjc
Rank: 1
等 级:新手上路
帖 子:305
专家分:0
注 册:2014-4-10
结帖率:73.44%
收藏
已结贴  问题点数:20 回复次数:43 
请教二表随机整行替换代码中的一个错误提示
先生们好,有A、B二表都是10行6列,现在随机的从B表中取几整行去替换A表中相对应的整行,搞了点代码,但在运行中总是提示“记录超出范围”,检查了多次,总觉得记录没超出范围,请先生指点,谢放,。
ACTIVATE SCREEN
CLEAR
CLOSE DATABASES
SET DEFAULT TO "d:\请教"
use  交换结果记录表.dbf alias a in 0
USE b IN 0

SET SAFETY OFF
********************************************************************************
*A表中的任一行与B表中的行只交换一行
    * 本块应该有10种可能性,共有100行

*A表中的任二行与B表中的行只交换二行
    * 本块应该有9+8+...+2+1种即45种可能性,共有450行
   
*A表中的任三行与B表中的行只交换三行
    * 本块应该有8+7+...+2+1种即36种可能性,共有360行
   
*A表中的任四行与B表中的行只交换四行
    * 本块应该有7+...+2+1种即28种可能性,共有280行   

*A表中的任五行与B表中的行只交换五行
    * 本块应该有6+5+...+2+1种即21种可能性,共有210行   
   
*A表中的任六行与B表中的行只交换六行
    * 本块应该有5+4+...+2+1种即15种可能性,共有150行   
   
*A表中的任七行与B表中的行只交换七行
    * 本块应该有4+3+2+1种即10种可能性,共有100行   
   
*A表中的任八行与B表中的行只交换八行
    * 本块应该有3+2+1种即6种可能性,共有60行
   
*A表中的任九行与B表中的行只交换九行
    * 本块应该有2+1种即3种可能性,共有30行   
   
*A表中的十行与B表中的行交换十行
    * 本块应该有1种可能性,共有10行

LOCAL 随机行数值
随机行数值 = 获取一个随机整数值(1,10)

LOCAL 随机行号串A, 随机行号串B
随机行号串A = 获取任意一组数字(1,10,随机行数值)
随机行号串B = 获取任意一组数字(1,10,随机行数值)
ACTIVATE SCREEN
?随机行数值, ": " , 随机行号串A,随机行号串B

LOCAL m.i
LOCAL m.nA, m.nB

FOR m.i = 1 TO 随机行数值
    m.nA = VAL(GETWORDNUM(随机行号串A,m.i,","))
    m.nB = VAL(GETWORDNUM(随机行号串B,m.i,","))
   
    ? m.i, "将B表的行【" + ALLTRIM(STR(m.nB)) + "】替换到表A的行【" + ALLTRIM(STR(m.nA)) + "】"
   
    SELECT b
    GOTO m.nB
    SCATTER MEMVAR
   
    SELECT a
    ? "       m.nA=" ,m.nA
    GOTO m.nA
    GATHER MEMVAR
NEXT

FUNCTION 获取一个随机整数值()
    LPARAMETERS 最小值,最大值
   
    LOCAL m.n
    m.n = ROUND(RAND() * (最大值-最小值+1),0)
   
    IF m.n = 0
        m.n = m.n + 1
    ENDIF
   
    m.n = 最小值 + m.n -1
    IF m.n<最小值
        m.n = 最小值
    ENDIF
    IF m.n>最大值
        m.n=最大值
    ENDIF
   
    RETURN m.n
ENDFUNC

FUNCTION 获取任意一组数字()
    LPARAMETERS 开始行,结束行, 个数
   
    LOCAL 行数
    行数 = 结束行 - 开始行 + 1

    LOCAL ARRAY 行号数组(行数,2)
    LOCAL m.n
   
    FOR m.n = 1 TO 行数
        行号数组(m.n,1) = 开始行 + m.n - 1
        行号数组(m.n,2) = RAND()
   
        ACTIVATE SCREEN
        ?m.n, 行号数组(m.n,1), 行号数组(m.n,2)
    NEXT
   
    ?"=========================================A"

    LOCAL m.i, m.j
    LOCAL m.A, m.B
    LOCAL m.T1, m.T2
   
    FOR m.i = 1 TO 行数 -1
        m.A = 行号数组(m.i,2)
        
        FOR m.j = m.i + 1 TO 行数
            m.B = 行号数组(m.j,2)
            
            IF m.A > m.B
                m.T1 = 行号数组(m.i,1)
                m.T2 = 行号数组(m.i,2)
                行号数组(m.i,1) = 行号数组(m.j,1)
                行号数组(m.i,2) = 行号数组(m.j,2)
                行号数组(m.j,1) = m.T1
                行号数组(m.j,2) = m.T2
               
                m.A = 行号数组(m.i,2)
            ENDIF
            
        NEXT
    NEXT
   
    ?"=========================================B"
   
    FOR m.n = 1 TO 行数
        ACTIVATE SCREEN
        ?m.n, 行号数组(m.n,1), 行号数组(m.n,2)
    NEXT
   
    LOCAL m.s
    m.s = ""
   
    FOR m.n = 1 TO 个数
        m.s = m.s + "," + ALLTRIM(STR(行号数组(m.n,1)))
    NEXT
   
    m.s = SUBSTR(m.s,2)
    ?"=========================================C"
    ?""
    RETURN m.s   
   
ENDFUNC

程序及A、B表等在压缩包中
请教.rar (4.12 KB)
搜索更多相关主题的帖子: 表中 LOCAL 行数 随机 数组 
2022-02-13 20:38
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9799
专家分:26886
注 册:2012-2-5
收藏
得分:0 
use  交换结果记录表.dbf alias a in 0 && 此处 a 为表别名
.........
........
   SELECT a && 此处 a 是指A表,还是别名为 a 表名为交换结果记录表
    ? "       m.nA=" ,m.nA
    GOTO m.nA
    GATHER MEMVAR

这两处的 a 是否是一个意思

坚守VFP最后的阵地
2022-02-13 21:20
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1063
专家分:2579
注 册:2015-12-30
收藏
得分:0 
问题既然是“记录超出范围”,那就在go语句之前,检查表的recc()和要跳转的记录号,是否合理,
另:强烈建议不要使用单个字母做表的alias,楼顶程序中的alias a可以改为alias a1,或alias aa

2楼提到的疑问确实很可疑
2022-02-13 21:38
fdxxhjc
Rank: 1
等 级:新手上路
帖 子:305
专家分:0
注 册:2014-4-10
收藏
得分:0 
回复 2楼 sdta
先生早上好,我将这行  use  交换结果记录表.dbf alias a in 0
                改成  use  交换结果记录表.dbf alias a1 in 0
运行还是提示记录超出
2022-02-14 08:23
schtg
Rank: 12Rank: 12Rank: 12
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1545
专家分:3003
注 册:2012-2-29
收藏
得分:0 
回复 楼主 fdxxhjc
先在“交换结果记录表”增加多于10个的空记录,再试一试。


[此贴子已经被作者于2022-2-14 19:23编辑过]

2022-02-14 08:34
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1063
专家分:2579
注 册:2015-12-30
收藏
得分:0 
use 交换结果记录表.dbf alias a in 0
这行语句打开了交换结果记录表,初始记录数为0,指定别名是a。
问题背景说明“有A、B二表都是10行6列”,这里的表A是另一个实体表,表名与上个语句的别名重复了。
楼主估计是把结果表的别名a当成是实体表A了,所以会出错
在程序中其实并没有打开那个实体表A
2022-02-14 08:34
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10539
专家分:42927
注 册:2014-5-20
收藏
得分:0 
是不是这意思:从B表随机取m条记录放到A表(对应记录号入座)
暂时忽略A表的处理过程,说说每次从B表随机取m条记录的过程
2022-02-14 10:26
fdxxhjc
Rank: 1
等 级:新手上路
帖 子:305
专家分:0
注 册:2014-4-10
收藏
得分:0 
回复 7楼 吹水佬
先生是的,是随机的从B表中取几行(如在B表中随机的取第2、5、6、8行去替换A表中的第2、5、6、8行【整行数字替换】)并将替换后的结果记录到“替换结果记录表.dbf”中
这时替换结果记录表中的行的次序变成
a1、b2、a3、a4、b5、b6、a7、b8、a9、a10的整行的数字了,谢谢先生
2022-02-14 15:06
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10539
专家分:42927
注 册:2014-5-20
收藏
得分:0 
回复 8楼 fdxxhjc
B表只进行了一次随机取记录就完结了?
2022-02-14 15:21
fdxxhjc
Rank: 1
等 级:新手上路
帖 子:305
专家分:0
注 册:2014-4-10
收藏
得分:0 
回复 9楼 吹水佬
最好是要有可选择多次的,谢谢先生
2022-02-14 15:48
快速回复:请教二表随机整行替换代码中的一个错误提示
数据加载中...
 
   



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

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