Visual FoxPro程序设计
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.5 多表操作

前面所有的操作都是有关一个数据表的,但在实际工作中,常常需要同时使用几个数据表中的数据,这就要用到多个数据表的操作命令。

3.5.1 工作区的选择和互访

在VFP中,一个工作区只能打开一个数据表文件,如果在同一个工作区中打开了另一个数据表文件,则系统自动关闭前一个已打开的数据表文件。如果同时使用多个数据表文件,就需要在不同的工作区中分别打开,这就要通过选择工作区的命令来实现。VFP在内存中提供了32 767个工作区,工作区编号从1~32 767,前10个工作区除使用编号外,还依次使用了A~J的工作区别名。

1.工作区的选择

【命令格式】 SELECT <工作区号/别名>

【功能】 选择指定的工作区为当前工作区。

【说明】 若指定工作区号为0,则选择未被使用的最小工作区为当前工作区。

【例3.13】 在不同工作区中打开学生表、分数表和课程表,并分别为它们定义别名。

SELECT A         &&选择1号工作区为当前工作区
USE 学生表 ALIAS XSB     &&在1号工作区打开学生表并定义别名为XSB
LIST

显示结果如下:

SELECT B        &&选择2号工作区为当前工作区
USE 分数表 ALIAS FSB
LIST

显示结果如下:

SELECT 0  &&选择未用的最小工作区(第3号工作区)为当前工作区
USE 课程表 ALIAS KCB
LIST

显示结果如下:

2.工作区的互访

【命令格式】 工作区别名.字段名

【功能】 在当前工作区访问指定工作区打开表的字段。

【例3.14】 有一单价表DJ.DBF和一用户表USER.DBF如下。

DJ.DBF:

USER.DBF:

要求计算出本月各用户的费用。

SELECT 1
USE DJ
SELECT 2
USE USER
REPLACE ALL 金额 WITH 用水*A.水价+用电*A.电价+用气*A.煤气价
LIST

显示结果如下:

3.5.2 表的关联

1.关联的概念

关联就是令在不同工作区打开的表的记录指针建立一种临时的联动关系,使一个表的记录指针移动时另一个表的记录指针能随之移动。

在关联的两个表中,当前表是主动表,称为父表;别名工作区中的表是被动表,称为子表。两个表必须有相同的字段才能建立两个表的关联,这个相同的字段称为关键字段。

2.关联的种类

表的关联有一一关系、一多关系、多一关系和多多关系。在关联的两个表中,若父表的一条记录对应子表的一条记录则称一一关系;若父表的一条记录对应子表的多条记录则称一多关系;若父表的多条记录对应子表的一条记录则称多一关系;若父表的多条记录对应子表的多条记录则称多多关系。

一一关系可以看做是一多关系或多一关系的一个特例,VFP能够处理一多关系和多一关系,但不能处理多多关系。

3.建立关联的命令

【命令格式】 SET RELATION TO<关键表达式>INTO<别名>

【功能】 通过关键表达式将当前表和别名工作区表建立关联。

【说明】 子表应在关键字上建立索引。

【例3.15】 将学生表与分数表建立关联后,显示学生的学号、姓名、性别、班级、成绩等字段的内容。

SELECT 2
USE 学生表
INDEX ON 学号 TO XH
SELECT 1
USE 分数表
SET RELATION TO 学号 INTO B
LIST 学号,B.姓名,B.性别,B.班级,课程编码,成绩

显示结果如下:

【例3.16】 有一图书调价单TJD.DBF和一订货单DHD.DBF如下。

TJD.DBF:

DHD.DBF:

要求用TJD中的新价修改DHD中的单价,并改正金额字段值。

SELECT 1
USE TJD
INDEX ON 书名 TO TJDID
SELECT 2
USE DHD
SET RELATION TO 书名 INTO A
REPLACE ALL 单价 WITH A.新价,金额 WITH 单价*册数
LIST

显示结果如下:

4.使用“数据工作期”窗口创建临时关联

在“数据工作期”窗口可以创建临时关系,也可以看到已经创建的临时关系,如图3.2所示。

下面仍以【例3.15】为例,说明使用“数据工作期”窗口创建临时关系的步骤。

图3.2 “数据工作期”窗口

(1)单击VFP工具栏里的“数据工作期”按钮,打开“数据工作期”窗口。

(2)单击“打开”按钮,打开数据表“分数表”。

(3)单击“打开”按钮,打开数据表“学生表”。

(4)选择“学生表”,单击“属性”按钮,打开“工作区属性”对话框,在其中“索引顺序”下拉列表框中选择索引名“学生表.学号”,单击“确定”按钮,如图3.3所示。

(5)选择“分数表”,单击“关系”按钮。

(6)选择“学生表”,自动显示“表达式生成器”,在其中双击“分数表”的“学号”字段,使“学号”字段显示在“SET RELATION:<expression> ”框中,单击“确定”按钮,如图3.4所示。

至此,就可以看到如图3.2所示的窗口了。

图3.3 “工作区属性”窗口

图3.4 “表达式生成器”窗口

3.5.3 表的联接

联接是将当前工作区的表和指定工作区的表按照关键字段进行联接,形成一个新表。

【命令格式】 JOIN WITH〈工作区号/别名〉TO〈新表名〉FOR〈联接条件〉[FIELDS〈字段名表〉]

【功能】 联接两个表,生成一个新表。

【例3.17】 现有TEACHER和TEACHER1两个表如下。

TEACHER.DBF:

TEACHER1.DBF:

要求按姓名将TEACHER和TEACHER1联接起来,生成一个TEACHER2表,新表包括姓名、性别、学历、教研室和职称字段。

SELECT 1
USE TEACHER
SELECT 2
USE TEACHER1
JOIN WITH A TO TEACHER2 FOR 姓名=A.姓名 FIELD 姓名,性别,学历,A.教研室,A.职称
USE TEACHER2
LIST

显示结果如下: