注册 登录
编程论坛 VFP论坛

求循环套循环,两个表相同字段比较

yd1954 发布于 2021-06-05 09:53, 3465 次点击
各位老师好!
发过去3个表。我的想法是:
  用分列统计15期表里的N1字段的最后一行的值,与3d999个数表里的N1的值(1000个记录)逐个比较。相等的,在3d选个数表里的N1字段记1(1000行中有几个相等的就记几),不相等的记0.
  用分列统计15期表里的N2字段的最后一行的值,与3d999个数表里的N2的值(1000个记录)逐个比较。相等的,在3d选个数表里的N2字段记1(1000行中有几个相等的就记几),不相等的记0.
.........
  用分列统计15期表里的N190字段的最后一行的值,与3d999个数表里的N190的值(1000个记录)逐个比较。相等的,在3d选个数表里的N190字段记1(1000行中有几个相等的就记几),不相等的记0.

这是个循环套循环的程序。我只有大概思路。具体到写代码就不会了。恳请各位老师帮助。

3d选个数表里的3行记录,是我用select n1 from 3d999个数 where n1=xxx  执行190次,手工填上去的。每执行一次,n后面的数字和=后面的数字都得改动。

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录
14 回复
#2
sdta2021-06-05 11:17
程序代码:
CLOSE DATABASES
t1 = SECONDS()
USE d3选个数 && 原名:3d9选个数
ZAP
lcZd = ""
FOR lnj = 1 TO AFIELDS(azds)
    lcZd = lcZd + "," + azds[lnj, 1]
ENDFOR
lcZd = SUBSTR(lcZd, 2)

SELECT &lcZd FROM 分列统计15期 WHERE RECNO() = RECCOUNT() INTO ARRAY afl
USE
lcZd1 = SUBSTR(lcZd, 7)
SELECT &lcZd1 from d3_999个数 INTO CURSOR temp
INSERT INTO d3选个数 (Qihao) values(afl[1])
FOR lnj = 2 TO ALEN(afl)
    SELECT temp
    lc = FIELD(lnj - 1)
    COUNT TO nCnt FOR &lc = afl[lnj]
    REPLACE (lc) WITH nCnt RECORD 1 IN d3选个数
ENDFOR
? SECONDS() - t1
SELECT d3选个数
BROWSE
#3
yd19542021-06-05 13:11
回复 2楼 sdta
sdta老师你好!
代码看了。有不懂的地方,还要请教。
运行一下,结果是只有qihao在d3选个数表中有数字显示,n1到n190为空。不知为什么?
#4
yd19542021-06-05 13:16
回复 2楼 sdta
另外,我把zap清空命令前加了*,因为d3选个数表里的数据需累计,每一行的数据都要保存。
#5
sdta2021-06-05 13:45
以下是引用yd1954在2021-6-5 13:11:36的发言:

sdta老师你好!
代码看了。有不懂的地方,还要请教。
运行一下,结果是只有qihao在d3选个数表中有数字显示,n1到n190为空。不知为什么?

只有本站会员才能查看附件,请 登录
#6
吹水佬2021-06-05 14:44
只有本站会员才能查看附件,请 登录

程序代码:
SELECT * FROM 3d9选个数 WHERE .F. INTO CURSOR tmp READWRITE
SELECT tmp
APPEND FROM 分列统计15期 FOR RECNO()==RECCOUNT()
SCATTER TO arr
ZAP
APPEND FROM 3d999个数
DIMENSION atj[ALEN(arr)]
STORE 0 TO atj
n = FCOUNT()
atj[1] = arr[1]
SCAN
    SCATTER TO ar
    FOR i=2 TO n
        IF ar[i]==arr[i]
            atj[i] = atj[i] + 1
        ENDIF
    ENDFOR
ENDSCAN
ZAP
APPEND FROM ARRAY atj
SELECT * FROM tmp


[此贴子已经被作者于2021-6-5 14:51编辑过]

#7
yd19542021-06-05 17:01
回复 6楼 吹水佬
吹水佬老师,你好!
代码看了,也运行了。
但是,运行结果只显示为查询,并没有写在3d9选个数表的最后一行。能否请老师帮助,将运行结果写在3d9选个数表的最后一行。
这个结果需要一行一行积累,因此,3d9选个数表不能清空。谢谢。
#8
yd19542021-06-05 17:11
回复 5楼 sdta
只有本站会员才能查看附件,请 登录
#9
吹水佬2021-06-05 17:27
以下是引用yd1954在2021-6-5 17:01:36的发言:

