APP下载

关联在多表数据操作中的应用

2020-02-25席彤雷强

汽车实用技术 2020年2期
关键词:厂家编码关联

席彤 雷强

摘 要:面对大量数据,关联是一种行之有效的方法。由于VFP语言简单易学,有广大的用户群,非常适合普及。这就使得非计算机人员也可以方便的掌握关联这种方法。经过几年的应用,我们在利用用户别名来分清当前工作区、关联时索引关键字必须结构一致、多对一表的关联方法、关联产生循环的处理方法等方面总结出一些经验。关键词: VFP;用户别名;当前工作区;联访;关联;应用;经验中图分类号:TP319  文献标识码:A  文章编号:1671-7988(2020)02-64-06

Abstract: Facing a great deal of data, the connection is a kind of to go of valid method.Because the language of VFP is in brief easy to learn, there are large customers, very in keeping with universality.This make non- calculator personnel also can with convenient control connection this kind of method. Through several years of application, we at make use of the customer nickname to peg out the current work area, connection the index key word must the structure is consistent, an a the processing method etc. of the connection method, connection creation circulation of the form tallies up a some experience.Keywords: VFP; The customer nickname; Current work area; Joint visit; Connection; Application; ExperienceCLC NO.: TP319  Document Code: A  Article ID: 1671-7988(2020)02-64-06

前言

据统计,全世界80%以上的计算机主要从事事务处理工作。在进行事务处理时,不要求复杂的科学计算,主要是要求从大量有关数据中提取信息。为了有效的使用存放在计算机系统中的大量有关数据,必须采用一整套严密合理的方法来对数据进行操作。由于VFP语言简单易学,拥有广大的用户群,便于我们学习掌握和推广。面对大量数据,运用手工方法显然不能解决问题时,利用VFP语言是一种首选。而我们也会常常遇到多个数据表之间的信息需要相互对应交换的问题,这时就需要一种行之有效的方法—关联。

1 关联的两个关键点

1.1 第一个关键点—工作区

在关联中,利用用户别名分清当前工作区是非常重要的。

用户别名—当用户在某工作区打开一个表文件时,也同时为此工作区自行定义的那个别名就称为用户别名。其实系统也为可每个工作区规定了一个固定别名,叫系统别名。1号工作区也称为A工作区,它的系统别名为W1;2号工作区也称为B工作区,它的系统别名为W2;以此类推。但是我们不推荐使用系统别名。

格式:

USE〈表文件名〉[ALIAS〈别名〉][NOUPDATE]

其中有ALIAS選择项时,〈别名〉就是用户为当前工作区规定的用户别名;无ALIAS选择项时,打开的表文件名就是当前工作区的用户别名。在VFP中关键字的头四个字母就可代表该关键字。但是,当用户指定的别名中包含有不支持的字符时,系统将自动为该工作区创建一个别名,例如A—J不能作为用户别名。当有NOUPDATE项时,不允许修改打开表文件的结构。

1.1.1 举例帮助理解工作区

例1:下述命令是打开CPXX表(即产品信息表),并且定义别名为CP:

USE CPXX ALIA CP

经验:

工作区的别名是程序员区别当前工作区的重要标识。一般情况下,别名就选用用户别名,并且最好寓于每个别名以含意,可取的方法有,将用户别名定义为对应的数据表名的汉语首位字母的缩写或简称,不要简单的选用系统别名,否则打开的工作区一多,容易引起混乱。

当前工作区—用户正在对表文件进行操作的工作区就称为当前工作区。在当前工作区中打开的表文件称为当前打开表文件,简称当前表文件。用户可以选择任意工作区为当前工作区。每个工作区都有自己的标号和别名。用户利用工作区的标号和别名来选择、更改当前工作区。

格式:

SELECT〈工作区号〉∕〈工作区别名〉

执行后,命令中规定的工作区即为新的当前工作区。选用的工作区号、该工作区的系统别名、用户别名(若存在)都是等价的。

例2:下述三种命令选择的都是同一工作区。

