2009-7-26 Visual FoxPro 6.0程序设计 1
学习要点
1、数据的分类和索引;
2、记录的查找定位;
3、数据的统计和计算;
4、多工作区操作。
第 4章 数据的检索、统计与多工作区操作
2009-7-26 Visual FoxPro 6.0程序设计 2
第 4章 数据的检索、统计与多工作区操作
4.1 数据分类排序
4.2 数据的索引
4.3 数据的查询
4.4 数据的统计
4.5 多工作区操作返回 退出小结
2009-7-26 Visual FoxPro 6.0程序设计 3
4.1 数据分类排序分类,将关键字段值相同的记录按顺序存放在一起,生成一个新的表文件。
格式,SORT TO <表文件名 > ON <字段名 1> [/A | /D] [/C] [,<字段名 2> [/A | /D] [/C],..] [ASCENDING|DESCENDING] [<范围 >]
[FOR <逻辑表达式 >] [WHILE <逻辑表达式 >] [FIELDS <字段名列表 > | FIELDS LIKE <框架 > | FIELDS EXCEPT <框架 >]
功能,对当前选定的表排序,并将排序后的记录输出到新表中。
参数描述:
<表文件名 >,指定经过排序后所生成的新表的表文件名。
ON <字段名 1>,在当前选定的、要排序的表中指定关键字段,
字段的内容和数据类型决定了记录在新表中的顺序。
[/A | /D] [/C],指定排序顺序(升序或降序)。 /A指定为按升序排序,/D指定按降序排序。如果在字符型字段名后面包含 /C,则忽略大小写。可以把 /C选项与 /A或 /D选项组合起来。
返 回
2009-7-26 Visual FoxPro 6.0程序设计 4
[ASCENDING],将所有不带 /D的字段指定为升序排列。
[DESCENDING],将所有不带 /A的字段指定为降序排列。如果省略 ASCENDING 和 DESCENDING参数,则排序默认为升序。
[<范围 >],指定需要排序记录的范围。默认范围为 ALL。
[FOR <逻辑表达式 >],在当前表中指定排序中只包含逻辑条件为“真”的记录。
[WHILE <逻辑表达式 >],指定一个条件,在当前表中只要 <逻辑表达式 >的计算值为“真”,则依据此条件,排序中包含这条记录。
[FIELDS <字段名列表 >],指定用 SORT命令排序时所创建的新表中要包含的原表中的字段。如果省略 FIELDS子句,新表中将包含原表中的所有字段。
[FIELDS LIKE <框架 >],在新表中包含那些与字段梗概框架相匹配的原表字段。
[FIELDS EXCEPT <框架 >],在新表中包含那些不与字段梗概框架相匹配的原表字段。
2009-7-26 Visual FoxPro 6.0程序设计 5
4.2 数据的索引索引文件有二种,单索引文件 和 复合索引文件,而复合索引文件又可分为 结构复合索引 文件和 非结构复合索引 文件两种。
VFP对结构复合索引文件提供了四种类型,主索引,候选索引,
唯一索引 和 普通索引 。
主索引 是指关键字段或索引表达式中不允许出现重复值的索引,
主要用于主表或被引用的表,用来在一个永久关系中建立参照完整性。一个表而言,只能创建一个主索引。
候选索引 是可以作主关键字的索引,因为它不包含 Null值或重复值。在数据表和自由表中均可以为每个表建立多个候选索引。
唯一索引 不允许两个索引具有相同的索引值,这种要求与主索引相同。为了保持与早期版本的兼容性,可以建立一个唯一索引,
以指定字段的首次出现值为基础,选定一组记录,并对记录进行排序。
普通索引 可以用来对记录排序和搜索记录,它不强迫记录中的数据具有唯一性。在一个表中可以有多个普通索引。
2009-7-26 Visual FoxPro 6.0程序设计 6
选择合适的索引类型可以以下列准则作为依据:
1、如果需要排序记录,以便显示、查询或打印,可以使用普通索引、候选索引或主索引。
2、如果要在字段中控制重复值的输入并对记录排序,则对数据表可以使用主索引或候选索引,对自由表可以使用候选索引。
3、如果准备设置关系,则可以依据表在关系中所起的作用来分别使用普通索引、主索引或候选索引。
4.2.1 建立索引
1、单索引文件的建立格式,INDEX ON <索引关键表达式 > TO <索引文件名 >
[UNIQUE] FOR <条件 >[ADDITIVE]
功能,对当前表中满足条件的记录,按 <索引表达式 >的值建立一个索引文件,并打开此索引文件,其缺省的文件扩展名为,IDX。
参数描述:
<索引关键表达式 >,用以指定记录重新排序的字段或表达式。
2009-7-26 Visual FoxPro 6.0程序设计 7
<索引关键表达式 >可以是字段名,也可以是含有当前表中字段的合法表达式。表达式值的数据类型可以是字符型、数值型、日期型、逻辑型。若在表达式中包含有几种类型的字段名,常常需要使用类型转换函数将其转换为相同类型的数据。
[UNIQUE],指定 UNIPUE子句时,若有多条记录的 <索引关键表达式 >的值相同时,则只把第一次遇到的记录进行排序加入到索引文件中;省略该子句时,则把所有遇到的记录值都加入到索引文件中。
[ADDITIVE],若省略 ADDITIVE子句,当为一个表建立新的索引文件时,除结构复合索引文件外,所有其它打开的索引文件都将会被关闭;若选择此选择项,则已打开的索引文件仍然保持打开状态。
FOR <条件 >,指定一个条件,只显示和访问满足这个条件的表达式 <条件 >的记录,索引文件只为那些满足条件的表达式的记录创建索引关键字。
2009-7-26 Visual FoxPro 6.0程序设计 8
分类与索引的区别
1、分类要生成一个新的表文件,记录的物理顺序发生了改变;
2、分类生成的表可以单独使用。
3、索引它并不生成新的表文件,仅仅是表中记录的逻辑顺序发生了变化,但索引也要生成一个新的文件,即索引文件。
4、索引文件不能单独使用,它必须同表一起配合使用。
单索引文件总是按升序的顺序排列。对于一个表文件,允许建立多个索引文件。
USE STUDENT
INDEX ON 学号 TO XHSY
LIST
当执行上述命令后屏幕显示结果按学号排序
2009-7-26 Visual FoxPro 6.0程序设计 9
2、复合索引文件的建立复合索引文件是由索引标记组成的,每个复合索引文件可包含多个索引标记,每个索引标记都有标记名,一个索引标记相当于一个单索引文件。
格式,INDEX ON <索引关键表达式 > TAG <标记名 > [OF <复合索引文件名 >][FOR <条件 >] [ASCENDING |
DESCENDING] [UNIQUE] [ADDITIVE]
功能,建立和修改复合索引文件,并打开此索引文件,其缺省的文件扩展名为,CDX。
参数描述:
<索引关键表达式 >,[FOR <条件 >],[ADDITIVE],与上相同。
TAG <标记名 > [OF <复合索引文件名 >],创建一个复合索引文件。
在 TAG <标记名 >参数中不包含可选的 [OF <复合索引文件名 >]子句时,便可以创建结构复合索引文件。
2009-7-26 Visual FoxPro 6.0程序设计 10
如果在 TAG <标记名 >参数后包含可选项 [OF <复合索引文件名 >]
子句,则可以创建非结构复合索引文件。
[ASCENDING | DESCENDING],ASCENDING 指定复合索引文件为升序,这是默认值。 DESCENDING 指定复合索引文件为降序。
[UNIQUE],对于一个索引关键值,只有第一个满足该值的记录包含在,IDX文件或,CDX标识中。利用 UNIQUE子句可以避免显示或访问记录的重复值。
说明:
⑴执行上述命令时,系统先检查指定的复合索引文件是否存在,
若存在,在此文件中增加一个索引标记,若不存在,则建立此索引文件。
⑵标记名的命名规则与变量名的命名规则相同。
⑶单索引文件只能按升序排列,而复合索引文件既可以按升序排列也可以按降序排列,选择 DESCENDING为降序,选择
ASCENDING为升序,缺省时约定为升序。
2009-7-26 Visual FoxPro 6.0程序设计 11
⑷ 表的显示和访问顺序只由一个索引文件(主控索引文件)和标识(主控标识)控制。有一些命令使用主控索引文件和标识搜索记录,但是在修改表时,所有已打开的索引文件都将被更新。
3、在项目管理器中建立索引
( 1)利用表设计器的字段选项卡建立索引文件第一步:选择
【 数据 】 选项卡第二步:选择要建立索引的表第三步:单击
【 修改 】 按钮系统打开表设计器
2009-7-26 Visual FoxPro 6.0程序设计 12
第四步:选择要建立索引的关键字段第五步:在
“索引”下拉列表框中选择
“无”、“升序”、“降序”,建立索引第六步:单击 【 确定 】 按钮索引选项卡
2009-7-26 Visual FoxPro 6.0程序设计 13
( 2)利用表设计器的索引选项卡建立索引文件索引选项卡移动按钮排序按钮 在此框中输入索引标记在此列表框中选择索引类型在此文本框中输入索引表达式在此输入条件表达式表达式生成按钮返 回
2009-7-26 Visual FoxPro 6.0程序设计 14
4.2.2 使用索引
1、打开索引文件
( 1)在打开表时打开索引文件复合索引文件在打开表时将自动被打开。
格式,USE <表文件名 > INDEX <索引文件名表 > [ORDER <数值表达式 >/ <单索引文件名 >/[TAG] <索引标记名 > [OF <复合索引文件名 >]] [ASCENDING/ DESCENDING]
功能,打开指定的表,并且打开由 <索引文件名表 >指定的所有索引文件。
说明,虽然可以同时打开多个索引文件,但同一时间只能有一个单索引文件或是复合索引文件中的一个索引标识作为主控索引,
记录的操作和显示由主控索引来控制。如果 <索引文件名表 >中排在第一位的是单索引文件,则该单索引就是主控索引,如果排在第一位的是复合索引文件,则还需要用 ORDER子句规定主控索引,如果不使用 ORDER子句,记录将仍然按记录号的顺序显
2009-7-26 Visual FoxPro 6.0程序设计 15
示。
2)在 ORDER子句中也可以使用单索引文件名、索引标记或数值表达式来规定主控索引。如:使用 ORDER <单索引文件名 > 则规定一个单索引文件作为主控索引。
3)使用 ORDER [TAG] <索引标记 > [OF <复合索引文件名 >]规定一个子索引文件作为主控索引,ORDER子句中的索引可以是结构复合索引文件中的索引标记,也可以是已经打开的非结构复合索引文件中的索引标记。
4)使用 ORDER <数值表达式 >规定主控索引,以 <数值表达式 >
的值作为索引文件的序号,根据序号来确定主控索引文件。系统给打开的单索引文件和复合索引文件的索引标记编号的方法是:
首先按照打开索引文件时的单索引文件名的排列顺序编号,再按照结构复合索引文件中索引标记建立的顺序编号,最后按照非结构复合索引文件中的索引标记建立的顺序编号。
2009-7-26 Visual FoxPro 6.0程序设计 16
(2) 在打开表后打开索引文件格式,SET INDEX TO [<索引文件名表 >/? ] [ORDER <索引号 >/<复合索引文件名 >/[TAG] <索引标记 > [OF <复合索引文件名 >]] [ASCENDING/DESCENDING] [ADDITIVE]
功能,打开指定的索引文件或关闭索引文件 。 省略所有选项为关闭当前工作区中除结构复合索引文件外的所有索引文件 。
参数描述:
<索引文件名表 >,指定要打开的一个或多个索引文件 。 索引文件列表中可以包含多个单索引和复合索引文件 。 索引文件列表中,第一个索引文件成为主控索引,它控制记录的显示和访问 。
?,显示打开对话框,从这个对话框中,可以选择和打开一个单索引文件 。
[ORDER <数值表达式 >],指定一个索引文件或标识为主控索引文件,数值表达式指定在索引文件列表中出现的索引文件 。
2009-7-26 Visual FoxPro 6.0程序设计 17
首先,按索引文件列表中出现的顺序给单索引文件编号;然后,
按照创建标识的先后顺序,对复合索引文件中的标识编号;最后,按照创建文件的顺序对独立的复合索引文件中的标识进行编号。如果数值表达式为 0,表中记录以物理顺序显示和访问,
而索引文件保持打开状态。
[ORDER <单索引文件名 >],指定一个单索引文件为主控索引。
[ORDER [TAG] <索引标记名 > [OF <复合索引文件名 >]],指定复合索引文件中的一个标识作为主控标识。标识名来自结构化复合索引文件或独立的复合索引文件。在打开的独立复合索引文件中,如果存在相同名称的标识,则要使用 [OF <复合索引文件名 >]指定标识所在的复合索引文件。
[ASCENDING/ DESCENDING],指定显示和访问表记录时,
是以升序还是以降序进行。 [ASCENDING/ DESCENDING]子句要跟在 ORDER子句的后面。
[ADDITIVE],指定以前打开的索引文件(除结构化复合索引文件外),在发出 SET INDEX命令打开另一个索引文件时,是否仍打开。如果没有该子句,将会关闭所有前面打开的文件。
2009-7-26 Visual FoxPro 6.0程序设计 18
说明:
在有索引文件的表中,记录的显示顺序和访问顺序可以由某个索引文件来决定。使用 SET INDEX命令可以打开单索引文件和复合索引文件。如果一个表有结构化复合索引文件,打开表时该文件自动打开。
执行不带参数的 SET INDEX TO 命令,会关闭当前工作区中所有打开的索引文件(结构化复合索引文件除外)。
2、设置主控索引如果在打开索引文件时未指定主控索引,打开索引文件之后需要指定主控索引,或者希望改变主控索引,可使用下面的命令。
格式,SET ORDER TO [<数值表达式 >/<单索引文件名
>/[TAG] <索引标记 > [OF <复合索引文件名 >]
[ASCENDING/DESCEN-DING]
功能,在打开的索引文件中指定主控索引。
参数描述:
2009-7-26 Visual FoxPro 6.0程序设计 19
<数值表达式 >,指定主控索引或标识的编号。数值表达式指定的是在 USE或 SET INDEX中列出的索引文件或标识的序号。
<单索引文件名 >,指定作为主控索引文件的单索引文件名。
[TAG] <索引标记 > [OF <复合索引文件名 >],指定复合索引文件中的一个索引标识为主控索引标识名来自结构复合索引文件或任何打开的独立复合索引文件。如果在各打开的独立复合索引文件中存在相同的标识名,应使用 [OF <复合索引文件名 >]来指定包含此标记的复合索引文件。
[ASCENDING/DESCENDING],该参数用法同前。
说明:
⑴如果命令中不使用任选项,只写 SET ORDER TO,那么不会指定主索引,记录仍按照记录号的顺序显示,但并未关闭索引文件。
⑵ VFP允许在 SET ORDER命令中使用 ASCENDING和
DESCENDING暂时转换主控索引的顺序,但它不同于 SORT ON
命令中的 ASCENDING和 DESCENDING。
2009-7-26 Visual FoxPro 6.0程序设计 20
⑶ 当数值表达式的值为 0时,或省略所有可选项,则恢复表文件的自然顺序,但不关闭索引文件。
⑷在打开的索引文件中,只有主控索引文件是有效。
3、索引文件的重建或更新当表中的记录当生变化时,如果未打开索引文件,索引文件 (结构复合索引文件除外 )不会自动更新,要更新这些索引文件,可用下列命令:
格式,REINDEX
功能,重建当前打开的所有索引文件。
说明:
使用 REINDEX命令之前,必须首先打开需要重建索引的全部索引文件。对使用包含 UNIQUE关键字的 INDEX命令或 SET
UNIQUE ON命令创建的索引文件,在重建索引时,仍保持
UNIQUE状态。
返 回
2009-7-26 Visual FoxPro 6.0程序设计 21
4.3 数据的查询
4.3.1 直接查询命令返 回 退 出
4.3.2 快速查询命令
4.3.3 对话查询
2009-7-26 Visual FoxPro 6.0程序设计 22
4.3.1 直接查询命令直接查询也叫顺序查询,是按照记录的物理顺序逐个比较,逐个查询。
1,LOCATE命令格式,LOCATE [<范围 >] [FOR <条件 >] [WHILE <条件 >]
功能,按顺序搜索表,从而找到满足指定逻辑表达式的第一个记录。
参数描述:
[<范围 >],指定要定位的记录范围。只有在范围内的记录才被定位。 LOCATE命令的默认范围是 ALL。
[FOR <条件 >],LOCATE命令按顺序搜索当前表以找到满足逻辑表达式的第一个记录。若逻辑表达式是可优化的表达式,则
Rushmore优化由 LOCATE FOR 创建的查询。为了获得最佳执行效果,可在 FOR子句中使用可优化的表达式。
2009-7-26 Visual FoxPro 6.0程序设计 23
[WHILE <条件 >],指定一个条件,只要逻辑表达式计算值为真,就继续查找记录。
说明:
(1)被搜索的表不必有索引。
(2)若 LOCATE发现一个满足条件的记录,就将记录指针定位在该记录上。可以使用 RECNO()返回该记录的记录号,同时
FOUND()函数返回“真”,EOF()函数返回“假”。如果没有找到,则将记录指针指向范围的最后一个记录,同时将
FOUND()函数值置为“假”,屏幕上显示“已到定位范围末尾”。
(3)如果执行 SET EXCAT OFF命令后,再用 LOCATE命令查找字符型数据时,不要求字符型数据精确匹配。
(4)该命令只能查找第一条满足条件的记录。
若表中有多条满足条件的记录,当已经找到一条满足条件的记录后,还想继续查找后面满足条件的记录时,可以使用
CONTINUE 命令继续向后查找满足条件的记录。
2009-7-26 Visual FoxPro 6.0程序设计 24
2,CONTINUE命令格式,CONTINUE
功能,它使 LOCATE命令从当前记录开始继续查找下一条满足条件的记录。
说明,CONTINUE是用在 LOCATE之后继续查找满足同一条件的记录的命令,它继续 LOCATE的操作。 CONTINUE命令移动记录指针到下一个与 <条件 >逻辑表达式相匹配的记录上。
CONTINUE命令能被重复执行直到记录指针到表的结尾或到指定范围的尾部。
如果 CONTINUE命令成功地查找到了一条记录,RECNO()函数将返回该记录的记录号,并且 FOUND()函数返回逻辑“真”
值和 EOF()返回逻辑“假”值。
如果 CONTINUE命令没有查找到满足条件的记录,RECNO()
函数返回在 table plus one中的记录数,FOUND()函数返回逻辑
“假”值,并且 EOF()函数返回逻辑“真”值。
返 回
2009-7-26 Visual FoxPro 6.0程序设计 25
4.3.2 快速查询命令用 LOCATE命令查询的优点是不论表中的记录是否有序都能进行查找,而其主要的缺点是查找速度慢。当表中的记录较多,
并且要查询的记录又在表的底部时,问题尤为突出。为了解决这一问题,VFP提供了二条快速查询命令,FIND和 SEEK。
1,FIND命令:
格式,FIND <字符型常量 >/<数值型常量 >
功能,它在已经建立索引并且表文件和索引文件均已打开的表中查找索引关键值与指定的字符串或数值型常量相匹配的第一条记录。如果找到,则把记录指针指向该记录,并且将
FOUND()函数的值置为“真”;如果没有找到与其相符的记录,
则将记录指针指向表的末尾,且将 FOUND()函数的值置为
“假”,将 EOF()函数的值置为“真”。
说明:
⑴ FIND命令是在索引文件中查询,找到后根据记录号从表文
2009-7-26 Visual FoxPro 6.0程序设计 26
件中读出相应的记录。因为一个表在同一时刻只能有一个索引文件或一个索引标记为主控索引,因此,利用 FIND命令来查找记录时,只能查找主控索引字段的值。
⑵ 查询的值可以是字符串,也可以是数值 。 通常字符串可以不用定界符括起来,但是当字符是以空格开始时,则必须用定界符括起来;如果要查找的字符串是以定界符开头时,就必须用不同的定界符将其括起来 。
⑶ 查询的值如果是字符串,它可以是索引关键表达式值的全部或前几个字符,但不能是中间的或是后面的字符 。
⑷ 查找字符串时,只要索引表达式 ( 建立索引文件时使用的索引表达式 ) 是字符型的,就可以使用 FIND命令查找,并要求组成索引表达式的字段必须是字符型的 。
⑸ 执行 SET EXACT命令后,再用 FIND命令查找字符串时,字符串可以是索引表达式值的全部或是从首字符开始的一个子串 。
如果执行了 SET EXACT ON命令后再用 FIND命令来查找字符串,则字符串只能和索引表达式的值精确匹配,即只能是
2009-7-26 Visual FoxPro 6.0程序设计 27
索引表达式的值的全部。
⑹ 建立索引文件时,索引表达式可以是多个字段组成的表达式,
若字段之间用,+”连接,用 FIND命令查询时,查询内容应当是包含空格符在内的索引表达式值的全部或是从首字符开始的一个子串,究竞是用哪一种,这取决于 SET EXACT命令的设置;
若字段之间用,-”号连接,用 FIND查找时,查询内容应当不包含空格符在内的索引表达式值的全部或是从首字符开始的一个子串 。
⑺ FIND命令只能使记录指针定位于第一条符合条件的记录,而
CONTINUE命令又不能和 FIND命令一起配合使用,当符合条件的记录不止一条时,可用 FIND先查到满足条件的第一条记录,
因为记录是根据索引关键表达式排序了的,因此符合条件的记录是在一起的,因此可用 SKIP命令配合 DISP命令查找,直到发现某条记录不满足条件时为止,此记录以后的记录肯定不符合条件。
2009-7-26 Visual FoxPro 6.0程序设计 28
2,SEEK命令:
格式,SEEK <表达式 > [ORDER <索引号 >/<单索引文件名 >/
[TAG] <索引标记 > [OF <复合索引文件名 >] [ASCENDING/
DESCENDING]]
功能,在打开的索引文件中快速查找与 <表达式 >相匹配的第 1
条记录。
参数描述:
<表达式 >,指定 SEEK搜索的关键字。 <表达式 >可以是空字符串。
ORDER <索引号 >/<单索引文件名 >/[TAG] <索引标记 > [OF <复合索引文件名 >] [ASCENDING/DESCENDING],指定 <表达式
>是以哪一个索引或索引标记为主控索引。其使用方法同设置主控索引。
说明:
当省略所有的可选项时,SEEK命令与 FIND命令的功能基本
2009-7-26 Visual FoxPro 6.0程序设计 29
相同,但 SEEK命令的功能更强,SEEK命令不仅可以查找字符串和常数,它还可以查找字符型、数值型、日期型或逻辑型表达式的值。用 SEEK命令查找字符串常量时,字符串常量必须放在定界符中。
SEEK命令中的表达式必须和索引表达式的类型相同 。
3、顺序查询和快速查询比较
L O CAT E F I N D SEEK
查询内容可以是字符型、数值型、日期型、逻辑型表达式,还可以查找备注型字段可以是字符型、数值型、日期型表达式或逻辑型字段字符串常量或常数对表的要求无论是否建立了索引文件均可方便地查询必须建立并打开索引文件,只能在主控索引文件中查询同左命令特点可使用 < 范围 > 子句限定查询范围,可与 CON T I N U E 命令配合使用,找出表中全部符合条件的记录在整个表中查询,只能找出满足条件的第一条记录同左查询速度 慢 快 快返 回
2009-7-26 Visual FoxPro 6.0程序设计 30
4.3.3 对话查询格式,GETEXPR [<字符表达式 1>] TO <内存变量名 > [TYPE <
字符表达式 2>[;<字符型错误信息文本 >]] [DEFAULT <字符表达式 3>]
功能,通过命令 GETEXPR启动表达式生成器对话框,从中可以创建表达式,并把表达式存入内存变量或数组元素中,然后通过 LOCATE命令宏代换进行查询,此命令常用于程序中。
参数描述:
[<字符表达式 1>],指定在“表达式生成器”中显示的标题,该标题可提示生成何种类型的表达式。
TO <内存变量名 >,指定存储表达式的内存变量或数组元素。
如果此内存变量不存在,VFP将创建该变量。该命令不创建数组元素。如果按 Esc键或选择 【 取消 】 按钮退出“表达式生成器”,将在内存变量或数组元素中存储空字符串。如果已经用
DEFAULT子句创建了某个默认的表达式,在按 Esc键或选择
2009-7-26 Visual FoxPro 6.0程序设计 31
【 取消 】 按钮退出“表达式生成器”时,将把这个默认表达式存储在内存变量中。
[TYPE <字符表达式 2>[;<字符型错误信息文本 >]],<字符表达式 2>指定表达式类型,C-字符型,N-数值型,D-日期型,L-逻辑型,T-日期时间型,F-浮点型,I-整型,B-双精度型,Y-
Currency(货币型)。
<字符型错误信息文本 >,定义错误提示信息文本,如果 <字符表达式 2>是非法的,可以用 <字符型错误信息文本 >指定要显示的错误信息,<字符表达式 2>和 <字符型错误信息文本 >必须用分号分隔。 <字符表达式 2>、分号,<字符型错误信息文本 >的结合体必须用一对单引号或双引号定界起来。
[DEFAULT <字符表达式 3>],指定在“表达式生成器”中显示初始的默认表达式。 GETEXPR命令可以按受这个默认的表达式,该默认表达式也可用 <字符表达式 3>指定的表达式改写。
如果调用 GETEXPR命令而没有输入表达式,则该默认的表达式将作为输入的表达式存储到内存变量中。
2009-7-26 Visual FoxPro 6.0程序设计 32
例:通过 GETEXPR获取 LOCATE命令中查询条件,以实现任意条件的查询。
GETEXPR "输入查询条件 " TO CXTJ TYPE "L;输入条件错误 " DEFAULT "性别 =’男’ "
启动表达式生成器 指定表达式框中的表达式为逻辑型,且当表达式不为逻辑型时提示“输入条件错误”。
指定保存表达式的内存变量返 回
2009-7-26 Visual FoxPro 6.0程序设计 33
4.4 数据的统计
4.4.1 求记录个数的命令返 回 退 出
4.4.2 求和命令
4.4.3 求平均值命令
2009-7-26 Visual FoxPro 6.0程序设计 34
4.4.1 求记录个数的命令格式,COUNT [<范围 >] [FOR <条件 >] [WHILE <条件 >] [TO
<内存变量 >]
功能,统计当前表中指定范围内满足条件的记录个数,并存于 <
内存变量 >中。
参数描述:
<范围 >,<条件 >子句的用法和前面所有命令的用法是一样的。
若使用 <范围 >,<条件 >子句,可统计出指定 <范围 >内满足 <条件
>的记录个数,否则统计表中的记录的总数。对 COUNT命令,
默认的范围是 ALL。
若使用任选项 TO <内存变量 >可选项,可将统计的结果送到内存变量中保存,否则将统计结果显示在屏幕上 (SET TALK ON)。
例,USE STUDENT
SET EXACT OFF
COUNT FOR 姓名 ="李 ".OR.姓名 ="王 " TO RS
返 回
2009-7-26 Visual FoxPro 6.0程序设计 35
4.4.2 求和命令格式,SUM [<数值型表达式表 >] [<范围 >] [FOR <条件 >]
[WHILE <条件 >] TO <内存变量名表 >/TO ARRAY <数组名 >
功能,对当前表中指定范围内满足条件的数值型字段或是由字段组成的数值型表达式累加求和,并把结果存放在对应的 <内存变量名表 >标识的变量中。
若使用任选项 <数值型表达式表 >,则只对 <数值型表达式表 >中的各表达式累加求和,否则将对当前表中的所有数值型字段累加求和,数值型字段之间或表达式之间用逗号分隔开 。
若使用 TO <内存变量名表 >,可将求出的各表达式的值依次赋给各内存变量,但要注意:表达式表中的表达式的个数应该与内存变量表中的变量个数相等,若省略 <数值型表达式表 >,内存变量的个数应该与数值型字段的个数相等 。 也可将求出的各表达式的值存放于指定的数组中,一个数组元素等同于一个内存变量 。
返 回
2009-7-26 Visual FoxPro 6.0程序设计 36
4.4.3 求平均值命令格式,AVERAGE [<数值型表达式表 >] [<范围 >] [FOR <逻辑表达式 1>] [WHILE <逻辑表达式 2>] [TO <内存变量列表 >| TO
ARRAY <数组名 >]
功能,对当前表中指定范围内满足条件的记录的数值型字段求算术平均值,并把结果存入 <内存变量名表 >中或存入 <数组名
>指定的数组中。
说明,AVERAGE和 SUM命令的不同之处仅仅在于前者是求数值型字段或数值型表达式的平均值,而后者是求和 。
若省略 <范围 >,约定为 ALL,若省略 <数值型表达式表 >,约定为当前表中的所有的数值型和浮点型字段。若省略 <内存变量名表 >和 <数组名 >,则不保留结果,若系统设置为 SET TALK
ON则只显示,否则不显示。
返 回
2009-7-26 Visual FoxPro 6.0程序设计 37
4.5 多工作区操作
4.5.1 工作区与多个表返 回 退 出
4.5.2 表的关联
4.5.3 表的连接
2009-7-26 Visual FoxPro 6.0程序设计 38
4.5.1 工作区与多个表
1、工作区号与别名
VFP6提供了多达 32767个工作区,每个工作区都有一个工作区号,分别用 1~ 32767表示,其工作区 1~ 10还分别对应有别名 A~ J。系统规定,用工作区号作为各个工作区的标识符,即数字 1-32767;同时还规定,可以用工作区的别名作为工作区的标识符,A-J这 10个字母是工作区的标识符,因此,单个字母 A-J是不能用来作为表的文件名的,它是系统的保留字。
每个打开的表也都有一个别名,当用命令 USE <表文件名 >
打开表时,系统默认的表的别名就是该表的主文件名。如果在打开表时,在 USE命令后面使用了 ALIAS参数指定了表的别名,
则可为表另外起一个别名,这时的表文件名就不再是表的别名。
打开表亲为表指定一个别名命令,USE <表文件名 > [ALIAS <别名 >] [IN <工作区号 /工作区别名 /表别名 >] [AGAIN]
2009-7-26 Visual FoxPro 6.0程序设计 39
功能,在指定的工作区打开指定的表文件,并为该表文件起一个别名。若省略可选项时,系统将取表的主文件名作为该表文件的别名,并且是在当前工作区中打开表文件。
参数描述:
[IN <工作区号 >/<工作区别名 >/<表别名 >],指定要选择的工作区。
其中:工件区号、工作区别名都是直接指定的工作区,但 <表别名 >不是直接指定的工作区,而是通过在已打开表文件,且别名为 <表别名 >的工作区中先将该表文件关闭,然后再打开指定的表文件。如果省略该选择项,则为当前工作区。
[ALIAS <别名 >],为要打开的表指定一个别名。
[AGAIN],若要在多个工作区中打开一个表,可以按以下方法操作:
( 1)选择另一个工作区,并执行带有表名和 AGAIN子句的 USE
命令。
( 2)执行带有表名和 AGAIN子句的 USE命令,并且用 IN子句指定一个不同的工作区。
2009-7-26 Visual FoxPro 6.0程序设计 40
2、工作区的选择与多表文件的打开与关闭若想改变当前工作区,则可使用 SELECT命令来转换当前工作区。
格式,SELECT <工作区号 >/<别名 >/0
功能,选择一个工作区作为当前工作区。
说明,选择一个工作区作为当前工作区,使该工作区打开的表成为当前表,要选择的工作区,可使用工作区号作为标识符,
也可以用工作区的别名来作为工作区的标识符。若选择 0,则系统自动选取当前未使用的最小工作区号作为当前的工作区。
例如,输入下列命令:
SELECT 3
USE STUDENT ALIAS XS
SELECT 1
USE SCORE
USE SCORE ALIAS CJ IN XS AGAIN
2009-7-26 Visual FoxPro 6.0程序设计 41
使用 CLOSE命令关闭打开的表文件格式 1,CLOSE DATABASE
功能,关闭当前打开的数据库和所有打开的表文件,并使 1号工作区成为当前工作区。
格式 2,CLOSE TABLE
功能,关闭当前打开的所有表,不改变当前工作区。
格式 3,CLOSE ALL
功能,关闭所在所有工作区中打开了的表、表和单索引文件并且选择 1号工作区为当前工作区。 CLOSE ALL同时也关闭任何用
FCREATE()(该函数用于创建并且打开一个低级文件 )和 FOPEN()
打开的低级文件函数。但 CLOSE ALL不关闭用 SET PRINT命令打开的文件。
2009-7-26 Visual FoxPro 6.0程序设计 42
使用 USE命令关闭打开的表文件格式,USE IN <工作区号 >/<别名 >
功能,关闭指定工作区中的表文件。
其中,别名可以是工作区的别名,也可以是表的别名。
在单工作区操作时,用户只能操作当前工作区中的表,而在多工作区操作时,用户除了可以操作当前工作区中的记录外,还可以操作其它工作区中的表,实现多个表文件之间的数据处理。
在当前工作区调用其它工作区的数据时,非当前工作区中的表文件的字段名前要加上该表文件的 <别名 >和,->”符号,或者是
<别名 >和符号”,”。格式如下。
<别名 > -><字段名 > 或 <别名 >.<字段名 >
SELECT 2
USE SCORE ALIAS CJ
SELECT 1
USE STUDENT
DISPLAY 学号,姓名,班级,CJ.高等数学,CJ.普通物理返 回
2009-7-26 Visual FoxPro 6.0程序设计 43
4.5.2 表的关联如果在多个工作区同时打开多个表文件,在当前工作区中移动表的记录指针时,其它表的记录指针是不会随之移动 。如果要想其它表的记录指针也随之移动,则要建立表间的关联。
关联就在二个或二个以上的表之间建立某种联接,使其表的记录指针同步移动。用来建立关联的表称为父表,被关联的表称为子表。
1、建立关联格式,SET RELATION TO [<关联表达式 1>] INTO <工作区 >/<
别名 > [,<关联表达式 2> INTO <工作区 >/<别名 >…]] [IN < 工作区
>/<别名 >][ADDITIVE]
功能,在两个表之间建立关联。
参数描述:
<关联表达式 1>,指定用来在子表和父表之间建立关联的关联表达式。关联表达式经常是子表主控索引的索引表达式。
2009-7-26 Visual FoxPro 6.0程序设计 44
<关联表达式 >可以是下列三种参数之一:
1,<关联表达式 >是记录号函数 RECNO()。此时,两个或多个关联表之间的联系是根据记录号来进行关联的,关联表与被关联表之间当前记录号保持相等。如果关联表记录的记录号大于被关联表的记录总数,则被关联表的当前记录指针指向最后一条记录的下一条记录,EOF()函数值为,T.。
SELECT 2
USE SCORE ALIAS CJ
SELECT 1
USE STUDENT
SET RELATION TO RECNO() INTO CJ
2,<关联表达式 >是数值型表达式。此时,在表达式中通常含有
RECNO()函数,每当关联表的记录指针重新定位时,被关联表的记录指针将重新定位于 <关联表达式 >的值所对应的记录之上。如果 <关联表达式 >的值大于被关联表文件的记录总数,则被关联表
2009-7-26 Visual FoxPro 6.0程序设计 45
文件的当前记录指针指向最后一条记录的下一条记录,EOF()函数值为,T.。
SELECT 2
USE SCORE ALIAS CJ
SELECT 1
USE STUDENT
SET RELATION TO 3*RECNO()-2 INTO CJ
3,<关联表达式 >选择二个表的公共字段建立关联,使用这种方法时,要求被关联的表文件必须是按指定的公共关联字段建立并打开了索引文件。
SELECT 2
USE SCORE ALIAS CJ
INDEX ON 学号 TO XHSY
SELECT 1
USE STUDENT
SET RELATION TO 学号 INTO CJ
2009-7-26 Visual FoxPro 6.0程序设计 46
INTO <工作区 >/<别名 >,指定被关联表的工作区或别名,也可以是被关联表的别名。
ADDITIVE,建立关联时,如果命令中不使用 ADDITIVE子句,
则父表以前建立的关联将自动解除;若使用了 ADDITIVE子句,
则父表以前建立的关联仍然保留。
说明,在建立关联之前,必须打开一个表(父表),而且还必须在另一个工作区内打开其它表(子表)。相关的各表通常有一个相同的字段。父表可以同时与多个子表建立关系,称为“一父多子”的关系。 <关联表达式 >可以是字符型、数值型、日期型表达式。如果建立父子关联之前,子表已经按照关联条件建立了索引,并将该索引文件指定为主控索引,那么,每当当前工作区父表的记录指针重新定位时,就检索子表,将子表的记录指针定位于 <关联表达式 >值与 <索引表达式 >值相同的第一条记录之上。
除了可以在一个工作区中与多个表建立关联以外,还允许在多个工作区中建立多个表之间的关联,但关联不能构成循环。
2009-7-26 Visual FoxPro 6.0程序设计 47
这样建立的关联,只能显示一对一的关系,当要父表中的一条记录同时对应子表中的多条记录时,还要先用到 SET SKIP TO
命令格式,SET SKIP TO <工作区号 >/<别名 > [,<工作区号 >/<别名 >…]
功能,在父表的每条记录与子表中所有对应记录之间建立“一对多”的关联。
说明,如果已经建立了一父多子的关联,并且父表与每个子表都要建立“一对多”的关联,那么只要在 SET SKIP TO命令中分别写出子表所在的 <工作区号 >或者 <别名 >即可。
2、解除关联用 SET RELATION命令建立关联之后,当移动关联表的记录指针时,被关联表的记录指针也相应要移动,并且将要引起读 /写磁盘操作,这样会降低系统的性能,因此,当某些关联不再使用,
或暂时不再使用时,应及时解除关联,以提高系统的运行速度。
2009-7-26 Visual FoxPro 6.0程序设计 48
格式 1,SET RELATION TO
功能,删除当前工作区表与其它工作区表建立的关联。
格式 2,SET RELSTION OFF INTO <工作区号 >/<别名 >
功能,删除当前工作区与由 <工作区号 >/<别名 >指定的工作区中表建立的关联。该命令必须在父表所在的工作区执行。例如:
要关闭当前工作区与 C工作区建立的关联。可以作下述命令进行:
SET RELATION OFF INTO C
当用 USE关闭某些表时,系统将自动删除掉与它建立的关联。
如果关闭的是父表文件,则它与子表的关联将全被删除。
当关闭父表时,将自动关闭与父表建立的所有关联。
返 回
2009-7-26 Visual FoxPro 6.0程序设计 49
4.5.3 表的连接表的连接是正好与 COPY命令相反的过程格式,JOIN WITH <别名 >/<工作区 > TO <表文件名 > FOR <条件 > [FIELDS <字段名表 >]
功能,连接当前工作区中打开的表和 <工作区 >/<别名 >指定的表,
生成 <表文件名 >规定的新的表文件。
参数描述:
<别名 >/<工作区 >,指定第二个表的别名或所在的工作号。
FOR <条件 >,指定一个筛选条件。若 <条件 >的值为真,则向新表中写入一个新记录。
[FIELDS <字段名表 >],指定新表中包含的字段的列表。两个表中指定的字段都可以包含在 <字段名表 >中。
说明:
JOIN命令也可以连接两个以上的表,这时可先连接其中的两个,
生成一个新的表文件后再利用 JOIN命令连接另外的表。
返 回
2009-7-26 Visual FoxPro 6.0程序设计 50
小 结
1、分类将要生成一个新的表文件,可以使用 SORT命令。
2、索引不生成新的表,但产生索引文件。索引可分为单索引和复合索引,复合索引又可分为结构复合索引和非结构复合索引,提供了主索引、候选索引、唯一索引和普通索引四种。
3、建立索引可以使用 INDEX命令。
4、数据查询可分为直接查询和快速查询,直接查询使用 LOCATE命令,快速查询可以使用 FIND和 SEEK命令,在程序中对于不定的查询要使用 GETEXPR命令。
5、数据统计这里介绍了求记录数 COUNT、求和 SUM、求平均值
AVERAGE命令。
6、在 USE命令中可以用 IN了句指定工作区,用 ALIAS子句指定别名。
7、可以使用 SELECT命令选择一个工作区。
8、可以在多表间使用 SET RELATION命令建立关联,且使用 SET
SKIP 命令建立一对多关联。
9、可以使用 JOIN命令建立表间连接。 返 回