第 12章 多库文件操作
第 12章 多库文件操作
12.1 同时打开多个数据库文件
12.2 调用非当前库文件数据 —— 联访
12.3 被访工作区记录指针的自动移动 ——
关联
12.4 直接用一个非当前库文件修改
当前库文件命令 ——UPDATE
12.5 数据库文件的连接 —— JOIN
第 12章 多库文件操作
12.1 同时打开多个数据库文件
12.1.1 工作区和当前工作区
工作区是 FoxPro在内存中提供的一块区域 。 在一
个工作区中,可打开一个库文件及有关其它文件,如记
忆文件,索引文件等 。 并且,每一个工作区都拥有自己
独立的记录指针 。
在 FoxPro for MS --DOS的标准版本中,共有 25 个
工作区。
第 12章 多库文件操作
12.1.2 选择当前工作区
1.工作区的标号
FoxPro为每个工作区赋予一个惟一的标号,分别为
1,2,3,…,255,也称为工作区的区号 。 对应地,这些工作区
也分别称为,1号工作区,2号工作区,255号工作区 。
2,工作区的别名
除了标号外,工作区还有自己的别名 。 系统为每个
工作区规定了一个固定别名,称为系统别名 。 用户也可
为工作区定义一个别名,称为用户别名 。
(1)工作区的系统别名 。
第 12章 多库文件操作
(2)工作区的用户别名。
(3)定义用户别名的 USE命令。
3,选择当前工作区 ——SELECT
刚引入 FoxPro时, 1号工作区是当前工作区 。
SELECT 命令可改变当前工作区 。
SELECT〈 工作区号 〉 /〈 工作区别名 〉 执行后, 命
令中规定的工作区即为新的当前工作区 。
令中, 选用工作区号, 该工作区的系统别名, 用户别
名 (若存在 )都是等价的 。
第 12章 多库文件操作
12.2 调用非当前库文件数据 —— 联访
FoxPro提供了调用非当前库文件数据的方法 ——联
访 。 有两种联访格式,它们是,
〈 工作区别名 〉,〈 字段名 〉
〈 工作区别名 〉 ->〈 字段名 〉
例如,B->基本工资 #,PRICE.房电费 。
在格式 2中,, -”是连字符,“>, 是大于符 。
第 12章 多库文件操作
联访是多库文件操作的基础 。 可以说,所有的多库
文件操作,都是通过联访来完成的 。
联访不改变被访非当前库文件的内容,也不改变被
访库文件中记录指针的指向 。
由于联访只能调用非当前库文件中当前记录的字
段值,因此,为取得正确数据,在联访前,必须在被访工作
区中,使被引用数据的记录成为当前记录 。 然后,才能进
行联访 。
第 12章 多库文件操作
12.3 被访工作区记录指针的
自动移动 ——关联
12.3.1 实现关联命令 ——SETRELATION
命令的基本格式
SETRELATIONTO〈 表达式 〉 INTO〈 别名 〉 /
〈 工作区号 〉 [ ADDITIVE]
该命令使 〈 别名 〉 工作区 (或 〈 工作区号 〉 指定工
作区 )中的库文件与当前库文件建立关联 。 当前库文件为
主动库文件,也称父库文件 ;被关联库文件也称子库文件 。
第 12章 多库文件操作
一般地,子库文件以此 〈 表达式 〉 为索引关键字的
索引文件必须已打开,并成为主索引 。 每当当前库文件
记录指针移动时,子库文件的记录指针,也将根据此主索
引,指向与之匹配的第一条记录 。
ADDITIVE:若命令中未选用此选择项,命令还将取
消当前工作区原有的关联 ;若选用了此选择项,则保留当
前工作区原有关联,仅增加一个新关联 。 由此可见,一个
当前工作区可同时与多个非当前工作区建立关联 。 下
列一段程序在两工作区间建立了关联 。
第 12章 多库文件操作
SELECT1
USE 工资
INDEX ON姓名 TO姓名
SELECT 2
USE 职工
SET RELATION TO姓名 INTO工资
REPLACEALL工资 WITHA->基本工资 +A->工龄工资
+A->补贴
LIST
第 12章 多库文件操作
12.3.2 取消关联
有三种方法可以取消当前工作区与非当前工作区之
间的原有关联 。
① 在建立新关联时,不选用 ADDITIVE选择项,将取
消当前工作区与非当前工作区之间原有的所有关联 。
② 使用不建立新关联的 SETRELATION命令 。
命令格式,SETRELATIONTO
此命令将取消当前工作区与所有非当前工作区之
间的一切原有关联 。
第 12章 多库文件操作
③ 使用 SETRELATIONOFF命令 。
命令格式,SETRELATIONOFFINTO〈 别名 〉 /〈 工
作区号 〉
该命令仅取消当前工作区与命令中指定工作区之
间的关联 。 当前工作区与其它工作区之间的关联仍保
留 。
第 12章 多库文件操作
12.4 直接用一个非当前库文件修改
当前库文件命令 ——UPDATE
用关联法,可以实现使用非当前库文件修改当前库
文件的目的 。 是否能不建立关联,实现此目 的?
UPDATE命令可以满足这一要求 。 命令格式,
UPDATEON〈 关键字段 〉 FROM〈 区号 〉 /〈 别名 〉
REPLACE〈 字段名 1〉
WITH〈 表达式 1〉 [,〈 字段名 2〉 WITH〈 表达式
2〉 … ][ RANDOM]
第 12章 多库文件操作
命令中的 〈 关键字段 〉 必须为 〈 别名 〉 工作区和
当前工作区中的两库文件共有,且当前库文件必须根据
此 〈 关键字段 〉,按升序进行了排序或索引 (且为主索
引 )。
若 〈 别名 〉 区库文件也已根据此 〈 关键字段 〉,按
升序进行了排序或索引 ( 且为主索引 ),则不 选用
RANDOM;否则,必须选用 RANDOM。
该命令用 〈 别名 〉 工作区中的数据,更新当前库文
件的数据 。
第 12章 多库文件操作
UPDATE命令,将从首记录开始,修改当前库文件所
有记录的指定字段 。 在当前工作区中,记录指针每指向
一条记录,都在 〈 别名 〉 工作区中找出所有与之匹配的
记录 (根据 〈 关键字段 〉 值 ),对当前工作区中当前记录
进行修改 。 有多少条相匹配的记录,就修改多少次 。 没
有匹配记录,则不修改 。
若当前库文件中有多个记录在关键字段上取得同
一值时,则只更改其中第一个记录的有关字段值 。
第 12章 多库文件操作
12.5 数据库文件的连接 —— JOIN
如何从两个库文件中各取出一些字段,组成新的库
文件呢?JOIN命令可以解决这个问题 。
JOIN命令的格式为,
JOINWITH〈 区号 〉 /〈 别名 〉 TO〈 文件名 〉 FOR
〈 条件 〉 [ FIELDS〈 字段名表 〉 ] [ NOOPTIMIZE]
该命令将把当前库文件和 〈 别名 〉 区打开库文件
的有关字段合并在一起,形成一个新的库文件,其文件名
即为命令中给出的 〈 文件名 〉 。
第 12章 多库文件操作
若命令中缺省 〈 字段名表 〉 选择项,则新库文件中
首先包含当前库文件的所有字段,再加上 〈 别名 〉 区的
所有字段 。 但当总字段数超过 128时,则只加到 128个字
段为止 。 若命令中选择了 〈 字段名表 〉 项,新库文件只
包含 〈 字段名表 〉 给出的字段 。
JOIN命令是一条执行时间较长的命令,其执行过程
如下 。
第 12章 多库文件操作
首先,在当前库文件中,把记录指针指向第一个记录 ;
然后,在 〈 别名 〉 区从头开始,顺次查找符合 〈 条件 〉 的
记录,每查到一个,就在新库文件中生成一条新记录 ;
〈 别名 〉 区的记录全部查完后,当前库文件记录指针下
移一记录,又重复在 〈 别名 〉 区查找所有符合条件的记
录 。 如此反复查找,直到当前库文件记录指针指向库文
件尾后,EOF()为,T.时为止 。
第 12章 多库文件操作
可见,若当前库文件有 m条记录,〈 别名 〉 区有 n条记
录,则 JOIN命令要查找 m× n次 。 若每次条件都为真,则
新库文件要生成 m× n条记录,很容易超出磁盘的存储空
间 。 因此,在使用 JOIN命令时,一定要严格限定条件 。
如果要把某个库文件的记忆型字段包含进合成的
新库文件中,则必须把该库文件置为当前库文件 。
JOIN命令对两个被连接的库文件均无任何影响,生
成的新库文件是未打开的磁盘文件 。
第 12章 多库文件操作
例 合并职工,DBF和工资,DBF库文件 。 程序如下,
SELE2
USE工资
SELE 1
USE职工
JOINWITHBTO总表 FIELDS职工号,姓名,职称,部门,工
资,B.基本工资,
B.工龄工资,B.补贴 FOR姓名 =B.姓名 USE总表
LIST
第 12章 多库文件操作