注册 登录
编程论坛 VFP论坛

求2个表的字段比较

yd1954 发布于 2020-08-19 12:42, 2863 次点击
各位老师好!
    求2个表相同字段比较的程序。
    发过去2个表,bx,by。
    2个表的字段相同(bx表里有qihao字段是唯一不同)。
求:bx表中z7,z8,z10,z11,z15,z23,z27,z28,z30,z31,
        z32,z33,z34,z35,z37,z38,z39,z40,z44,z45,
        z46,z50,z51,z52,z53,z54,z55,z59,z60,z61
    (字段名有连续的,有不连续的)字段最后一行的值,
    与by表中相对应的(相同的)字段的每一行(1000行)
    的值比较。
    相等的删除,不相等的保留。
    形成新表(不是临时表)。表结构与by相同。

举例:bx表中字段z7的最后一行是124。
      by表中字段z7的第一行是120,保留;
                   第二行是114,保留;
                   第三行是114,保留;
       .......
      
      bx表中的字段z8的最后一行是120.
      by表中的字段z8的第一行是96,保留;
                    第二行是114,保留;
                    第三行是112,保留;
      .......
     以此类推,直到by表的最后一行。   


只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
16 回复
#2
sdta2020-08-20 09:31
程序代码:
* [color=#0000FF]by.dbf 改名 bX1.dbf 原因:自己想[/color]
lcStr = "z7,z8,z10,z11,z15,z23,z27,z28,z30,z31,z32,z33,z34,z35,z37,z38,z39,z40,z44,z45,z46,z50,z51,z52,z53,z54,z55,z59,z60,z61"
ALINES(laStr, lcStr, ",")
SELECT 0000 xh, &lcStr FROM bX1 WHERE .F. INTO TABLE bx2  && 生成的新表
SELECT &lcStr FROM bx WHERE RECNO() = RECCOUNT() INTO ARRAY aRecc
SELECT &lcStr FROM bx1 into CURSOR cx
SCAN
    SCATTER FIELDS &lcStr TO aRecn
    INSERT INTO bx2 (xh) VALUES (RECNO("cx"))
    FOR lnj = 1 TO ALEN(aRecc)
        IF aRecc[lnj] != aRecn[lnj]
            REPLACE (laStr[lnj]) WITH aRecn[lnj] IN bx2
        ENDIF
    ENDFOR
ENDSCAN
SELECT bx2
BROWSE
#3
厨师王德榜2020-08-20 09:50
我也做出来了,代码没有版主的精练,不过也能解决问题,供你参考吧.
只有本站会员才能查看附件,请 登录
#4
yd19542020-08-20 20:57
回复 2楼 sdta
非常感谢版主的帮助。
运行了程序。发现:删除的是一条记录中的一个数值,不是一整条记录。是我没有说清楚。
我的意思是:2个表30个字段中如有相等的,一整条记录都删除。
还请版主帮忙,改一下。
#5
yd19542020-08-20 21:27
回复 3楼 厨师王德榜
感谢厨师王德榜。
看了你写的代码,为什么要将表bx,by放在c盘下。
我改了一下。结果在“输出结果”那一行显示“找不到别名”。
第4行,第5行看不懂,后面的循环也非常复杂。
能否将第7行,“输出结果”那一行改一下?
#6
sdta2020-08-20 22:10
程序代码:
NOTE by.dbf 改名 bX1.dbf 原因:自己想
lcStr = "z7,z8,z10,z11,z15,z23,z27,z28,z30,z31,z32,z33,z34,z35,z37,z38,z39,z40,z44,z45,z46,z50,z51,z52,z53,z54,z55,z59,z60,z61"
ALINES(laStr, lcStr, ",")
SELECT 0000 xh, &lcStr FROM bX1 WHERE .F. INTO TABLE BX2  && 生成的新表
SELECT &lcStr FROM bx WHERE RECNO() = RECCOUNT() INTO ARRAY aRecc
SELECT &lcStr FROM bX1 into CURSOR cx
SCAN
    SCATTER FIELDS &lcStr TO aRecn
    INSERT INTO bx2 (xh) VALUES (RECNO("cx"))
    LOCAL aa[1, ALEN(laStr)]
    FOR lnj = 1 TO ALEN(laStr)
        IF aRecc[lnj] = aRecn[lnj]
            EXIT
        ELSE
            aa[1, lnj] = aRecn[lnj]
        ENDIF
        IF lnj = ALEN(laStr)
            REPLACE FROM ARRAY aa FIELDS &lcStr IN bx2
        ENDIF
    ENDFOR
ENDSCAN
SELECT bx2
BROWSE


[此贴子已经被作者于2020-8-21 08:12编辑过]

#7
sdta2020-08-20 22:32
说明楼主没看懂代码的思路以及代码所表示的意思
#8
yd19542020-08-21 08:53
回复 6楼 sdta
版主你好!
昨晚近10点半发来的程序,今早运行一下,
结果是只剩下表结构,数据全没有了。   
#9
吹水佬2020-08-21 08:58
回复 8楼 yd1954
可能是这意思:只要有一个对应的字段值相等就不保留这条记录
cf = "z7,z8,z10,z11,z15,z23,z27,z28,z30,z31,z32,z33,z34,z35,z37,z38,z39,z40,z44,z45,z46,z50,z51,z52,z53,z54,z55,z59,z60,z61"
USE bx
GO BOTTOM
SCATTER FIELDS &cf TO ax
n = ALEN(ax)
USE by
COPY STRUCTURE TO by1
USE by1
APPEND FROM by FOR fun()
BROWSE &&FIELDS &cf
RETURN

FUNCTION fun()
    SCATTER FIELDS &cf TO ay
    FOR i=1 TO n
        IF ax[i]==ay[i]
            RETURN .F.
        ENDIF
    ENDFOR
    RETURN .T.
ENDFUNC


[此贴子已经被作者于2020-8-21 09:05编辑过]

#10
吹水佬2020-08-21 09:19
回复 楼主 yd1954
#11
sdta2020-08-21 09:30
回复 8楼 yd1954
今天早上上网看了下,发现结果不正确,在6楼代码的基础上又进行了修改
#12
sdta2020-08-21 13:24
程序代码:
NOTE by.dbf 改名 bX1.dbf 原因:自己想
lcStr = "z7,z8,z10,z11,z15,z23,z27,z28,z30,z31,z32,z33,z34,z35,z37,z38,z39,z40,z44,z45,z46,z50,z51,z52,z53,z54,z55,z59,z60,z61"
ALINES(laStr, lcStr, ",")
SELECT 0000 xh, &lcStr FROM bX1 WHERE .F. INTO TABLE BX2  && 生成的新表
SELECT &lcStr FROM bx WHERE RECNO() = RECCOUNT() INTO ARRAY aRecc
SELECT &lcStr FROM bX1 INTO CURSOR cx
SCAN
    SCATTER FIELDS &lcStr TO aRecn
    INSERT INTO bx2 (xh) VALUES (RECNO("cx"))
    LOCAL aa[1, ALEN(laStr)]
    FOR lnj = 1 TO ALEN(laStr)
        IF aRecc[lnj] = aRecn[lnj]
            EXIT
        ELSE
            aa[1, lnj] = aRecn[lnj]
        ENDIF
    ENDFOR
    IF lnj > ALEN(laStr)
        REPLACE FROM ARRAY aa FIELDS &lcStr IN bx2
    ENDIF
ENDSCAN
SELECT bx2
BROWSE

速度可能要快点
#13
厨师王德榜2020-08-21 15:13
回复 5楼 yd1954
先说说结果是不是你想要的?
#14
yd19542020-08-21 15:25
回复 13楼 厨师王德榜
是。
是否可以将C盘下的路径,改为我的数据库的路径。
#15
yd19542020-08-21 17:20
回复 13楼 厨师王德榜
非常感谢各位的帮助。
从我在论坛求助以来,都是几位老师在帮助我。特别是吹水佬老师、sdta老师。
这次尤为感动的是,sdta老师极有耐心的几次修改代码。
再次感谢各位老师!
#16
厨师王德榜2020-08-24 17:24
回复 14楼 yd1954
可以自己改的, 我是为了测试方便,顺手丢在桌面上的,你自己当然可以根据你的实际情况来改.
#17
sdta2020-08-24 18:13
以下是引用厨师王德榜在2020-8-24 17:24:51的发言:

可以自己改的, 我是为了测试方便,顺手丢在桌面上的,你自己当然可以根据你的实际情况来改.

这样的动作是很潇洒的啊
1