注册 登录
编程论坛 VFP论坛

大神们,求助啊!两个表中查找相同的数据——姓名!

yilance 发布于 2021-05-14 21:04, 6372 次点击
两个表格,一个是学生表,一个是毕业生表
学生表有学生己经毕业,就会在毕业生表中体现出来
学生表中有些学生非常容易重名,比如学生表中的王强在毕业生表中有4个叫王强
现在我做了一个表单

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

这样写的     


local a,b,i,num
sele 1
b=thisform.text1.value
use &b alias bb


sele 2
a=thisform.text2.value
use &a alias aa


i=0
j=0
sele 2
do while .not.eof()
   ly=xm
   sele 1
   locate for xm=ly
   if found()
      repl bb.序号 with aa.序号
      i=i+1
    else
        sele 2
        repl 标记 with '没有'
      
        j=j+1
   endif
   sele 2
  skip
  enddo  
  sele 1
  use
  sele 2
  use
  ?i
但是这样的只能查到不重名的学生
比如毕业生名中王强这样重名的,就不能把所有的王强都找出来
大神们可否帮忙修改一下
非常感谢!
66 回复
#52
sdta2021-05-16 11:35
以下是引用yilance在2021-5-16 09:41:10的发言:

谢谢!
你想的周到
我的表单运行后发现学生表中有重名的学生会出问题
不能完全比对出来

先规范 学生表 数据,再解决其它问题
#53
yilance2021-05-16 11:35
回复 48楼 sdta
亲爱的sdta版主
在线不,可否帮我看看是何原因啊,又进行不下去了,着急哇
#54
yilance2021-05-16 11:37
回复 52楼 sdta
表是规范的,因为学生表是有很重名的
我现在加上出生日期来进行再次比对了
可否帮我运行看看,己经把数据表放上面了
#55
sdta2021-05-16 11:39
以下是引用yilance在2021-5-16 11:16:14的发言:

亲爱的版主:
可否再麻烦您一下?
我己经用VFP9来操作了,但是又出现另一个问题

我把表放上去,您运行看看?

tmp 临时表中只有两个字段:序号,xm ,想不错都不可能,有 出生日期 字段吗
#56
yilance2021-05-16 11:41
回复 55楼 sdta

原来如此!我完全不懂
知之甚少,只会点简单的词语
#57
sdta2021-05-16 11:46
以下是引用yilance在2021-5-16 11:37:46的发言:

表是规范的,因为学生表是有很重名的
我现在加上出生日期来进行再次比对了
可否帮我运行看看,己经把数据表放上面了

每个学生都有一个标识个人身份的 学号 字段,你表中有吗
#58
yilance2021-05-16 12:08
以下是引用sdta在2021-5-16 11:46:54的发言:


每个学生都有一个标识个人身份的 学号 字段,你表中有吗


是的,这就是我为何发贴求助了,如果学生表有可以唯一识别的学号之类的,我自己的表单就可以完成比对了
现在的学生表就只有姓名和出生日期的信息(出生日期还是后来费劲查出来加上的,鉴于历史原因,学生表的信息太少,还有一个就是专业了,专业更不好比对,学生表中的专业很多都是简称,根本没法做为比对项)
要从几万人的毕业生表中比对挑选出来,本来都准备手工挑的,奈何后面还有如此的工作,不如做个程序一劳永逸了
==============
刚刚的程序加了出生日期,可以运行了,但是看了结果,好像不太对
只有本站会员才能查看附件,请 登录

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


程序代码:
SELECT 0
USE 出生日期2 ALIAS a
SELECT 0
USE 至2021年所有毕业生2 ALIAS b
BLANK FIELDS 序号 ALL
**ALTER TABLE b ALTER COLUMN 序号 C(20)
SELECT DISTINCT 序号,xm,出生日期 FROM b INTO CURSOR tmp READWRITE
SELECT tmp
INDEX on xm+出生日期 TAG xm
SELECT a
SET RELATION TO xm+出生日期 INTO "tmp"
REPLACE ALL tmp.序号 WITH tmp.序号-LTRIM(a.序号)-","
SELECT b
SET RELATION TO xm INTO "tmp"
REPLACE ALL b.序号 WITH tmp.序号
SELECT 序号,xm,出生日期 FROM b WHERE !EMPTY(序号) ORDER BY xm