SELECT 2

USE CPXX ALIA CP

SELE CP

SELECT B

1.2 第二个关键点—联访

联访—是一种调用当前表文件数据的方法。联访是多表文件操作的基础。可以说,所有的多表文件操作都是通过联访来完成的。

格式1:

〈工作区别名〉.〈字段名〉

格式2:

〈工作区别名〉->〈字段名〉

1.2.1 举例幫助理解联访

例3:下述指的都是别名为CPXX表的产品编号这个字段。

CPXX.产品编号

CPXX->产品编号

但是联访不改变被访非当前表文件的内容,也不改变被访非当前表文件中记录指针的指向。所以它一般不单独应用,只是作为一种调用的手段。要想有能够根据当前表文件记录指针的指向而自动移动这个功能,就要用到关联了。

2 利用工作区和联防建立多表数据关联

关联—是当当前工作区和另一工作区建立联系后,每当当前工作区的记录指针移动时,被关联工作区的记录指针也将自动相应移动的一种命令。它常用于处理大量多表数据。

格式:

SET RELATION TO〈表达式〉INTO〈别名〉∕〈工作区号〉[ADDITIVE]

该命令使〈别名〉工作区(或〈工作区号〉指定工作区)中的表文件与当前表文件建立关联。当前表文件为主动表文件,也称父表文件,被关联表文件称为子表表文件。一般的子表文件以此〈表达式〉为索引关键字的索引文件必须已打开,并要成为主控索引。每当当前表文件记录指针移动时,子表文件的记录指针,也将根据此主控索引,指向与之匹配的第一条记录。若找不到匹配记录,则指针指向子表文件尾后,EOF()为.T.。

2.1 举例帮助理解关联

例4:下面的是一段应用关联的小例子。它是通过关联,实现把产品信息表中的计划价带入到盘点表中。

*关闭所有数据库,即所有表也随之关闭

clos data

*定义默认路径为F:\应用\盘点\2\

set defa to F:\应用\盘点\2\

*选择1工作区为当前工作区

sele 1

*打开cpxx表,并且定义别名为cp

use cpxx alia cp

*以索引关键字cpbh创建索引文件1

inde on cpbh to 1

*这里选择B工作区为当前工作区,其实就是选择2工作区为当前工作区

sele B

*打开tmp_kcyj表,并且定义别名为kc

use tmp_kcyj alia kc

*以索引关键字cpbh创建索引文件2

inde on cpbh to 2

*使别名为cp的子表文件与当前别名为kc的父表文件建立关联,并且索引文件1成为主控索引,索引关键字为cpbh

set rela to cpbh into cp

*原jhj清零

repl all jhj with 0

*替换计划价

repl all jhj with cp.jhj for !”JJ”$cpbh.and.kc.cpbh=cp.cpbh

*替换进口价

repl all jhj with cp.jkj for “JJ”$cpbh.and.kc.cpbh=cp.cpbh

*关闭tmp_kcyj表

use

*选择1工作区为当前工作区

sele 1

*关闭cpxx表

use

关键点:两个表的索引关键字可以不同名,但结构必须完全一致。

若〈表达式〉为数值型,子表文件可以不索引;但〈表达式〉为字符型或日期型,且子表文件未索引,则将显示出错提示:

“table has no index order set”

若命令中未选用ADDITIVE选择项,命令还将取消当前工作区原有的关联;若选用了此选择项,则保留当前工作区原有的关联,且增加一个新关联。由此可见,一个当前工作区可同时与多个非当前工作区建立关联。

3 取消关联

若两个表已建立关联关系,再次和第三张表建立关联关系易发生循环,从而较难建立与第三张表的关联关系,有种简单的方法可以实现重新建立关联,即:取消关联,也就是可以先取消原先两张表的关联关系,再重新建立新表与原表的关联。

3.1 取消当前工作区与原有工作区关联

(1)在建立新关联时,不选用ADDITIVE选择项,将取消当前工作区与非当前工作区之间原有的所有关联。

