读书人

怎么查找两个相同结构的DBF表中不相同

发布时间: 2013-04-22 16:01:35 作者: rapoo

如何查找两个相同结构的DBF表中不相同的记录?
有两个结构一样的表,有个别记录不同,需要把不同的记录提取出来。
如A表
idxmxb
01A011
02A021
03A031
04A042
05A052
06A062
07A071
08A081
09A091
10A102

B表
idxmxb
01A111
02A021
03A032
04A041
05A052
06A062
07A071
08A081
09A091
10A102

对比A表和B表后到不相同记录的C表
id zd btz1 btz2
01 xm A01 A11
03 xb 1 2
04 xd 2 1


[解决办法]

zd="XM"

adbf ="X:\个人数据\VF\111\表a.DBF"
bdbf ="X:\个人数据\VF\111\表b.DBF"


TF=0
CLOSE DATABASES
use
DELETE FILE dbjg.DBF
DELETE FILE ta1.DBF
DELETE FILE ta2.DBF
DELETE FILE tb1.DBF
DELETE FILE tb2.DBF

USE &adbf IN 1
zdshu=AFIELDS(Stru1,1)
DIMENSION zdmsz(zdshu)
USE &bdbf IN 2
zdshu2=AFIELDS(Stru2,2)
CLOSE DATABASES

IF zdshu!=zdshu2
MESSAGEBOX("结构不相同!",64,'信息提示')
TF=1
ELSE
FOR tc=1 TO zdshu
zdmsz(tc)=Stru1(tc,1)
IF zdmsz(tc)==zd THEN
zdh=tc
ENDIF
FOR tr=1 TO 15
IF Stru1(tc,tr)==Stru2(tc,tr)
ELSE
MESSAGEBOX("结构不相同!",64,'信息提示')
TF=1
EXIT
ENDIF
ENDFOR
IF TF=1
EXIT
ENDIF
ENDFOR
ENDIF


IF TF=0 THEN
SELECT * FROM &adbf WHERE &zd NOT IN(SELECT &zd FROM &bdbf) INTO TABLE ta1
COPY STRUCTURE TO dbjg FIELDS &zd
USE dbjg
ALTER TABLE dbjg ADD zdm C(20)
ALTER TABLE dbjg ADD dbz C(100)
DELETE FILE dbjg.BAK

SELECT * FROM &bdbf WHERE &zd NOT IN(SELECT &zd FROM &adbf) INTO TABLE tb1
CLOSE DATABASES
USE dbjg.DBF
APPEND FROM ta1.DBF
REPLACE ALL dbz WITH "B表不包含"
APPEND FROM tb1.DBF
REPLACE ALL dbz WITH "A表不包含" FOR dbz=" "
REPLACE ALL zdm WITH zd
DELETE FILE ta1.DBF
DELETE FILE tb1.DBF

SELECT * FROM &adbf WHERE &zd IN(SELECT &zd FROM &bdbf) INTO TABLE ta2
SORT TO ta1 ON &zd
SELECT * FROM &bdbf WHERE &zd IN(SELECT &zd FROM &adbf) INTO TABLE tb2
SORT TO tb1 ON &zd
CLOSE DATABASES


USE ta1
jj=&zd
DIMENSION btjl(3)
FOR i=1 TO RECCOUNT()
SKIP 1
IF jj==&zd THEN
btjl(1)=&zd
btjl(2)=zd
btjl(3)="A表记录重复"
DELETE
INSERT INTO dbjg FROM ARRAY btjl


ELSE
jj=&zd
ENDIF
ENDFOR
PACK
jlshu=RECCOUNT()
DIMENSION sja(jlshu,zdshu)
COPY TO ARRAY sja REST
CLOSE DATABASES

USE tb1
jj=&zd
DIMENSION btjl(3)
FOR i=1 TO RECCOUNT()
SKIP 1
IF jj==&zd THEN
btjl(1)=&zd
btjl(2)=zd
btjl(3)="B表记录重复"
DELETE
INSERT INTO dbjg FROM ARRAY btjl
ELSE
jj=&zd
ENDIF
ENDFOR
PACK
DIMENSION sjb(jlshu,zdshu)
COPY TO ARRAY sjb REST
CLOSE DATABASES

DELETE FILE ta1.DBF
DELETE FILE ta2.DBF
DELETE FILE tb1.DBF
DELETE FILE tb2.DBF

USE dbjg
DIMENSION btjl(3)
FOR tr=1 TO jlshu
FOR tc=1 TO zdshu
IF sja(tr,tc)!=sjb(tr,tc) THEN
btjl(1)=sja(tr,zdh)
btjl(2)=zdmsz(tc)
btjl(3)="A表和B表值不同"
mtype=VARTYPE(sja(tr,tc))
DO CASE
CASE mtype$"CM"
btjl(3)="A:"+sja(tr,tc)+" B:"+sjb(tr,tc)
CASE mtype$"NY"
btjl(3)="A:"+STR(sja(tr,tc),15,3)+" B:"+STR(sjb(tr,tc),15,3)
CASE mtype$"DT"
btjl(3)="A:"+TTOC(sja(tr,tc))+" B:"+TTOC(sjb(tr,tc))
ENDCASE
INSERT INTO dbjg FROM ARRAY btjl
ENDIF
NEXT
NEXT

ENDIF

USE dbjg
BROWSE

读书人网 >VFP

热点推荐