[此贴子已经被作者于2021-5-16 12:10编辑过]

#59
sdta2021-05-16 12:21
自古华山一条路,楼主省省心吧!
#60
xuminxz2021-05-16 12:50
楼主的表怎么像学籍管理系统导出来的呀。如果是,为什么不导出考生号或学号或身份证号,这样重名的问题就不存在了吧。
#61
yilance2021-05-16 13:02
以下是引用sdta在2021-5-16 12:21:25的发言:

自古华山一条路,楼主省省心吧!

感谢!感谢!
我先比对一下,把范围缩小一点
再手工挑选了
学生表的信息量太少
#62
yilance2021-05-16 13:05
以下是引用xuminxz在2021-5-16 12:50:36的发言:

 楼主的表怎么像学籍管理系统导出来的呀。如果是,为什么不导出考生号或学号或身份证号,这样重名的问题就不存在了吧。

毕业生总表是系统中导出来的,有关键字段
但是学生表是手工填写的信息,字段很少
只有姓名,出生日期,专业,入学日期这几个字段
听了几位版主说的,也只能手工核查了
#63
yilance2021-05-16 13:13
再次写上感谢的话语,sdta版主热心详细的指导!吹水佬版主和lawan001网友费心费力的写代码,xuminxz网友的参与回复,帮我回贴,非常非常非常的感动!
感谢您们素未谋面的网友们!!!
虽然没有彻底解决这次的比对问题,但也基本能节省了很多的繁琐查找,我也是从中学习到了很多!
打心底里感谢,感谢!

#64
吹水佬2021-05-18 11:41
回复 51楼 yilance
提供的学生表 xm+出生日期 只有一个“黄腾飞”相同的记录,且毕业生总表只有一个“黄腾飞”
只有本站会员才能查看附件,请 登录

程序代码:
SELECT 0
USE 学生表 ALIAS a
SELECT 0
USE 毕业生总表 ALIAS b
BLANK FIELDS 序号 ALL
SELECT DISTINCT 序号,xm,出生日期 FROM b INTO CURSOR tmp READWRITE
SELECT tmp
INDEX on xm+出生日期 TAG xm
SELECT a
SET RELATION TO xm+出生日期 INTO "tmp"
REPLACE ALL tmp.序号 WITH tmp.序号-LTRIM(a.序号)-","
SELECT b
SET RELATION TO xm+出生日期 INTO "tmp"
REPLACE ALL b.序号 WITH tmp.序号
SELECT 序号,xm,出生日期 FROM b WHERE !EMPTY(序号) ORDER BY xm


[此贴子已经被作者于2021-5-18 11:44编辑过]

#65
yilance2021-05-18 15:25
回复 64楼 吹水佬
谢谢版主!
我也是纳闷儿了,拷贝了您的程序,运行后完全正确了
我仔细检查了我之前写的,原来是差了一个关系,难怪会错

这些程序也是很奇妙,少了一点点就千差万别


非常感谢您!

[此贴子已经被作者于2021-5-18 15:30编辑过]

#66
xuminxz2021-05-18 16:51
我以前做过类似工作。说一下我的方法,对你不知有没有用。
如果是学生填写的表,应该有班级字段。用班级加姓名找重名手工改的工作量就小多了。但一定要注意以下几点:
1、班名字段最好来自文件名,不要太相信学生填写的。比如艺术20-1班他会给你写成艺术20-1之类的
2、比较前执行一下以下命令,删除多余的空格。
REPLACE xm WITH STRTRAN(xm,CHR(41377),'') all
REPLACE xm WITH STRTRAN(xm,CHR(32),'') all
3、生日最好不要作为关键字,手工填写的准确率不高。
总之学生填写的表,只有姓名基本可靠。
#67
yilance2021-05-18 18:32
回复 66楼 xuminxz
非常感谢您!
您说的非常对,手工挑选的错误率太高了
学生写的只有姓名是正确的
感谢您们这样的热心网友的回复和帮助,真的是大大大大的帮助!让我省了太多的力气,减少了许多的错误率!
12