(2)用命令,此命令将取消当前工作区与所有非当前工作区之间的一切原有关联。

格式:

SET RELATION TO

3.1.1 举例帮助理解取消当前工作区与原有工作区关联

例5:随着单机版工艺路线的结束,PDM系统的广泛的应用,我们因为技术需要,要求我们内部从PDM系统查得的产品信息不光需要计划员信息,还需要厂家信息。下面就是一个以单个计划员为例,要求列出这个计划员采购零件涉及的所有厂家。

*关闭提示信息

set safe off

close data

set defa to E:\

sele 1

*打开临时表

use 临时库.dbf alia lsk

*清空表

Zap

*追加带有厂家信息的数据表纪录

appe from zs

inde on 物料编码 to 1

sele 2

*打开以计划员张三名字命名的数据表

use 张三.dbf alia cj

inde on th to 2

*建立张三表與临时表之间的关联

set rela to th into lsk

*将字段sczt确立为标记字段

repl all sczt with ""

repl all sczt with "*" for cj.th=lsk.物料编码

repl all cjbh1 with ""

repl all cjbh1 with lsk.cjbh for cj.th=lsk.物料编码

*张三表的第一个厂家清空

repl all cjmc1 with ""

*替换张三表的第一个厂家

repl all cjmc1 with lsk.厂家名称 for cj.th=lsk.物料编码

*取消所有关联

set rela to

sele 1

*建立临时表和张三表之间的关联

set rela to 物料编码 into cj

*临时表的标记清空

repl all bj with ""

*将张三表替换了第一个厂家的记录打上标记

repl all bj with "*" for lsk.物料编码=cj.th.and.lsk.cjbh= cj.cjbh1

*取消所有关联

set rela to

*将临时库中打上标记的纪录彻底删除

dele for bj="*"

pack

inde on 物料编码 to 1

sele 2

inde on th to 2

set rela to th into lsk

repl all sczt with ""

repl all sczt with "*" for cj.th=lsk.物料编码

repl all cjbh2 with ""

repl all cjbh2 with lsk.cjbh for cj.th=lsk.物料编码

*张三表的第二个厂家清空

repl all cjmc2 with ""

*替换张三表的第二个厂家

repl all cjmc2 with lsk.厂家名称 for cj.th=lsk.物料编码

set rela to

sele 1

set rela to 物料编码 into cj

repl all bj with ""

*将张三表替换了第二个厂家的记录打上标记

repl all bj with "*" for lsk.物料编码=cj.th.and.lsk.cjbh= cj.cjbh2

set rela to

*将临时库中打上标记的纪录彻底删除

dele for bj="*"

pack

inde on 物料编码 to 1

sele 2

inde on th to 2

set rela to th into lsk

repl all sczt with ""

repl all sczt with "*" for cj.th=lsk.物料编码

repl all cjbh3 with ""

repl all cjbh3 with lsk.cjbh for cj.th=lsk.物料编码

*张三表的第三个厂家清空

repl all cjmc3 with ""

*将张三表替换了第三个厂家的记录打上标记

repl all cjmc3 with lsk.厂家名称 for cj.th=lsk.物料编码

set rela to

sele 1

set rela to 物料编码 into cj

repl all bj with ""

repl all bj with "*" for lsk.物料编码=cj.th.and.lsk.cjbh= cj.cjbh3

set rela to

*将临时库中打上标记的纪录彻底删除

dele for bj="*"

pack

inde on 物料编码 to 1

sele 2

inde on th to 2

set rela to th into lsk

repl all sczt with ""

repl all sczt with "*" for cj.th=lsk.物料编码

repl all cjbh4 with ""

repl all cjbh4 with lsk.cjbh for cj.th=lsk.物料编码

*张三表的第四个厂家清空

repl all cjmc4 with ""

*将张三表替换了第四个厂家的记录打上标记

repl all cjmc4 with lsk.厂家名称 for cj.th=lsk.物料编码

set rela to

sele 1

set rela to 物料编码 into cj

