首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > VFP >

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

2013-04-22 
如何查找两个相同结构的DBF表中不相同的记录?有两个结构一样的表,有个别记录不同,需要把不同的记录提取出

如何查找两个相同结构的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

热点排行