吹水佬老师,你好!
代码看了,也运行了。
但是,运行结果只显示为查询,并没有写在3d9选个数表的最后一行。能否请老师帮助,将运行结果写在3d9选个数表的最后一行。
这个结果需要一行一行积累,因此,3d9选个数表不能清空。谢谢。

结果在tmp临时表
要放进“3d9选个数表”就 APPEND 进去
#10
sdta2021-06-05 17:28
只有本站会员才能查看附件,请 登录
#11
yd19542021-06-05 19:01
回复 9楼 吹水佬
老师好!
“结果在tmp临时表要放进“3d9选个数表”就 APPEND 进去”

我将程序的结尾改为:SELECT * FROM 3d9选个数

结果并没有在3d9选个数表里显示。3d9选个数里只显示原有的三行记录。

老师讲的“tmp放进3d9选个数”怎么放?在何处放?
#12
吹水佬2021-06-05 20:07
回复 11楼 yd1954
程序代码:
USE 3d9选个数 IN 0 ALIAS t_3d9选个数
SELECT * FROM t_3d9选个数 WHERE .F. INTO CURSOR tmp READWRITE
SELECT tmp
APPEND FROM 分列统计15期 FOR RECNO()==RECCOUNT()
SCATTER TO arr
ZAP
APPEND FROM 3d999个数
DIMENSION atj[ALEN(arr)]
STORE 0 TO atj
n = FCOUNT()
atj[1] = arr[1]
SCAN
    SCATTER TO ar
    FOR i=2 TO n
        IF ar[i]==arr[i]
            atj[i] = atj[i] + 1
        ENDIF
    ENDFOR
ENDSCAN
SELECT t_3d9选个数
LOCATE FOR qihao==atj[1]
IF FOUND()
    GATHER FROM atj
ELSE
    APPEND FROM ARRAY atj
ENDIF
SELECT * FROM t_3d9选个数
CLOSE DATABASES ALL
RETURN

#13
yd19542021-06-05 20:08
回复 10楼 sdta
sdta老师你好!

CLOSE DATABASES
t1 = SECONDS()
USE d3选个数 && 原名:3d9选个数
ZAP (我改动为*zap)
lcZd = ""
FOR lnj = 1 TO AFIELDS(azds)
    lcZd = lcZd + "," + azds[lnj, 1]
ENDFOR
lcZd = SUBSTR(lcZd, 2)
SELECT &lcZd FROM 分列统计15期 WHERE RECNO() = RECCOUNT() INTO ARRAY afl
USE
lcZd1 = SUBSTR(lcZd, 7)
SELECT &lcZd1 from d3_999个数 INTO CURSOR temp
INSERT INTO d3选个数 (Qihao) values(afl[1])
FOR lnj = 2 TO ALEN(afl)
    SELECT temp
    lc = FIELD(lnj - 1)
    COUNT TO nCnt FOR &lc = afl[lnj]
    REPLACE (lc) WITH nCnt RECORD 1 IN d3选个数
ENDFOR
? SECONDS() - t1
SELECT d3选个数

我将zap注释掉了,就出现上面的结果。将zap恢复后,在d3选个数表里显示的只是一行数据。
在分列统计15期增加一条记录,运行老师的程序,d3选个数里显示的只是增加的那一条记录的统计。
我的想法是d3选个数表里数据每一行都应该保留,以便观察和进一步统计。不知应该怎么改,请老师指教。
谢谢!
#14
吹水佬2021-06-05 20:08
顺便说说,文件名要按规范起名,“3d9选个数”是不规范的。
#15
laowan0012021-06-07 09:03

LOCAL ii,xqh,xfield
USE 分列统计15期 alias aa IN 0
SELECT aa
GO BOTTOM
xqh =qihao

USE 3d999个数 ALIAS cc IN 0

USE 3d9选个数 ALIAS bb IN 0
SELECT bb
LOCATE FOR qihao=xqh
IF EOF()    && 没找到,增加
    APPEND BLANK
    REPLACE qihao WITH xqh
ELSE   
    && 找到了,不需要做什么
ENDIF

SELECT bb
FOR ii=1 TO 190
    xfield = 'N'+TRANSFORM(ii)
    UPDATE bb SET &xfield=b.numcount FROM bb,(select COUNT(*) numcount FROM cc WHERE &xfield=aa.&xfield) b WHERE bb.qihao=xqh
ENDFOR

SELECT bb
* 最后一行是统计结果
BROWSE
1