repl all bj with ""

repl all bj with "*" for lsk.物料编码=cj.th.and.lsk.cjbh= cj.cjbh4

set rela to

*将临时库中打上标记的纪录彻底删除

dele for bj="*"

pack

inde on 物料编码 to 1

sele 2

inde on th to 2

set rela to th into lsk

repl all sczt with ""

repl all sczt with "*" for cj.th=lsk.物料编码

repl all cjbh5 with ""

repl all cjbh5 with lsk.cjbh for cj.th=lsk.物料编码

*张三表的第五个厂家清空

repl all cjmc5 with ""

*将张三表替换了第五个厂家的记录打上标记

repl all cjmc5 with lsk.厂家名称 for cj.th=lsk.物料编码

set rela to

sele 1

set rela to 物料编码 into cj

repl all bj with ""

repl all bj with "*" for lsk.物料编码=cj.th.and.lsk.cjbh= cj.cjbh5

set rela to

*将临时库中打上标记的纪录彻底删除

dele for bj="*"

pack

inde on 物料编码 to 1

sele 2

inde on th to 2

set rela to th into lsk

repl all sczt with ""

repl all sczt with "*" for cj.th=lsk.物料編码

repl all cjbh6 with ""

repl all cjbh6 with lsk.cjbh for cj.th=lsk.物料编码

*张三表的第六个厂家清空

repl all cjmc6 with ""

*将张三表替换了第六个厂家的记录打上标记

repl all cjmc6 with lsk.厂家名称 for cj.th=lsk.物料编码

set rela to

sele 1

set rela to 物料编码 into cj

repl all bj with ""

repl all bj with "*" for lsk.物料编码=cj.th.and.lsk.cjbh= cj.cjbh6

set rela to

*将临时库中打上标记的纪录彻底删除

dele for bj="*"

pack

inde on 物料编码 to 1

经验:在多对一的情况下,若当前表文件中有多个记录在关键字段上取得同一值时,则只更改其中第一个记录的有关字段值。上面就是这样一个例子。因为要求列出张三这个计划员采购零件涉及的所有厂家,而一个零件可能会有多个厂家供应,所以这里需要建立一个临时库,把带有厂家信息的库追加进去,当计划员表代上第一个厂家后,将临时库中代过厂家的零件删掉,这样临时库中排在第二的厂家就变为第一个厂家了,就可以依照第一个厂家的代法替换上厂家了。如此反复操作,直到最后一个厂家全部为空,就说明这个计划员涉及的所有厂家均已代上。

3.2 取消当前工作区与指定工作区关联

用命令,此命令仅取消当前工作区与命令中指定工作区之间的关联,当前工作区与其他工作区之间的关联仍保留。

格式:

SET RELATION OFF INTO〈别名〉∕〈工作区号〉

3.2.1 举例帮助理解取消当前工作区与指定工作区关联

例6:在K3系统和ERP系统切换之初,双系统并列运行时,两个系统月结后,需要对照差异。下面就是算盘赢盘亏中的一部分代码。

set defa to D:\xt\验证\

clos data

set safe off

sele 1

*打开库存月结表

use tmp_ kcyj alia kc

inde on cpbh to 1

sele 2

*打开实盘表

use pds alia pd

inde on cpbh to 2

sele 3

*打开产品信息表

use cpxx alia cp

inde on cpbh to 3

sele 1

set rela to cpbh into cp

*库存月结表中的计划价清零

repl all jhj with 0

*替换计划价

repl all jhj with cp.jhj for kc.cpbh=cp.cpbh.and.cp.pjlb="汽配件"

*替换进口价

repl all jhj with cp.jkj for kc.cpbh=cp.cpbh.and.cp.pjlb="进口件".and.kc.jhj=0

*只取消库存月结表和产品信息表之间的关联

set rela off into cp

*建立库存月结表和实盘表之间的关联

set rela to cpbh into pd

*库存月结表中的实盘数清零

repl all sps with 0

*将库存月结表的实盘数替换成实盘表的实盘数

