注册 登录
编程论坛 VFP论坛

求多个字段各自比较且循环

yd1954 发布于 2020-12-07 15:05, 2128 次点击
各位老师好!
    感谢你们的帮助。
    发过去个表。b1,b2。我的想法是:
表b1中Z1到z72字段,每个字段的上一行的值,与这个字段下一行的值比较,
相等的记为0。不相等的记为1。

例:b1
   字段z1的最后一行是72,上一行是76;上一行不等于下一行,在b2的z1倒数第二行记为1。
   字段z1的最后第二行是76,上一行是73;上一行不等于下一行,在b2的z1倒数第三行记为1。
   ......
   字段z1的最后第29行是55,上一行是55;上一行与下一行相等,在b2的z1倒数第三十行记为0。
   ......

   字段z2同上;
   字段z3同上;
   ......

   字段z72同上。
 
   
   我知道应该将b1复制成2个临时表,将其中一个表的指针减一行,然后进行比较。

但是怎么循环,就不会了;更不会把指针移到z2、z3、z4...进行再循环。

请各位老师在百忙中帮助写出程序。再次表示感谢!

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

只有本站会员才能查看附件,请 登录
6 回复
#2
xuminxz2020-12-07 17:06
Close Tables All
Create Cursor tmp1 (qihao N(7,0),h1 N(1,0),h2 N(1,0),h3 N(1,0))
For i=1 To 72
    czdm='z'+Alltrim(Str(i))
    Alter Table tmp1 Add &czdm. N(3,0)
Endfor
Use b1 In 0
Append From b1 For Recno()<Reccount('b1')
Select * From tmp1 Into Cursor  tmp2 Where .F. Readwrite
Select tmp2
Append From b1 For Recno()>1
Select  0
Use b2
Zap
Append From b1 For Recno()<Reccount('b1')Fields qihao,h1,h2,h3
Set Relation To Recno() Into tmp1
Select tmp1
Set Relation To Recno() Into tmp2
Select b2
Scan
    For i=1 To 72
        czdm='z'+Alltrim(Str(i))
        Replace &czdm. With  Iif(tmp1.&czdm.-tmp2.&czdm.=0,0,1)

    Endfor
Endscan

#3
yd19542020-12-07 17:49
回复 2楼 xuminxz
非常感谢。晚上试一下。
#4
吹水佬2020-12-07 21:13
没校对
只有本站会员才能查看附件,请 登录

程序代码:

USE b2
ZAP

**    * 运行一次修改b2的z1--z72字段宽度与b1看齐
**    FOR i=1 TO 72
**        ALTER TABLE b2 ALTER COLUMN ("z"+TRANSFORM(i)) N(3,0)
**    ENDFOR

SELECT * FROM b2 INTO CURSOR tmp READWRITE
SELECT b2
APPEND FROM b1 FIELDS qihao,h1,h2,h3
SELECT tmp
APPEND FROM b1
SET RELATION TO RECNO() INTO "b2"
GO BOTTOM
SCATTER TO arr1
SKIP -1
DO WHILE !BOF("tmp")
    SCATTER TO arr2
    FOR i=5 TO 76
        arr2[i] = IIF(arr1[i]==arr2[i], 0, 1)
    ENDFOR
    SCATTER TO arr1
    SELECT b2
    GATHER FROM arr2
    SELECT tmp
    SKIP -1
ENDDO
SELECT * FROM b2
#5
吹水佬2020-12-07 21:43
代码简化一下,效率不知有无提高
程序代码:
USE b2
ZAP

**    * 运行一次修改b2的z1--z72字段宽度与b1看齐
**    FOR i=1 TO 72
**        ALTER TABLE b2 ALTER COLUMN ("z"+TRANSFORM(i)) N(3,0)
**    ENDFOR

SELECT * FROM b2 INTO CURSOR tmp READWRITE
SELECT tmp
APPEND FROM b1
GO TOP
SCATTER TO arr1
SKIP
SCAN REST
    SCATTER TO arr2
    FOR i=5 TO 76
        arr1[i] = IIF(arr1[i]==arr2[i], 0, 1)
    ENDFOR
    SELECT b2
    APPEND FROM ARRAY arr1
    ACOPY(arr2, arr1)
ENDSCAN
SELECT * FROM b2
#6
sdta2020-12-07 23:42
程序代码:
CLOSE DATABASES
USE b1
COPY TO ARRAY aa FIELDS LIKE z*
USE
USE b2
FOR lnj = ALEN(aa, 1) - 1 TO 1 STEP -1
    FOR lnk = 1 TO ALEN(aa, 2)
        REPLACE ("Z" + TRANSFORM(lnk)) WITH IIF(aa[lnj + 1, lnk] = aa[lnj, lnk], 0, 1) RECORD lnj
    ENDFOR
ENDFOR
BROWSE
#7
denstiny2020-12-08 00:19
以下是引用吹水佬在2020-12-7 21:43:39的发言:

代码简化一下,效率不知有无提高
USE b2
ZAP

**    * 运行一次修改b2的z1--z72字段宽度与b1看齐
**    FOR i=1 TO 72
**        ALTER TABLE b2 ALTER COLUMN ("z"+TRANSFORM(i)) N(3,0)
**    ENDFOR

SELECT * FROM b2 INTO CURSOR tmp READWRITE
SELECT tmp
APPEND FROM b1
GO TOP
SCATTER TO arr1
SKIP
SCAN REST
    SCATTER TO arr2
    FOR i=5 TO 76
        arr1[i] = IIF(arr1[i]==arr2[i], 0, 1)
    ENDFOR
    SELECT b2
    APPEND FROM ARRAY arr1
    ACOPY(arr2, arr1)
ENDSCAN
SELECT * FROM b2

哇,大佬没想到你还在这个论坛呀
1