Visual FoxPro 程序设计
子任务九 表的查询
在数据处理过程中,我们要求从庞大的数据t_book中找出电子工业出版社出版的图书,即查找出符合某种条件或要求的记录,即查询操作。VFP中提供了对表记录的两类查询命令:顺序查询和索引查询。 1、顺序查询
格式:LOCATE FOR <逻辑表达式1> [<范围>] [WHILE <逻辑表达式2>] 功能:在表中指定的范围内查找满足条件的第一条记录。
说明:若找到符合条件的第一条记录,则将记录指针指向该记录,此时FOUND()函数返回值为.T. 。否则,记录指针指向<范围>的底部,若<范围>为ALL则记录指针执行文件结束标志,此时FOUND()函数返回值为.F.。
若继续查找符合该条件的其余记录,可使用 CONTINUE 命令。CONTINUE命令必须在LOCATE命令之后使用。
该命令可以在没有打开任何索引文件的无序的表中进行查询操作,但是在数据良庞大的表中进行查询时速度慢。
在表t_book中查找出版社是\清华大学出版社\的图书。 index on 出版社 tag cbs set order to cbs
locate for 出版社=\清华大学出版社\display continue display 2、索引查询
无论是否有打开的索引文件都可以用LOCATE命令进行顺序查找,但打开索引文件后还可以用FIND命令和SEEK命令进行快速查询。
(1) FIND命令
格式: FIND <字符串>/<数值常量>
功能:在表文件和有关索引文件打开的情况下,查找出索引关键字值与所指定的<字符串>或<数值常量>相匹配的第一条记录。
说明:
如果找到,则把记录指针指向该记录,并且将FOUND()函数的值为.T.。
如果没有找到与其相符的记录,则将记录指针指向文件结束标志,且将FOUND()函数的值臵为.F.,将EOF()函数的值臵为.T.。
如果有多个与关键字匹配的记录,则记录指针定位于其中的第一条记录上。由于已经打开相关索引文件,所以关键字段值相同的记录排列在一起,若查询后续记录,可用SKIP。
<字符串>可以是字符串常量,此时不需使用定界符。也可以使用字符型变量,但需要用宏代换函数&进行转换。
26 Page 模块三 数据库设计
执行SET EXACT OFF命令后,用FIND命令查找字符串时,字符串可以是索引表达式值的全部或是从首字符开始的一个子串。执行SET EXACT ON命令后,用FIND命令来查找字符串,则字符串只能和索引表达式的值精确匹配。
边学边练 在表t_book中查找图书编号是\的图书。 index on图书编号 tag tsbh set order to tsbh find T0005 ?found() display
(2 )表达式查询命令 命令:SEEK <表达式>
功能:在表文件和有关索引文件打开的情况下,查找出索引关键字值与所指定的<表达式>的值相匹配的第一条记录。
说明:SEEK命令可查找字符型、数值型、日期型、逻辑型表达式的值。SEEK命令中的表达式必须使用相应的定界符,以确定表达式类型。
边学边练
在表t_book中查找图书编号是\的图书。 index on图书编号 tag tsbh set order to tsbh seek \?found() display
子任务十 统计与计算
在sf_books的数据管理过程中,我们经常需要对各出版社的图书进行统计计算、对单价按出版社进行求和、求平均值等,该怎么办呢?VFP给我们提供了这方面的命令。
1、统计记录数
命令:COUNT [TO<内存变量>][<范围>][FOR<逻辑表达式1>][WHILE<逻辑表达式2>] 功能:统计当前表中指定范围内满足条件的记录个数。
Page 27
Visual FoxPro 程序设计
说明:当缺省所有短语时计算所有记录的个数。使用TO <内存变量>可将统计的结果保存到指定的内存变量,否则将统计结果显示在屏幕上。使用SET DELETE OFF,则加删除标记的记录将被统计在内。
统计清华大学出版社的图书个数
count for 出版社=\清华大学出版社\2、求和
命令:SUM [<表达式表>][TO <内存变量名表>][<范围>] [FOR <逻辑表达式1>] [WHILE <逻辑表达式2>]
功能:将指定范围内满足条件的记录,按指定的各个表达式分别求和。
说明:<表达式表>是由数值型字段组成,若省略,则对当前表的所有数值型字段求和。TO <内存变量表>:将求和结果按顺序存入指定内存变量,<内存变量表>中的变量的个数不得少于<表达式表>中表达式的个数。省略范围和条件短语则对所有记录进行操作。
对出版社是清华大学出版社的图书的单价求和。 sum 单价 for 出版社=\清华大学出版社\3、求平均值
命令:AVERAGE [<表达式表>][TO <内存变量表>][<范围>][FOR <逻辑表达式1>] [WHILE <逻辑表达式2>]
功能:对当前表中指定范围内满足条件的记录的数值型字段求算术平均值。 说明:选项用法同SUM 求合计命令
对出版社是清华大学出版社的图书的单价求平均值。 AVERAGE 单价 for 出版社=\清华大学出版社\。
拓展知识 工作区与多表使用
在前面我们对表的操作中,每次只打开一个表。例如打开t_book.dbf与t_reader.dbf,但当t_book.dbf打开时,t_reader.dbf自动关闭。还有在表单操作中,在实际应用中很多情况都需要多表同时打开操作,同时从多表中获取有价值的数据。这类问题VFP用工作区方式给予解决。
1、工作区
VFP允许一个工作区只能打开一个表,但VFP提供32767个工作区,因此就可以打开多个表。
(1)指定表的别名
格式:USE [<表名>] [ALIAS <别名> | IN 工作区号]
功能:在打开表的同时为表指定一个别名,若省略了ALIAS<别名>子句,默认表名与表的别名相同。别名的命名规则与表名相同。或在打开表的同时指定工作区,工作区号为0~32767。
说明:
28 Page 模块三 数据库设计
①工作区号取值可为0~32767,若取0,则选择一个未使用的最小编号工作区为当前工作区。工作区号1~10也可用A~J字母表示。
②SELECT()函数可以返回当前工作区号。
(2)当前工作区为正在使用的工作区,可以通过“数据工作区窗口”或用SELECT命令将任何一个工作区设臵为当前工作区,其格式为:
SELECT <工作区号> |<别名> 如果要操作非当前工作区中的表,可以将其他工作区选为当前工作区,或在命令中强行指定工作区,其格式为:
IN<工作区>| <别名>
(3) ALIAS函数,测试指定工作区中标的别名,其格式为:
ALIAS([工作区号]) (4)关闭工作区中的表
格式:CLOSE ALL
功能:关闭所有工作区打开的表并选择工作区1位当前工作区。
边学边练 在不同的工作区分别打开t_book.dbf、t_reader.dbf然后进行浏览。结果如3-27所示。 SELECT 1
USE t_book ALIAS 图书表 TT1=ALIAS()
BROWSE TITLE \当前的工作区的别名为: &TT1\SELECT 2
USE t_reader ALIAS 读者表 TT2=ALIAS()
BROWSE TITLE \当前的工作区的别名为: &TT2\
CLOSE ALL &&若用USE只关闭当前工作区的表
图3-27 不同的工作区打开t_book.dbf、t_reader.dbf的浏览结果 2.多表使用 (1)表的关联
Page 29
Visual FoxPro 程序设计
表的关联是指在两个表之间,当一个表(父表)的记录指针移动时,另一个表(子表)的记录指针根据父表的要求(也称关联条件或称关联表达式)指向子表的相应记录上。VFP用这种关联控制或将表之间建立关系从而实现多表同时使用。在多表之间同时获取有价值的数据的目的。
(2)关系
①一对一关系
由关联条件,父表只有一条记录与子表只有一条记录相对应。 ②一对多关系
由关联条件,父表只有一条记录与子表多条记录相对应。 ③多对一关系
由关联条件,父表有多个记录与子表只有一条记录相对应。 ④多对多关系
由关联条件,父表有M条记录与子表有N条记录相对应。 表之间的多对多关系问题处理起来较为复杂,常是将其中的一个表分解,然后形成一对多或多对一关系。
(3)用命令建立关联
格式:SET RELATION TO [<关联表达式1>] INTO <别名1>, …<关联表达式n> INTO <别名N> [ADDITIVE]
功能:以当前表为父表<关联表达式1>为关联条件与别名1表为子表建立关联,以<关联表达式2>为关联条件与别名n为子表建立关联。
说明:
①若无任何选项,将已建立的关联删除。
②[ADDITIVE]子句是在建立关联时,保留以前建立的关联。
边学边练 用命令建立关系的应用。 CLEAR SELECT 1 USE 学生
INDEX ON 学号 TAG T1 ADDI SELECT 2 USE 学生成绩
INDEX ON 学号 TAG T2 ADDI SELECT 1
SET RELATION TO 学号 INTO 学生成绩 ADDITIVE LIST 学号, 姓名, B->数学, B->VFP, B->英语
BROWSE FIELDS 学号, 姓名, B->数学, B->VFP, B->英语 SET RELATION TO CLOSE ALL
30 Page