repl all sps with pd.sps for kc.cpbh=pd.cpbh

repl all kgy_pd with ""

repl all kgy_pd with pd.kgy for kc.cpbh=pd.cpbh

*标记清空

repl all bj with ""

*将替换过实盘数的记录打上标记

repl all bj with "*" for kc.cpbh=pd.cpbh

sele 2

*建立实盘表和产品信息表之间的关联

set rela to cpbh into cp

repl all jhj with 0

repl all jhj with cp.jhj for pd.cpbh=cp.cpbh.and.cp.pjlb="汽配件"

repl all jhj with cp.jkj for pd.cpbh=cp.cpbh.and.cp.pjlb="进口件".and.pd.jhj=0

*因为此时实盘表只和产品信息表建立了关联,下面的一句代码与set rela to在这里实际等价,它是取消实盘表和产品信息表之间的关联。

set rela off into 3

*set rela to

sele 1

*因為此时库存月结表和实盘表间已建立了关联,所以只需使用联访即可实现数据间的替换。

repl all pd.kc with 0

repl all pd.kc with kc.qm_sl for kc.cpbh=pd.cpbh

repl all pd.kgy_kc with ""

repl all pd.kgy_kc with kc.kgy for kc.cpbh=pd.cpbh

repl all pd.kczj with 0

repl all pd.kczj with jhj*kc

repl all pd.spzj with 0

repl all pd.spzj with jhj*sps

repl all pd.bj with ""

repl all pd.bj with "*" for kc.cpbh=pd.cpbh

use

sele 2

use

sele 3

use

经验:因SET RELATION OFF INTO〈别名〉∕〈工作区号〉语句易引起关联循环,故应用较少。一旦发生循环,就选择与之发生循环的工作区为当前工作区,采用联访的方式操作既可。

4 总结

现在大量普通非IT业务人员,只能简单应用EXCEL表格处理数据,在处理百条级数据还好,一旦上升为千条数据,尤其涉及多表调用,EXCEL的效率低,易出错,且机子经常死机的问题就凸显出来。所以,学习一些简单实用的数据库代码,能够大幅提升工作效率和准确率,笔者非常看好这方面的应用前景。

随着计算机的普及,要求我们处理大量数据的能力也大大提高。所以VFP的使用已不再只是以前那种专业计算机人员的事情了。随着VFP的大量应用,一些可行的数据方法也随之被推广。在这其中,关联由于其实用性,被广泛应用。我们可以看到,大量的多表数据替换问题都采用了关联,这样可以使问题简化,许多问题便迎刃而解,这大大提高了我们的工作效率。在当初ERP系统上线之前,我们需要手工对照K3系统和ERP系统的数据差异,为了提高效率,我们编写了许多采用关联解决问题的实用小程序,使原来的对照时间缩短了一半以上,这为ERP的及时上线也起到了重要作用。由于它的简单易学,它在许多的非专业计算机人员中非常普及。现在,对于许多后台数据,我们仍然大量采用关联编写的代码,它的应用前景依然十分广阔。

参考文献

[1] 郭盈发.张红娟.赵伟华.Visual FoxPro 6.0及其程序设计[M].西安:西安电子科技大学出版社,2001.

[2] 郭盈发.FoxPro 2.5、2.6及其程序设计[M].西安:西安电子科技大学出版社,1995.

[3] 胡克杰等.中文Visual FoxPro 6.0属性 设计 控件及方法[M].北京:北京航空航天大学出版社,1999.

[4] 吴迪,曲蒙.Visual FoxPro 6.0命令手册[M].北京:清华大学出版社, 1999.

猜你喜欢

厂家编码关联
住院病案首页ICD编码质量在DRG付费中的应用
4/5G异厂家多制式协同参数策略研究
奇趣搭配
拼一拼
小经销商如何选择代理厂家
高效视频编码帧内快速深度决策算法
智趣
小经销商如何选择代理厂家
试论棋例裁决难点——无关联①
都是业务员惹的祸?