Download presentation
Presentation is loading. Please wait.
Published by公眇 伍 Modified 7年之前
1
主 要 内 容 第一章 数据库系统基础知识 第二章 Visual Foxpro 操作基础 第三章 Visual Foxpro 的数据及其运算
第四章 表的基本操作 第五章 数据库的基本操作 第九章 结构化程序设计 第十章 面向对象程序设计基础 2017/9/9 22:57:30 1
2
第六讲 表的基本操作 目的要求:掌握表结构的设计、表和表结构的建立以及表记录的录入 教学重点:表结构的设计与表的建立 教学难点:表结构的设计
第六讲 表的基本操作 目的要求:掌握表结构的设计、表和表结构的建立以及表记录的录入 教学重点:表结构的设计与表的建立 教学难点:表结构的设计 教学课时:2课时 教学方法:讲授法,演示法. 教学内容与步骤: 2017/9/9 22:57:30 2
3
第四章 表的基本操作 4.1 表的建立 4.2 表的显示与维护 4.3 表的排序与索引 4.4 表的统计与计算 4.5 多个表的操作
第四章 表的基本操作 4.1 表的建立 4.2 表的显示与维护 4.3 表的排序与索引 4.4 表的统计与计算 4.5 多个表的操作 2017/9/9 22:57:30 3
4
4.1 表的建立 4.1.1 设计表的结构 数据表结构的定义: (1)文件名:表文件的主要标识 (2)结构:字段名、字段类型、字段宽度
设计表的结构 数据表结构的定义: (1)文件名:表文件的主要标识 (2)结构:字段名、字段类型、字段宽度 (3)记录:表文件的基本数据 设计数据库文件结构就是确定库文件中每个字段的字段名、类型、字段宽度及小数位。 2017/9/9 22:57:30 4
5
1.字段名 字段名是表中每个字段的名字,它必须以汉字、字母或下划线开头,由汉字、字母、数字或下划线组成。自由表中的字段名最多为10个字符,数据库表中的字段名最多为128个字符。当数据库表转化为自由表时截去超长部分的字符。(姓名、XB、班级BJ、班级2、班级_2 、_XM) 例如: Birth_day 、学号、Num2 都是正确的字段名; 而Id*、2002student、Num-2 都是非法的字段名; 2017/9/9 22:57:30 5
6
在Visual FoxPro中,字段主要分以下 7 种类型: 字符型(Character) 数值型(Numeric) 日期型(Date)
2.字段类型 字段类型即字段变量的类型,字段类型表示该字段中存放数据的类型,对应于二维表格中各个栏目填写内容的类型。在第三章中,已经介绍了Visual FoxPro的数据类型。在设计表的结构时,可根据需要确定表中各字段的类型。 在Visual FoxPro中,字段主要分以下 7 种类型: 字符型(Character) 数值型(Numeric) 日期型(Date) 逻辑型(Logical) 备注型(Memo) 通用型(General) 浮点型(Float) (少用) 分别用字母 C、N、D、L、M、G 和 F 来表示。 2017/9/9 22:57:30 6
7
3.字段宽度 字段宽度表明该字段存放数据所需的宽度,即该字段允许存放的最大字节数或数值位数。不同类型的字段具有不同的宽度。在建立表结构时,应根据所存数据的具体情况规定字符型、数值型、浮动型这3种字段的宽度,若有小数部分则小数点也占一位。 ①只有字符型、数值型、浮点型需要用户输入所需的字段宽度: 字符型字段的最大宽度是254; 数值型和浮点型的最大宽度是20。 ②其他类型的字段宽度由系统给定: 逻辑型字段宽度为1(字节) ; 整型、备注型字段和通用型字段宽度均为4; 货币型、日期型、日期时间型、双精度型字段宽度均为8。 注意: ①数值型浮点型字段的宽度应该包括小数点在内。 ②备注型和通用型字段的内容都没有直接存放在表文件中,而是存放在一个与表文件同名的备注文件(扩展名为.fpt)中。它们4个字节的宽度并不存放备注数据,而是存放有关内容在备注文件中的实际存储地址。 例如:123.45的宽度应该是6位而不是5位。 2017/9/9 22:57:30 7
8
4.小数位数 只有数值型和浮点型字段才有小数位,而且小数位数至少应比该字段的宽度值小2。若该字段数据的值为整数,则小数位数应该定义为0。双精度型字段允许输入小数,但不需事先定义小数位数,小数点将在输入数据时输入。 5.是否允许为空 表示是否允许字段接受空值(NULL)。空值是指无确定的值,它与空字符串、数值0等是不同的。例如,表示成绩的字段,空值表示没有确定成绩,0表示0分。一个字段是否允许为空值与字段的性质有关,例如作为关键字的字段是不允许为空值的。 2017/9/9 22:57:30 8
9
设计数据库文件结构就是确定库文件中每个字段的 字段名、类型、字段宽度及小数位。 例如:设计学生基本情况数据库,库结构如下所示
字段类型 字段宽度 小数位数 NULL 学号 字符型 8 否 姓名 是 性别 2 出生日期 日期型 高考成绩 数值型 5 1 简历 备注型 4 照片 通用型 2017/9/9 22:57:30 9
10
建立表的结构 1.菜单操作方式 在Visual FoxPro中,要建立文件可选择“文件”菜单项中的“新建”命令,系统提供一系列的窗口与对话框,用户只要根据屏幕的提示,就可完成有关操作。 (1)选择“文件”菜单项中的“新建”命令,将出现“新建”对话框。这个对话框让用户选择新建文件的类型。在实际操作中,可能要建立各种类型的文件,新建对话框中的文件类型框中列出了可供选择的文件类型。 2017/9/9 22:57:30 10
11
(2)在这里是建立表文件,所以需要选择“表”文件类型,然后可以选择“新建文件”或“向导”去建立新的文件。向导是一个交互式程序,由一系列对话框组成。利用向导可以引导用户完成一系列操作。“表向导”是众多Visual FoxPro向导中的一种,在有样表可供利用的条件下,可以使用表向导来定义表结构,但操作很烦琐。这里不介绍利用向导建立表,而是直接建立新表。从新建对话框中选择“新建文件”,此时首先出现“创建”对话框,在其中可以输入表名、选择保存表的位置,然后单击“保存”按钮,此时便出现表设计器窗口。在该窗口中,有字段、索引和表3个标签,利用字段标签可建立表结构。 2017/9/9 22:57:30 11
12
选择“文件”菜单中的“New” 项,或者点击工具栏中的“New” 按钮,会出现如右所示对话框: 选择要新建的表(Table),再
表结构的窗口。 2017/9/9 22:57:30 12
13
2017/9/9 22:57:30 13
14
(3)在表设计器窗口中,可输入表的字段参数: ①在“字段名”下面的文本编辑区输入字段的名字。
②按Tab键或单击“类型”,选择类型列,其中列出所有的Visual FoxPro字段类型,可以单击类型列右边的向下箭头或按空格键进行选择。 ③按Tab键或单击“宽度”进入宽度列,可直接键入所需的字段宽度或连续单击右侧的上下箭头,使数字变化到所需的大小。如果类型是数值型或浮动型,还需要设置小数点位数。 ④索引列可确定索引字段及索引方式。 ⑥NULL列设置字段可否接受NULL值。选中此项意味该字段可接受NULL值。 2017/9/9 22:57:30 14
15
(4)表字段设置完成后,选择“确定”按钮,结束表结构的建立。这时将弹出对话框,询问“现在输入数据记录吗
(4)表字段设置完成后,选择“确定”按钮,结束表结构的建立。这时将弹出对话框,询问“现在输入数据记录吗?”,选择“否”,则退出建表工作,以后需要时可以打开该表并输入数据。若选择“是”,则可以立即输入数据。 如果以后再输入数据,就选择“No”,则刚才建立的库文 件是一个只有结构没有数据的空库;如果要马上输入数据, 就选择“Yes”,进入如下的数据输入编辑窗口。 2017/9/9 22:57:30 15
16
(5)在表设计器窗口中,还有一些别的按钮,它们用来修改表结构。在字段名列左方有一列按钮,其中按钮上标有双向箭头的一行是当前字段行,将按钮上下拖动能改变字段的次序。要删除或插入一个字段,可选择相应命令按钮。若想放弃建立表的操作,则在对话框中选择“取消”按钮或双击控制菜单按钮。 2017/9/9 22:57:30 16
17
如果要存盘退出,则 双击控制菜单图标 或 按Ctrl+W 如果放弃操作,不存盘退出则 按Ctrl+Q 或 按Esc
数据输入完后: 如果要存盘退出,则 双击控制菜单图标 或 按Ctrl+W 如果放弃操作,不存盘退出则 按Ctrl+Q 或 按Esc 2017/9/9 22:57:30 17
18
以上介绍了利用菜单操作方式建立表结构的过程,还可以在命令窗口中使用CREATE命令来建立表的结构。其命令格式是:
2.命令操作方式 以上介绍了利用菜单操作方式建立表结构的过程,还可以在命令窗口中使用CREATE命令来建立表的结构。其命令格式是: CREATE [<表文件名>|?] 在命令中使用?或省略该参数时,打开“创建”对话框,提示输入表名并选择保存表的位置。CREATE命令执行后,屏幕上弹出表设计器窗口,以后的操作方法与菜单操作相同。 2017/9/9 22:57:30 18
19
命令格式: CREATE [盘符] [路径] <库文件名> 功能:以指定的库文件名建立一个数据库 说明:
① 如果命令后面指出 [盘符] [路径] <库文件名>, 如: CREATE C:\vfp98\xs1.DBF 扩展名可以省略,系统默认为 .DBF ② 若文件名与已有的文件同名,屏幕会出现如下图所示的提示窗口。 当我们按下“Yes”键表示覆盖原来的数据库,如果按下 “No”键,则取消操作。 2017/9/9 22:57:30 19
20
③ 直接键入该命令并回车,屏幕上会出现如下建立 表结构(即数据库文件结构)的窗口:
2017/9/9 22:57:30 20
21
在把刚建立好的表结构存盘以后,若要立即输入记录,此时,屏幕显示记录输入窗口,用户可通过它输入一个个记录。
向表输入记录 在把刚建立好的表结构存盘以后,若要立即输入记录,此时,屏幕显示记录输入窗口,用户可通过它输入一个个记录。 2017/9/9 22:57:30 21
22
1.记录输入窗口 在记录输入窗口的标题栏上给出了表的名称,窗口左上角有控制菜单按钮,通过它可关闭该窗口,窗口的右上角有最小化、最大化和关闭按钮,窗口的右边和下边各为纵向和横向滚动条。如果已经输了很多数据记录,可以使用纵向滚动条,使记录内容上、下移动。如果某个字段定义得很宽,它的输入内容被隐蔽在窗口的后面。这里可以使用横向滚动条,使窗口内容左右推移。 窗口内左侧纵向列出该表的所有字段名称,以供输入记录,记录和记录之间有一条横线分隔。字段名右边文本区示意出每个字段的宽度,控制着输入的字符个数。输入到定义的宽度时机器会发出“蜂鸣”声以示警告,并立即自动进到下一字段去。如果字段中输入的内容比定义的宽度要小,那么在输入完后,按Tab键或回车键可进到下一个字段去。 2017/9/9 22:57:30 22
23
如果字段是备注型的或是通用型的,输入它们的数据时就要采用其他方法了。
对于数值型字段,且带有小数点,系统在该字段中会自动给出小数点。对于日期型字段,系统自动给出斜杠,以分开年、月、日的输入位置。Visual FoxPro中,日期的显示格式有多种。因此在输入日期型字段数据时,必须搞清楚当前采用的日期格式,否则系统会发出警告,需要重新输入。 如果字段是备注型的或是通用型的,输入它们的数据时就要采用其他方法了。 2017/9/9 22:57:30 23
24
2.备注型字段数据的输入 在记录输入窗口中,备注型字段显示“memo”标志,其值通过一个专门的编辑窗口输入。具体的操作方法是:
(1)将光标移到备注型字段的memo处,按Ctrl+PgDn或双击字段的memo标志,进入备注型字段编辑窗口。 (2)在此窗口,Visual FoxPro提供了一个字处理环境,可以像任何字处理软件那样输入、编辑文本。 (3)编辑完成后,按Ctrl+W将数据存入相应的备注文件之中,并返回到记录输入窗口。或按Ctrl+Q或Esc则废弃本次输入的备注数据并返回到记录输入窗口。 在备注型字段输入数据后,该字段的memo标志变成Memo了。通过字段中memo里的第一个字母是大写还是小写,可以判断出该备注型字段是否已经输入了内容。 2017/9/9 22:57:30 24
25
通用型字段的输入可使用编辑菜单的插入对象命令,或通过剪贴板粘贴。具体操作方法是:
3.通用型字段数据的输入 通用型字段的显示与备注型字段类似,不同的是对于通用型字段在编辑窗口中标识是Gen或gen,其中该字段为空时为gen,若在其中已经存入对象,则变为Gen。 通用型字段的输入可使用编辑菜单的插入对象命令,或通过剪贴板粘贴。具体操作方法是: (1)将光标移到通用型字段的gen处,按Ctrl+PgDn或双击字段的gen标志,进入通用型字段编辑窗口。 2017/9/9 22:57:30 25
26
经过上述操作后,单击“确认”按钮,所选定的对象将自动插入到表中。
(2)选择“编辑”菜单中的“插入对象”命令,出现“插入对象”对话框。若插入的对象是新建的,则单击“新建”单选按钮,然后从“对象类型”列表框中选择要创建的对象类型。若插入的对象已经存在,则单击“由文件创建”单选按钮,在“文件”文本框中直接输入文件的路径及文件名,也可按下“浏览”按钮进行浏览查找。若不是将已存在的文件实际插入表中,而是建立一种链接的关系,则需单击“链接”复选框。若需要将插入的对象显示为一个图标,则单击“显示图标”复选框。 经过上述操作后,单击“确认”按钮,所选定的对象将自动插入到表中。 上述过程也可以通过剪贴板来完成。先用图形编辑程序(如Windows 95的画图程序)将图形送至剪贴板,再回到通用型字段编辑窗口,选择编辑菜单中的粘贴命令,剪贴板中的图形就送至该窗口。 (3)关闭通用型字段编辑窗口。 2017/9/9 22:57:30 26
27
第七讲 表的显示与维护 目的要求:掌握表的打开与关闭及表结构和表记录的相关操作 教学重点:表结构和表记录的操作
第七讲 表的显示与维护 目的要求:掌握表的打开与关闭及表结构和表记录的相关操作 教学重点:表结构和表记录的操作 教学难点:表结构和表记录的操作命令 教学课时:2课时 教学方法:讲授法,演示法. 教学内容与步骤: 2017/9/9 22:57:30 27
28
4.2 表的显示与维护 表的打开与关闭 对已经建立的表进行修改、输入、显示、删除等操作之前都必须先打开表,在操作完后要及时关闭表。 1.表的打开 菜单方式 具体操作方法:选择“文件”菜单下的“打开”命令,出现“打开”对话框。在该对话框中选择要打开的表,或在“文件名”文本框中直接键入表文件名,然后按“确定”按钮将其打开。若打开了新的表,则会关闭原先已打开的表。 2017/9/9 22:57:30 28
29
在“打开”对话框中还有“以只读方式打开”和“独占”两个复选框可供选择,如果选择“以只读方式打开”复选框,则不允许对表进行修改,默认的打开方式是读/写方式,即可修改。如果选择“独占”复选框即不允许其他用户在同一时刻也使用该表,如果不选择“独占”复选框即允许其他用户在同一时刻也使用该表,也就是以“共享”方式打开表。默认的打开方式由SET EXCLUSIVE ON|OFF的设置值确定,系统原默认设置为ON。 2017/9/9 22:57:30 29
30
命令方式 USE [盘符] [路径] <库文件名>
格式:USE <表文件名>[NOUPDATE][EXCLUSIVE] [SHARED] 功能:打开命令中指定的数据库文件。 参数描述:<表文件名>:指定要打开的表的名称。 [NOUPDATE]:指定以只读方式打开表, [EXCLUSIVE]:指定以独占的方式打开表。 [SHARED]:指定以共享的方式打开表。 ■打开表时若表含有备注型字段,则FPT文件也同时被打开。 ■每个表被打开时均赋于一个别名。若省略ALIAS<别名>,则其别名与主文件名相同。 ■若不选择任何参数,表示关闭当前工作区中已打开的表。 ■在任一时刻,每个工作区最多允许打开一个表。如果指定工作区已有表打开,在打开新的表时,系统总是先自动关闭原来打开的表。 ■打开表时,记录指针指向第一条记录。 说明:①扩展名可以省略,系统默认为 .DBF; ②一次只能打开一个数据库文件(在同一工作区中)。 2017/9/9 22:57:30 30
31
2.表的关闭 对表操作完毕后,应及时关闭表,以保证更新后的内容能写入相应的表中。关闭表的菜单操作方法是:选择“窗口”菜单中的“数据工作期”命令,弹出数据工作期窗口,在数据工作期窗口中选择“关闭”按钮关闭表。在命令窗口中使用不带文件名的USE命令,也可关闭打开的表。 命令方式 命令1格式: USE 功能:关闭当前数据库文件 命令2格式1: CLOSE ALL 命令2格式2: CLOSE TABLES 命令2格式3: CLOSE TABLES ALL 2017/9/9 22:57:30 31
32
表的显示 1.表结构的显示 命令格式是: 功能:显示当前表结构的有关信息。包括表文件名、文件更新日期、记录个数、记录长度及各字段的名称、类型、宽度和小数位数等内容。 参数说明: [TO PRINTER]:表示一边显示一边打印,将操作结果送到打印机。后面可以接[PROMPT]参数,这一参数的在执行打印命令之前,先打开“打印设置”对话框,用于对打印机有关参数(如纸张大小、打印份数、打印范围等)进行设置。[PROMPT]参数只能紧接TO PRINTER命令。 [TO FILE] <文件名>:子句表示在显示的同时将表结构输出到指定的文本文件中。 格式一:LIST STRUCTURE [TO PRINTER[PROMPT] /TO FILE<文件名>] 格式二:DISPLAY STRUCTURE [TO PRINTER[PROMPT] /TO FILE<文件名>] 2017/9/9 22:57:30 32
33
LIST STRUCTURE和DISPLAY STRUCTURE命令的区别
显示Student表的结构 USE Student LIST STRUCTURE 执行上面的命令后,屏幕显示如下: 2017/9/9 22:57:30 33
34
2.表记录的显示 显示当前表中的记录或指定的表达式的值也是使用LIST或DISPLAY命令。命令格式是: LIST | DISPLAY [[FIELDS] <表达式表>] [<范围>] [FOR <条件>] [WHILE<条件>] [TO PRINTER [PROMPT]|TO FILE <文件名>] [OFF] 命令中各子句的含义是: (1)FIELDS <表达式表>指定要显示的表达式。表达式可直接使用字段名,也可以是含有字段名的表达式,甚至是不含字段名的任何表达式。 如果省略FIELDS命令,则显示表中所有字段的值。但备注型和通用型字段内容不显示,除非备注型和通用型字段明确地包括在表达式表中。 (2)若选定FOR子句,则显示满足所给条件的所有记录。若选定WHILE子句,显示直到条件不成立时为止,这时后面即使还有满足条件的记录也不再显示。FOR子句和WHILE子句可以同时使用,同时使用时WHILE子句优先。 2017/9/9 22:57:30 34
35
(4)选用OFF时,表示只显示记录内容而不显示记录号。若省略该项则同时显示记录号和记录内容。
(3)<范围>、FOR子句和WHILE子句用于决定对哪些记录进行操作。用于有选择地显示某些记录,省略时则显示<范围>限定的全部记录。(如果有FOR子句,缺省的范围为ALL,有WHILE子句,缺省的范围为REST) 如果FOR子句或WHILE子句以及范围全省略,对于LIST缺省为所有记录,即取ALL,对于DISPLAY缺省为当前记录,即取NEXT 1。此外,对于DISPLAY命令是分屏输出,对于LIST是连续输出。 (4)选用OFF时,表示只显示记录内容而不显示记录号。若省略该项则同时显示记录号和记录内容。 (5)[TO PRINTER [PROMPT] / TO FILE <文本文件名>]:指定记录列表的输出方向。TO PRINTER [PROMPT]指定输出到打印机。[PROMPT]参数的使用方法同前。TO FILE <文本文件名>指定输出到所指定的文本文件中。 2017/9/9 22:57:30 35
36
格式一:LIST [OFF] [FIELDS <字段名列表>] [<范围>] [FOR <条件>] [WHILE <条件>] [TO PRINTER [PROMPT] / TO FILE <文本文件名>] 格式二:DISPLAY [OFF] [FIELDS <字段名列表>] [<范围>] [FOR <条件>] [WHILE <条件>] [TO PRINTER [PROMPT] / TO FILE <文本文件名>] 说明: ① LIST与DISPLAY的区别:在一屏显示不完时,LIST命令连续滚动显示,直到记录显示完为止;而DISPLAY命令则分屏显示,显示完一屏后自动暂停,按任意键可继续显示下一屏。 若省略所有可选项,则DISPLAY命令显示当前记录,即范围为NEXT 1,而LIST命令显示全部记录,即范围为ALL。 ② 范围有4种形式:ALL、NEXT n、RECORD n、REST 。 ALL:全部记录。 NEXT n:从当前记录开始以下的N条记录。 RECORD n:第n条记录。 REST:从当前记录开始到文件末尾的所有记录。 ③ 使用任选项 FIELDS<表达式表>,则显示出表达式表中表达式的名称和内容,否则显示数据库中所有的字段的名称和内容。备注字段只显示字段名。 ④ FOR子句和 WHILE子句可以对记录进行条件选择,但是前者可以显示在给定范围内的每一条符合条件的记录而后者是从记录指针当前位置开始显示满足条件的记录,直到遇到一条不满足条件的记录为止。 2017/9/9 22:57:30 36
37
(4)显示湖北或湖南学生的姓名、性别、年龄以及简历。 操作命令如下: USE 学生 LIST NEXT 5
例:就学生表,写出进行如下操作的命令: (1)显示前5条记录。 (2)显示记录号为奇数的记录。 (3)显示汉族男学生的记录。 (4)显示湖北或湖南学生的姓名、性别、年龄以及简历。 操作命令如下: USE 学生 LIST NEXT 5 LIST FOR MOD(RECNO(),2)=1 LIST FOR !少数民族否 AND 性别="男" LIST 姓名,性别,YEAR(DATE())-YEAR(出生日期),简历 FOR "湖"$籍贯 USE 2017/9/9 22:57:30 37
38
表的修改 1.表结构的修改 要修改当前表的结构,既可修改各字段的名字、类型、宽度、小数位数,又可增加、删除、移动字段或者修改索引标记。命令格式是:MODIFY STRUCTURE 修改表结构时,屏幕上会出现表设计器窗口,这和建立表时的屏幕画面是一样的。不过在修改表结构时,在窗口上会显示出原有表的结构,此时可以根据需要修改表的结构。“插入”按钮用来在光标所在字段之前插入新的字段。“删除”按钮用来删除光标处的字段。用鼠标拖动每个字段最左侧的小方块,可以调整字段的排列顺序。如果要修改原有字段的属性,可先将光标移到需要修改的位置,然后进行修改。 表结构修改完成后,在表设计器窗口单击“确定”按扭,出现询问“结构更改为永久性更改?”确认对话框,选“是”将保存对表结构所作的修改,否则放弃修改。单击“取消”按扭,出现询问“放弃结构更改?”确认对话框,选“是”表示修改无效且关闭表设计器窗口,否则可继续修改。 2017/9/9 22:57:30 38
39
2、 表结构的修改 格式:MODIFY STRUCTURE 功能:显示表设计器,修改当前表文件的结构。
说明:如果没有在当前选定工件区打开表,则显示“打开”对话框,允许用户从中选择一个要修改的表。 对表结构的更改包括:添加和删除字段;修改字段名称、大小和数据类型;添加、删除或修改索引标识,以及指定是否支持NULL值等。 (1)、删除字段 第一步:将光标移到要删字段的任一位置或单击该字段的任意位置; 第二步:按Ctrl+D删除该字段或单击【删除】命令按钮; 第三步:按Ctrl+W或单击【确定】按钮存盘,返回命令窗口。 说明:若删除了某些字段,对应字段的内容也丢失。 2017/9/9 22:57:30 39
40
第一步:将光标移到要插入字段的下一行的任一位置或单击要插入字段的下一字段;
(2)、插入新字段 第一步:将光标移到要插入字段的下一行的任一位置或单击要插入字段的下一字段; 第二步:按Ctrl+I或单击【插入】按钮,便可插入一个新的空字段,在空字段的位置上可以填入新字段名称、类型、宽度及小数位。 第三步:按Ctrl+W或单击【确定】按钮存盘,返回命令窗口。 (3)、修改字段名、宽度、类型和小数位 将光标移到要修改处直接进行修改。 ①一个字段有四个结构参数项,每次只能修改其中的一项。如果需要修改其中的多项,为了不丢失数据,应分为多次进行修改,每次修改存盘后继续修改,直到结束。 ②修改字段类型时,可能造成数据丢失。 ③无论进行何种修改,退出MODIFY STRUCTURE命令的方法与退出CREATE命令环境的方法相同。 2017/9/9 22:57:30 40
41
完成当前数据库文件结构的修改后,点击“OK”按钮后,会 出现如下的提示对话框:
如果要保存刚才对库结构所作的修改,就点击“Yes”按钮;否则,点击“No”按钮,在退出时出现的对话框(见下图)中选择“Yes”。 2017/9/9 22:57:30 41
42
2.全屏幕编辑修改 全屏幕编辑修改是指对显示在屏幕上的记录数据,通过移动光标,对光标处的字段进行修改。常用的命令有BROWSE、EDIT、CHANGE等。这里重点介绍BROWSE浏览窗口的操作 (1)打开浏览窗口。打开表后,在“显示”菜单中选择“浏览”命令,则打开浏览窗口,表的内容将出现在浏览窗口中。也可以在打开表后,输入BROWSE命令打开浏览窗口。 在浏览窗口,可以用鼠标单击浏览窗口的滚动条或滚动块查看未出现在窗口中的信息,也可用键盘的光标控制键PgUp、PgDn来查看。 对于备注型字段和通用型字段,若其中含有内容,则分别显示为Memo和Gen,若字段中没有内容,则显示为memo和gen。双击Gen和Memo或亮条在其上面时,按Ctrl+PgDn键可看到其中的内容。 2017/9/9 22:57:30 42
43
(2)数据的两种显示方式。浏览窗口中的数据有浏览和编辑两种显示方式。浏览方式每行显示一个记录,可以同时看到多个记录,而编辑方式每行显示一个字段,一个记录的所有字段都显示完后再显示第二个记录的字段。用“显示”菜单中的“编辑”命令(在浏览方式时)或“浏览”命令(在编辑方式时)可在两种显示方式之间切换。 (3)Browse窗口的分割与同步 浏览窗口左下角有一黑色小方块,可用于窗口的分割。用鼠标将小方块向右拖动,便可把窗口分为两个分区。两个分区显示同一表的内容,显示方式可根据需要任意设置。光标所在的分区称为活动分区,只有活动分区的内容才允许改变。单击某分区可使它成为活动分区,“表”菜单项中的切换分区命令也用于改变活动分区。图中示出了以两种不同方式显示表内容的两个窗口。 2017/9/9 22:57:30 43
44
经分割后的两个分区通常是同步的,也就是说当在一个分区选定某记录时,另一分区中也会显示该记录。这样,同一记录必然在两个分区同时看到。“表”菜单项中的链接分区命令可解除这种同步(消除该命令前的“√”)。此后当记录在一个窗口中滚动时,另一个窗口的记录保持不动,这样就能在一幅屏幕上查看到更多的记录内容,也便于在表的前后记录之间进行对照。重新在该命令前打“√”后,又能恢复同步。 2017/9/9 22:57:30 44
45
功能:在屏幕上打开一个浏览窗口,在窗口中显示表的记录。 参数描述:
(2)利用命令浏览和修改表中的数据 格式:BROWSE [FIELDS <字段名表>] [LOCK <数据型表达式>] [LAST] [FOR <逻辑型表达式>] 功能:在屏幕上打开一个浏览窗口,在窗口中显示表的记录。 参数描述: [Fields<字段名表>]: 指定在浏览窗口中显示的表的字段。 LOCK <数据型表达式>:将浏览窗口一分为二,指定在左窗口中显示的字段数。 LAST:按最后一次关闭浏览窗口的方式打开浏览窗口。 FOR <逻辑型表达式>:指定在浏览窗口中显示的记录所要求满足的条件。 说明: 1、BROWSE命令可以带有很多任选项,命令格式中只介绍了BROWSE命令的最基本的任选项。 2017/9/9 22:57:30 45
46
格式:CHANGE / EDIT [FIELDS<字段名表>] [<范围>]
其它的记录修改命令 格式:CHANGE / EDIT [FIELDS<字段名表>] [<范围>] [FOR / WHILE <条件>] 功能:以全屏幕编辑方式修改记录。 例: USE 1 CHAN FIEL 学号,姓名,简历 USE 2 CHANGE FIELDS 学号,姓名 2017/9/9 22:57:30 46
47
3.成批替换修改 有时对记录数据的修改是有规律的,对这种数据的修改如果仍用BROWSE等命令逐个修改就很麻烦,而使用成批替换修改的方法就非常方便。 命令格式: REPLACE <字段1> WITH <表达式1> [ADDITIVE] [,<字段2> WITH<表达式2> [ADDITIVE]] [,…][<范围>] [FOR <条件>] [WHILE <条件>] 该命令用一个表达式的值替换当前表中一个字段的值。 命令中各子句的含义是: (1)若不选择<范围>和FOR子句或WHILE子句,则默认为当前记录。如果选择了FOR子句,则<范围>默认为ALL,选择了WHILE子句,则<范围>默认为REST。 (2)ADDITIVE只能在替换备注型字段时使用。使用ADDITIVE,备注型字段的替换内容将附加到备注型字段原来内容的后面,否则用表达式的值改写原备注型字段内容。 2017/9/9 22:57:30 47
48
3.记录值的成批替换修改 格式:REPLACE <字段名1> [ADDITIVE] [,<字段名2> WITH <表达式2> [ADDITIVE]…] [<范围>] [FOR <条件>] [WHILE <条件>] 功能:不进入全屏幕编辑方式,根据命令中指定的条件和范围,用一个表达式的值替换当前表中指定字段值。 (1)若不选择<范围>和FOR子句或WHILE子句,则默认为当前记录。如果选择了FOR子句,则<范围>默认为ALL,选择了WHILE子句,则<范围>默认为REST。 (2)ADDITIVE只能在替换备注型字段时使用。使用ADDITIVE,备注型字段的替换内容将附加到备注型字段原来内容的后面,否则用表达式的值改写原备注型字段内容。 说明: WITH后面的表达式的类型必须与WITH前面的字段类型一致 。 2017/9/9 22:57:30 48
49
REPLACE 入学成绩 WITH 入学成绩+20 FOR 少数民族否 GO 6 &&将记录指针定位到6号记录
例:写出对学生表进行如下操作的命令 (1)将少数民族学生的入学成绩增加20分。 (2)将6号记录的出生日期修改为1983年9月7日; 操作命令如下: USE 学生 REPLACE 入学成绩 WITH 入学成绩+20 FOR 少数民族否 GO &&将记录指针定位到6号记录 REPLACE 出生日期 WITH {^ } 2017/9/9 22:57:30 49
50
4.2.4 表记录指针的定位 1、记录的绝对定位 绝对定位是将记录指针定位到指定记录。
表记录指针的定位 记录定位就是将记录指针移到指定的记录上,记录指针指向的记录称为当前记录。VFP提供了绝对定位和相对定位和查询定位命令。 1、记录的绝对定位 绝对定位是将记录指针定位到指定记录。 格式一:GOTO <记录号>|TOP|BOTTOM 格式二:GO [RECORD <数值表达式> ] |TOP|BOTTOM 格式三: <数值表达式> 功能:将记录指针直接定位到指定的记录上。 说明: RECORD可省略。<数值表达式>的值必须大于0,且不大于当前表文件的记录个数。命令中记录号的取值范围是1至当前表中的最大记录个数,即函数RECCOUNT( )的值,否则出错。TOP和BOTTOM分别表示表的首、末记录。 2017/9/9 22:57:30 50
51
2、记录的相对定位 相对定位与当前记录有关,它是把记录指针从当前位置作相对移动。相对定位是以当前记录位置为基准,向前或向后移动记录指针。
格式:SKIP [<数值表达式>] 或 SKIP [<记录数>] 功能:将记录指针向前或向后作相对若干条记录的移动。 参数描述:<数值表达式>:指定记录指针作相对移动的记录数。 说明: 1、移动的记录数等于<数值表达式>的值,其值为正数时,记录指针向下移动(往表尾方向移动),当<数值表达式>是负数时,记录指针向上移动(往表头方向移动)。 2、若省略选择项<数值表达式>,约定为向下移动一条记录,即记录指针移到下一条记录。因此SKIP 等价于SKIP 1。 3、如果记录指针指向未记录而执行SKIP,则RECON( )返回一个比表记录数大1的数,且EOF( )返回.T.。如果记录指针指向首记录而执行SKIP -1,则RECNO( )返回1,且BOF()返回.T.。利用BOF( )和EOF( )这两个函数可以掌握有关记录指针移动的情况。当BOF( )和EOF( )这两个函数的值已经为.T.时,如企图向相同方向各再执行SKIP命令就会出错。 格式:SKIP [<数值表达式>] 或 SKIP [<记录数>] 2017/9/9 22:57:30 51
52
3.记录的查询定位 这里先介绍顺序查询,索引查询在后面介绍表的索引时介绍。 顺序查询的命令格式是:
LOCATE [<范围>] FOR <条件>|WHILE <条件> 如果指定<范围>,则按指定<范围>查找,省略<范围>时默认为ALL。找到后,记录指针指向该记录,函数FOUND()值为.T.,否则,记录指针指向<范围>的最末一个记录上,省略<范围>则指向文件尾,函数FOUND()值为.F.。当查找到第一个满足条件的记录后,如果执行CONTINUE命令,则继续寻找满足条件的记录,直到<范围>结束为止。 2017/9/9 22:57:30 52
53
例:在学生表中查询汉族男生的姓名、入学成绩和年龄。 操作命令如下: USE 学生 LOCAT FOR !少数民族否AND 性别="男"
DISP 姓名,入学成绩, YEAR(DATE())-YEAR(出生日期) CONTINUE ? RECNO(),姓名,入学成绩, YEAR(DATE())-YEAR(出生日期) 2017/9/9 22:57:30 53
54
4.2.5 表记录的增加与删除 1.插入记录 命令格式是: INSERT [BLANK] [BEFORE]
表记录的增加与删除 1.插入记录 命令格式是: INSERT [BLANK] [BEFORE] 该命令在当前表的指定位置上插入一个新记录。若给出BLANK选项,则插入一个空记录。若不给出此项,则进入全屏幕数据记录输入窗口。若给出BEFORE选项,则在当前记录的前面插入一个新记录,即插入的新记录成为当前记录,而原来的当前记录及其后面记录的记录号均加1。若不给出该选项,则在当前记录的后面插入一个新记录。 例:对学生表增加6号和7号记录。 USE 学生 GO 6 INSERT BEFORE &&此时新增加的6号记录变成当前记录 INSERT &&在6号记录之后插入一条新记录,即第7号记录 2017/9/9 22:57:30 54
55
在表中插入记录 1、INSRET命令 格式:INSERT [BLANK] [BEFORE] 功能:在当前记录之前或之后插入一条或多条新记录。
参数描述: 选择[BEFORE]子句,新记录插在当前记录之前,当前记录和其后的记录向后顺序移动并提供编辑状态(出现数据录入窗口);否则插在当前记录之后,当前记录之后的记录顺序向后移动并提供编辑状态(出现数据录入窗口)。 选择[BLANK]子句,则在当前记录之前插入一条空记录,不提供编辑状态(不出现数据录入窗口)。 说明: 1、省略所有可选项,则在当前记录之后插入新记录。 2、在VFP中,如果数据库具有表缓冲或行缓冲功能,则INSERT命令不能用于该数据库的表;对于具有参照完整性规则的表也不能使用INSERT命令 。 2017/9/9 22:57:30 55
56
2、INSERT——SQL命令 格式一:INSERT INTO <表文件名>[(<字段名1> [,<字段名2>…])] VALUES (<表达式1>[,<表达式2>…]) 格式二:INSERT INTO <表文件名> FROM ARRAY <数组名>/ FROM MEMVAR 功能:在表尾追加一个包含指定字段值的记录。 参数描述: <表文件名>:指定要追加记录的表文件名。<表文件名>中可以包含路径,也可以是一个名称表达式。 [(<字段名1> [,<字段名2>…])]:指定要插入值的字段名。 [VALUES (<表达式1>[,<表达式2>…])]:新插入记录的字段值。 [FROM ARRAY <数组名>]:指定一个数组,数组中的数据将被插入到新记录中。 FROM MEMVAR:把内存变量的内容插入到与它同名的字段中。 2017/9/9 22:57:30 56
57
2、如果省略了VALUES子句后的字段名,那么,必须按照定义表结构时的顺序来指定字段值。
说明: 1、如果<表文件名>指定的表没有打开,则VFP先在一个新工作区中以独占方式打开该表,然后再把新记录追加到表中,此时并未选定该工作区,选定的仍然是当前的工作区。 2、如果省略了VALUES子句后的字段名,那么,必须按照定义表结构时的顺序来指定字段值。 3、使用FROM ARRAY <数组名>子句时,从<数组名>指定数组的第一个数组元素开始,数组中的每一个元素的内容依次插入到新记录的对应字段中。第一个数组元素的内容插入到新记录的第一个字段,第二个元素的内容插入到新记录的第二个字段,依此类推。 4、当使用FROM MEMVAR子句时,如果某一字段不存在同名的内存变量,则该字段为空。 2017/9/9 22:57:30 57
58
2.追加记录 表的数据录入有多种方法:第一种方法是在表结构建立时录入数据;第二种方法是在表结构建成并存盘关闭了“表设计器”之后,利用命令向表中追加记录。 格式:APPEND [BLANK] 参数描述:[BLANK]:在当前表的末尾添加一条空记录。 功能:在当前表的末尾追加一个或多个新记录。 说明: ■可以在只有表结构而没有记录的空表中添加记录,也可以在已经录入数据的表中的尾部追加记录; ■它可以向当前表的尾部追加一条或多条新记录。省略可选项,则在当前表的尾部追加任意新记录,追加记录的方法及操作与用CREATE命令建立表时输入数据的方法相同; ■当发出APPEND或APPEND BLANK命令,并且在选定工作区中没有打开的表时,将显示一个“打开”对话框,我们可以在对话框中选择一个要添加记录的表。APPEND命令打开一个编辑窗口,我们可以在其中输入一个或多个新记录。增加新记录后,VFP将自动修改打开的所有索引。 2017/9/9 22:57:30 58
59
APPEND命令是在当前表的末尾增加新记录,而INSERT命令可以在指定位置上增加新记录。两条命令的屏幕操作方式是相同的。
例:在学生表末记录后增加两个记录。 USE 学生 APPEND 显然,APPEND命令与下面两条命令等价: GO BOTT INSERT 2017/9/9 22:57:30 59
60
3.删除记录 Visual FoxPro对部分记录的删除分两步进行:首先对想要删除的记录加上删除标志(*),这时被标记的记录并没有真正被删除,需要时仍可以恢复。然后对加了删除标志的记录真正地从表中删除掉。 (1)给记录加删除标志 命令格式是: DELETE [<范围>] [FOR<条件>] [WHILE <条件>] 该命令给指定的记录加上删除标志。若不选择可选项,则仅对当前记录加上删除标志。 (2)取消删除标记 RECALL [<范围>] [FOR<条件>] [WHILE<条件>] 该命令取消指定记录上的删除标志,若不选择可选项,则仅取消当前记录的删除标志。 2017/9/9 22:57:30 60
61
该命令删除当前表的全部记录,只留下表结构。
(3)真正删除记录 命令格式是: PACK 该命令清除所有带删除标志的记录。 例 删除学生表中5~10之间的全部记录。 USE 学生 GO 5 DELETE NEXT 6 (4)删除全部记录 ZAP 该命令删除当前表的全部记录,只留下表结构。 2017/9/9 22:57:30 61
62
表的复制 1.复制表的结构 格式:COPY STRUCTURE TO <文件名> [FIELDS <字段名表>] 功能:将当前表结构的部分或全部复制到<表文件名>所指定的表中。仅复制当前表的结构,其记录数据不复制。 参数描述: <表文件名>:指定生成新表结构的表文件名,是复制产生的表名,复制后只有结构而无任何记录。 FIELDS <字段名表>:指定在新表中包含的字段及顺序。 说明:复制生成的表文件中的结构部分包含哪些字段,以及字段先后顺序都由FIELDS <字段名表>所规定。 若给出FIELDS <字段名表>选项,则生成的空表文件中只含有<字段名表>中给出的字段,若省略此项,则复制的空表文件的结构和当前表相同(按字段原来的顺序复制全部字段)。 2017/9/9 22:57:30 62
63
格式:COPY STRUCTURE TO <表结构文件名> EXTENDED
建立表结构的其它方法 (1)生成表结构文件 格式:COPY STRUCTURE TO <表结构文件名> EXTENDED 功能:它将当前表的结构复制生成一个特殊的表文件,即表结构伸展文件。 将Student的结构复制生成一个表结构文件studstr,然后用显示其结构 USE Student COPY STRUCTURE TO studstr EXTENDED USE studstr LIST STRUCTURE 格式:COPY STRUCTURE TO <表结构文件名> EXTENDED 2017/9/9 22:57:30 63
64
2017/9/9 22:57:30 64
65
(2)将表结构文件还原成表结构 格式:CREATE <表文件名> FROM <表结构文件>
功能:将表结构文件还原成为普通表文件。新建的表文件是一个只有结构部分而没有记录的表结构框架。 将上例中的studstr表结构文件还原生成一个新的表文件Student1 CREATE Student1 FROM studstr USE Student1 LIST STRUCTURE 2017/9/9 22:57:30 65
66
功能:该命令将当前表中的数据与结构同时复制到指定的表中,即复制了一个新的表。此命令还可以将当前表复制生成一个其他格式的数据文件。
2.复制表 命令格式: COPY TO <文件名> [FIELDS] <字段名表> [<范围>] [FOR<条件>] [WHILE <条件>][[TYPE] SDF|DELIMITED|XLS] [WITH <定界符>|BLANK] 功能:该命令将当前表中的数据与结构同时复制到指定的表中,即复制了一个新的表。此命令还可以将当前表复制生成一个其他格式的数据文件。 2017/9/9 22:57:30 66
67
参数描述(命令中各子句的含义): (1)<文件名>表示复制后产生的新的文件名。
(2)若选择了FIELDS <字段名表>,则将<字段名表>中给出的部分字段的数据复制到指定的文件中,省略此项,则等价于当前表的全部字段。字段名表中还可包含有其他工作区表的字段。 (3)<范围>和FOR <条件>、WHILE <条件>决定了对哪些记录进行复制。省略这些子句时,则复制当前表的所有记录。 (4)复制含有备注型字段的表时,如果指定要复制该备注型字段,则在复制表的同时,复制相应的备注文件。 (5)若选择了SDF或DELIMITED,则将当前表复制成指定的文本文件,默认扩展名为TXT。其格式由SDF和DELIMITED决定。SDF为标准格式,记录定长,不用分隔符和定界符,每个记录均从头部开始存放,均以回车符结束。DELIMITED为通用格式,记录不等长,每个记录均以回车符结束。若选用BLANK,字段之间用一个空格分隔,否则用一个逗号分隔。若选用<定界符>,字符型数据用指定的<定界符>括起来,否则用双引号括起来。若选择了XLS,则得到一个Excel文件,该文件只能在Excel中打开。 2017/9/9 22:57:30 67
68
例:对学生表进行复制操作,并分析目标文件的类型。 (1)将入学成绩大于600分的记录复制到new.dbf中。
(2)分别生成标准格式和通用格式的文本文件new1.txt和new2.txt。 操作命令如下: USE 学生 COPY TO new1 FOR 入学成绩>600 USE new &&查看新表的记录 LIST COPY TO new1 SDF TYPE new1.txt &&查看新文本文件的内容 COPY TO new2 DELIMITED TYPE new2.txt &&注意和new1.txt文件格式上的差异。 2017/9/9 22:57:30 68
69
功能:该命令将指定文件(源文件)中的数据添加到当前表的 尾部。 参数描述(命令中各子句的含义):
3.从其他文件向表添加数据 命令格式:APPEND FROM <文件名> [FIELDS <字段名表>] [FOR <条件>] [WHILE <条件>] [[TYPE] <文件类型>] 功能:该命令将指定文件(源文件)中的数据添加到当前表的 尾部。 参数描述(命令中各子句的含义): (1)<文件名>说明从哪个文件读取添加数据,即源文件的名字。若没有给出扩展名,则系统认定为dbf。 (2)若给出FIELDS <字段名表>选项,则数据只添加到在<字段名表>中说明的字段。FOR <条件>或WHILE <条件>是对源文件记录的限制。 (3)<文件类型>选SDF或DELIMITED,取决于源文件的格式。 (4)要注意源文件中的数据与当前表字段类型、顺序和长度要匹配。 2017/9/9 22:57:30 69
70
从另一个表中成批追加记录 格式:APPEND FROM <表文件名>/?[FIELDS <字段列表>] [FOR <条件>] [WHILE <条件>] [[TYPE] <文件类型>] 功能:从一个表中读入记录,追加到当前表的尾部。 参数描述: <表文件名>:指定要向当前表中追加记录的数据源。 [<?>]:显示“打开”对话框,从中选择从哪个表中读入数据。 [FIELDS <字段列表> ]:指定添加哪些字段数据。 [FOR <条件>]:为当前选定表中每一条<条件>为“真”的记录追加新记录,直至达到当前选定表的末尾。如果省略FOR子句,则整个源文件记录都追加到当前表中。 2017/9/9 22:57:30 70
71
4.表与数组间的数据传送 表与数组间的数据传送是指可将表的记录数据传送到数组中而成为数组元素,反过来也可以将数组元素值传送到表而成为记录数据。 (1)将表的记录数据传送到数组 命令格式: SCATTER [FIELDS <字段名表>] TO <数组名> [MEMO] 功能:命令按顺序将当前表当前记录指定字段的内容依次存入数组。第一个字段存入数组的第一个元素中,第二个字段存入数组的第二个元素中,依次类推。 参数描述:如果未指定FIELDS <字段名表>,则将除备注型字段以外所有的字段存入数组中。如果要对备注型字段同样处理,就需在命令中加上MEMO选项。如果数组元素个数比字段个数多,则多余的数组元素内容仍保留;如果数组元素个数比字段个数少,则系统自动重新建立数组。 2017/9/9 22:57:30 71
72
例: 分析下列命令执行后,数组元素值的变化。 CLEAR MEMORY USE 学生 DIMENSION y(5)
STORE 7645 TO y(5) GO 4 SCATTER FIELDS 姓名,出生日期,少数民族否,籍贯 TO y LIST MEMORY LIKE y? 2017/9/9 22:57:30 72
73
GATHER FROM <数组名> [FIELDS <字段名表>] [MEMO]
(2)将数组数据传送到表记录 命令格式: GATHER FROM <数组名> [FIELDS <字段名表>] [MEMO] 功能:命令将数组中的数据作为一个记录传送到当前打开的表中的当前记录。 参数描述:如果指定FIELDS <字段名表>短语,则只向指定的字段填加数据,其他字段填空。如果未指定FIELDS <字段名表>短语,则按字段顺序填加数据。当省略MEMO选项时将忽略备注型字段。如果数组元素个数少于指定字段个数,则多余的字段填空;如果数组元素个数多于指定字段个数,则忽略多余的数组元素。当数组元素的数据类型与表相应字段类型不同且不兼容(如数值型数组元素仍能被传送到字符型字段之中,它们虽类型不同却是兼容的)时,该字段将自动被初始化为空值。字符型与数值型的默认空值分别是空格与0,日期型与逻辑型的默认空值为{ / / }与.F.。 2017/9/9 22:57:30 73
74
例:通过数组y向学生表添加记录。 USE 学生 APPE BLAN DIMENSION y(5) Y(1)=’100100’
STORE "邓杰辉" TO y(2) y(3)="女" y(4)={^ } STORE .T. TO y(5) GATHER FROM y GO BOTT DISP 2017/9/9 22:57:30 74
75
COPY TO ARRAY <数组名> [FIELDS] <字段名表>]
(3)把表的一批记录同时复制到数组 命令格式: COPY TO ARRAY <数组名> [FIELDS] <字段名表>] [<范围>] [FOR<条件>] [WHILE<条件>] 功能:命令将当前表指定记录中指定字段的数据复制到指定的数组之中。 参数描述:若可选项都缺省,则复制除备注型字段以外的全部记录数据。命令中指定的数组如不存在。Visual FoxPro会根据需要自动建立此数组,若数组已事先定义好,该命令将不会自动调整数组的大小以满足要求。可以复制表的单个记录的数据到一个一维数组中,但与SCATTER命令不同的是该命令不能把备注型字段的数据复制到数据中。 2017/9/9 22:57:30 75
76
说明: COPY TO ARRAY 命令能够一次把当前表中的多个记录同时复制到指定二维数组中,一个记录的数据送入数组的同一行中,即第一个字段数据送到该行的第一列,第二个字段数据被送到该行的第二列,依此类推。如果二维数组的列数小于表的字段数,则多余的字段的数据将被丢失;如果大于,则多余的数组列元素值保持不变。类似地,表的各个指定记录会按顺序被复制到数组的各行之中。如果数组的行数少于被指定的记录数,则多出的记录数据便不被复制,否则剩下的数组行各元素保持原值不变。 2017/9/9 22:57:30 76
77
(4)从数组向表添加记录 命令格式: APPEND FROM ARRAY <数组名> [FOR<条件>] [FIELDS <字段名表>] 功能:命令将满足条件的数组行的数据按记录形式依次添加到当前表中,但它忽略备注型字段。 参数描述:若选择FIELDS子句,则在添加记录时只向其中列出的字段传送数据。命令中指定的数组可以是一维或二维,一维数组一次向表添加一个记录;而二维数组的每一行将添加到表成为一个新记录,所以二维数组的行数即为所添加的新记录个数。若数组所具的列数多于表的字段数,这些多余列的数组元素将被忽略;反过来,若表的字段数多于数组的列数,则多出来的字段被自动赋以空值。类似于单个记录与数组间的数据传送,当数组元素的数据类型与表相应字段类型不同且不兼容时,该字段将自动被赋以空值。 2017/9/9 22:57:30 77
78
例: 分析下列命令执行后,new.dbf的内容。 USE 学生 DIMENSION y(3,5)
COPY TO ARRAY y FOR AT("湖",籍贯)>0 FIEL 学号,姓名,籍贯,出生日期,入学成绩 COPY STRU TO new FIEL 学号,姓名,籍贯,出生日期,入学成绩 USE new APPE FROM ARRA y LIST 2017/9/9 22:57:30 78
79
第八讲 表的排序与索引 目的要求:掌握表的排序与索引、表的统计与计算及多个表的操作 教学重点:表的排序与索引、统计与计算
第八讲 表的排序与索引 目的要求:掌握表的排序与索引、表的统计与计算及多个表的操作 教学重点:表的排序与索引、统计与计算 教学难点:表的排序与索引 教学课时:2课时 教学方法:讲授法,演示法. 教学内容与步骤: 2017/9/9 22:57:30 79
80
4.3 表的排序与索引 表的排序 排序是根据不同的字段对当前表的记录做出不同的排列,产生一个新的表。新表与旧表内容完全一样,只是它们的记录排列顺序不同而已。 (1)数据表的排序:把数据表文件中的记录按照某个字 段值的大小顺序重新排列。 (2)关键字:作为排序依据的字段。 (3)升序:按照关键字值从小到大的顺序进行排序。 (4)降序:按照关键字值由大到小的顺序进行排序。 (5)数据大小的比较规则:如果是数值型、日期型的数据进行比较,则由其本身的大小决定;字符型数据由其ASCII码值确定,汉字由机内码确定大小。 2017/9/9 22:57:30 80
81
该命令对当前表中的记录按指定的字段排序,并将排序后的记录输出到一个新的表中。 命令中各子句的含义是:
SORT TO <文件名> ON <字段1>[/A|/D][/C][,<字段2>[/A|/D][/C]…] [FIELDS <字段名表>] [<范围>] [FOR <条件>] [WHILE <条件>] 该命令对当前表中的记录按指定的字段排序,并将排序后的记录输出到一个新的表中。 命令中各子句的含义是: (1)<文件名>是排序后产生的新表文件名,其扩展名默认为.dbf。 (2)由<字段1>的值决定新表中记录的排列顺序,缺省时,按升序排列。不能按备注型或通用型字段排序。 可以用多个字段排序。<字段1>为首要排序字段,<字段名1>的值相等的记录再按<字段2>进一步排序,依此类推。 (3)对于在排序中使用的每个字段,可以指定升序或降序的排列顺序。/A表示升序,/D表示降序,/A或/D适合于任何类型的字段。 缺省时,字符型字段中的字母大小写是不同的。如果在字符型字段后加上/C,则忽略大小写。可以把/C与/A或/D选项结合在一起使用。例如,/AC或/DC。 2017/9/9 22:57:30 81
82
(4)由FIELDS指定从当前表中的字段来生成新表中包含的字段名。如果省略FIELDS子句,当前表中的所有字段都包含在新表中。
(5)各种类型的字段名都可用做排序关键字。数值型字段按数值大小进行排序,字符型字段值的大小根据组成字符串的字符的ASCII码值的大小进行排序,汉字按其内码大小,日期型字段按年、月、日的先后顺序进行排序,逻辑型字段.F.小于.T.。 (6)若省略<范围>、FOR <条件>和WHILE <条件>等选项,表示对所有记录排序。 例 就学生表,显示入学成绩最高的5名职工的记录。 操作命令如下: USE 学生 SORT ON 入学成绩/D TO cjb USE cjb &&打开排序后生成的新表文件 LIST NEXT 5 2017/9/9 22:57:30 82
83
索引概述 1.索引的概念 排序由于要建立一个新的表,因此数据记录很多时,既费时间,又占用磁盘空间,为此,常用建立索引文件的方法对表的记录重新组织。 索引并不是重新排列表记录的物理顺序,而是另外形成一个索引关键表达式值与记录号之间的对照表,这个对照表就是索引文件。索引文件中记录的排列顺序称为逻辑顺序。索引文件发生作用后,对表进行操作时将按索引表中记录的逻辑顺序进行操作,而记录的物理顺序只反映了输入记录的历史,对表的操作将不会产生任何影响。 对于用户来说,索引不但可以使数据记录重新组织时节省磁盘空间,而且可以提高表的查询速度。 2017/9/9 22:57:30 83
84
2)如果对数据表文件进行增、删、改操作时,需要重新进行排序 什么是索引文件?
为什么使用索引? 1)排序造成了数据冗余,浪费存储空间 2)如果对数据表文件进行增、删、改操作时,需要重新进行排序 什么是索引文件? 1)索引文件是由指针构成的,这些指针逻辑上按照索引关键字进行排序。 2)索引文件和表文件分别进行存储,并不改变表中记录的物理位置。 2017/9/9 22:57:30 84
85
Visual FoxPro提供了两种不同类型的索引文件:单索引文件和复合索引文件。
2.索引文件的种类 Visual FoxPro提供了两种不同类型的索引文件:单索引文件和复合索引文件。 (1)独立(单)索引文件:扩展名为.IDX,一个索引文件中只能保存一个索引(其各个索引文件只能包含一个单一的关键字或者组合关键字)。采用单索引时,对于每一个索引都要建立一个文件,这势必造成索引文件的增多,特别是在更新索引时,必须打开所有的索引文件,这是不方便的。 独立索引文件可分为:压缩索引文件和普通(非压缩)索引文件。压缩的索引文件可以使索引文件少占存储空间。 (2)复合索引文件:扩展名为.CDX,在一个复合索引文件中可以存储多个索引(包含多个索引选项),每个索引用一个索引标识(Index Tag)来表示。一个复合索引文件中可包含的索引的数目亦即索引标志的数目仅受内存空间的限制。复合索引文件一定是压缩的索引文件。 复合索引文件有两种类型: 结构复合索引文件(Structural Compound Index) 独立复合索引文件(Independent Compound Index) 2017/9/9 22:57:30 85
86
有一类特殊的复合索引文件叫做结构复合索引文件,它的文件名与相应的表名相同,扩展名仍为cdx。结构复合索引文件的特殊性在于无论何时打开表,该索引文件将由系统自动打开。这就意味着当对表的记录进行修改时,全部索引也将自动更新。所以一般情况下,使用结构复合索引是极为方便的。 复合索引将多个索引集中到一个索引文件,和单索引相比,效率更高,使用更为方便。但单索引并非没有用处,一方面使用单索引文件可以和FoxBASE+等早期的表产品兼容,另一方面单索引文件可以作为临时性索引使用,因为如果复合索引所含的索引太多,在更新索引时速度就会很慢。 2017/9/9 22:57:30 86
87
4.3.3 建立索引文件 1.用命令建立索引 命令格式是: 该命令对当前表建立一个索引文件或增加索引标志。 命令中各子句的含义是:
建立索引文件 1.用命令建立索引 命令格式是: INDEX ON <索引表达式> TO <单索引文件名>|TAG <索引标志名> [OF <复合索引文件名>] [FOR <条件>][COMPACT] [ASENDING|DESCENDING] [UNIQUE] [ADDITIVE] 该命令对当前表建立一个索引文件或增加索引标志。 命令中各子句的含义是: (1)<索引表达式>是包含当前表中的字段名的表达式,表达式中的操作数应具有相同的数据类型。 (2)若给出TO <单索引文件名>子句,则建立一个单索引文件。若给出TAG <索引标志名> [OF <复合索引文件名>],则建立一个复合索引文件,或为已建立并打开的复合索引文件增加索引标志。OF <复合索引文件名>选项用于指定非结构复合索引文件的名字,省略此选项时,表示建立结构复合索引文件。 2017/9/9 22:57:30 87
88
(3)若选择FOR <条件>选项,则只有哪些满足条件的记录才出现在索引文件中。
(4)选用COMPACT,则建立一个压缩的单索引文件。复合索引文件自动采用压缩方式。 (5)复合索引时,系统默认或选用ASCENDING,按索引表达式的升序建立索引。选用DESCENDING按降序建立索引。单索引文件只能按升序索引。 (6)选用UNIQUE,则对于索引表达式值相同的记录,只有第一个记录列入索引文件。 (7)选用ADDITIVE,则建立本索引文件时,以前打开的索引文件仍保持打开状态。 2017/9/9 22:57:30 88
89
例:就学生表建立结构复合索引文件,其中包含2个索引: (1)按学号的升序排列,不允许有编号相同的记录。
例:用建立索引文件的方法完成例4.11的操作。 USE 学生 INDEX ON -入学成绩 TO sy LIST NEXT 5 例:就学生表建立结构复合索引文件,其中包含2个索引: (1)按学号的升序排列,不允许有编号相同的记录。 (2)先按性别升序,性别相同再按入学成绩降序排列。 INDEX ON 学号 TAG sy1 UNIQUE INDEX ON 性别+STR(1000-入学成绩) TAG sy2 2017/9/9 22:57:30 89
90
索引文件的使用 1. 打开索引文件 索引文件必须先打开才能使用。结构复合索引文件随相关表的打开而自动打开,但单索引文件和非结构复合索引文件必须由用户自己打开。打开索引文件有两种方法,一种是在打开表的同时打开索引文件,另一种是在打开表后,需要使用索引时,再打开索引文件。 (1)表和索引文件同时打开 命令格式是: USE <表文件名> INDEX <索引文件名表> 该命令打开指定的表及其相关的索引文件。 命令中各子句的含义是: ①<索引文件名表>可以包含多个索引文件,这些索引文件可以是单索引文件,也可以是复合索引文件。其中只有第一个索引文件对表的操作起控制作用,称为主索引文件。 ②如果第一个索引文件是复合索引文件,由于包含多个索引标志,无法确定哪个索引标志起作用,所以在打开后还要确定主索引,否则对表进行操作时,数据记录仍按物理顺序排列。 2017/9/9 22:57:30 90
91
SET INDEX TO [<索引文件名表>] [ADDITIVE] 该命令功为当前表打开一个或多个索引文件。
(2)打开表后再打开索引文件 命令格式是: SET INDEX TO [<索引文件名表>] [ADDITIVE] 该命令功为当前表打开一个或多个索引文件。 命令中各子句的含义是: ①省略任何选项而直接使用SET INDEX TO,将关闭当前工作区中除结构复合索引文件之外的全部索引文件。 ②若省略ADDITIVE选项,则在使用该命令打开索引文件时,除结构复合索引文件之外的索引文件均被关闭。 2017/9/9 22:57:30 91
92
SET ORDER TO [<索引文件顺序号>|<单索引文件名>]|
2. 确定主控索引 命令格式是: SET ORDER TO [<索引文件顺序号>|<单索引文件名>]| [TAG] <索引标志名> [OF <复合索引文件名>]] 该命令指定表的主控索引文件或主控索引标志。 命令中各子句的含义是: (1)<索引文件顺序号>表示已打开的索引文件的序号,用以指定主控索引。单索引文件首先按打开的先后顺序标识序号,然后,结构复合索引文件的索引标志按其生成的顺序计数,最后是非结构复合索引文件的索引标志按其生成的顺序计数。 (2)最好使用<单索引文件名>指定一个单索引文件为主控索引文件,这样做比用索引文件顺序号更直观。 (3)[TAG] <索引标志名> [OF <复合索引文件名>]用于指定一个已打开的复合索引文件中的一个索引标志为主控索引。 (4)不带任何短语的SET ORDER TO命令可以取消主控索引。 2017/9/9 22:57:30 92
93
(2)SKIP命令按逻辑顺序移动记录指针。 (3)表被打开后,记录指针位于TOP位置,而不一定指向1号记录。
使用索引文件后,虽然表中各记录的物理顺序并未改变。但记录指针不再按物理顺序移动,而是按主控索引文件中记录的逻辑顺序移动,于是整个表中的记录是按索引关键表达式值排序的效果。 使用索引文件时,还要特别注意以下几点: (1)在使用GO命令时,GO <数值表达式>使记录指针指向具体的物理记录号,而与索引无关,而GO TOP|BOTTOM将使记录指针指向逻辑首或逻辑尾记录,这时GO TOP不再等同于GO 1。 (2)SKIP命令按逻辑顺序移动记录指针。 (3)表被打开后,记录指针位于TOP位置,而不一定指向1号记录。 2017/9/9 22:57:30 93
94
例: 当有索引文件时,分析记录指针的移动规律。 USE 学生 INDEX ON 入学成绩 TO sy3 GO 6
? RECNO(),姓名 &&显示6 李勤奋 SKIP ? RECNO(),姓名 &&显示5 欧阳天地 2017/9/9 22:57:30 94
95
该命令关闭当前工作区内所有打开的索引文件。但结构复合索引文件不能关闭,它随表的关闭而自动关闭。
3. 关闭索引文件 命令格式是: CLOSE INDEX SET INDEX TO 该命令关闭当前工作区内所有打开的索引文件。但结构复合索引文件不能关闭,它随表的关闭而自动关闭。 此外,使用无任何选项的USE命令,除了关闭当前工作区的表外,也关闭了与之相关的索引文件。 2017/9/9 22:57:30 95
96
DELETE FILE <索引文件名> DELETE TAG ALL|<索引标志名表>
4. 删除索引 命令格式是: DELETE FILE <索引文件名> DELETE TAG ALL|<索引标志名表> 第一种格式的命令用于删除一个单索引文件。第二种格式的命令用于删除打开的复合索引文件的所有索引标志或指定的索引标志。如果一个复合索引文件的所有索引标志都被删除,则该复合索引文件也就自动被删除了。 2017/9/9 22:57:30 96
97
命令格式是:REINDEX [COMPACT] 使用COMPACT可以把普通的单索引文件变成压缩的单索引文件。
5.更新索引 索引文件依赖于表而存在,当表中的数据发生变化时,索引文件也应相应地被更新。如果在对表进行修改时,已经打开了相关的索引文件,则Visual FoxPro会对索引文件自动更新。如果没有打开索引文件,则数据记录的变化无法反映到索引文件中去。这时需要重新索引,当然可以使用前面介绍过的INDEX命令重新建立索引文件,但这样做需要提供若干选择项,比较烦琐。通常的办法是使用REINDEX命令来更新所有打开的索引文件。 命令格式是:REINDEX [COMPACT] 使用COMPACT可以把普通的单索引文件变成压缩的单索引文件。 2017/9/9 22:57:30 97
98
索引查询定位是在当前表中,按已确定的主索引文件关键字来查询与指定表达式值相匹配的第一条记录,找到后将记录指针定位于该记录。命令格式是:
6.索引查询定位 索引查询定位是在当前表中,按已确定的主索引文件关键字来查询与指定表达式值相匹配的第一条记录,找到后将记录指针定位于该记录。命令格式是: SEEK <表达式> 命令中的<表达式>可以是数值型、字符型、日期型或逻辑型表达式,但必须与索引表达式一致。对于字符串表达式,有精确查询和不精确查询之分,精确查询要求表达式的值与索引关键字值完全相同,才认为找到,不精确查询只要表达式的值与索引关键字值左边若干字符相同,就认为找到。查询方式由SET EXACT ON|OFF设置。 该命令只能使记录指针定位于符合条件的第一条记录,可用SKIP命令使指针指向下一个符合条件的记录。 2017/9/9 22:57:30 98
99
除SEEK命令外,FIND命令也可用于索引查询,其格式为: FIND <字符常量>|<数值常量>
例:就学生表,查询1983年9月7日出生的学生的记录。 USE 学生 INDEX ON 出生日期 TAG sy4 D={^ } SEEK D DISP 2017/9/9 22:57:30 99
100
4.4 表的统计与计算 统计记录个数 命令格式是: COUNT [<范围>] [FOR<条件>] [WHILE<条件>] [TO <内存变量>] 该命令统计当前表中,在指定范围内满足指定条件的记录个数。 2017/9/9 22:57:30 100
101
(1)<范围>选择项的缺省值为ALL。使用TO <内存变量>选择项,将统计记录个数的结果存入指定的内存变量中。
命令中各子句的含义是: (1)<范围>选择项的缺省值为ALL。使用TO <内存变量>选择项,将统计记录个数的结果存入指定的内存变量中。 (2)若设置了SET TALK OFF,则不显示统计的结果。若设置了SET DELETED ON命令,则作了删除标记的记录不被计数。 (3)不带任何选项的COUNT命令与RECCOUNT()函数作用相同,都可以获得一个表的记录数。但RECCOUNT()函数忽略DELETED设置,它总是把做了删除标记的记录也计入总数中。要想忽略已删除的记录或只计数那些符合某些条件的记录,就必须使用COUNT命令。 2017/9/9 22:57:30 101
102
求数值表达式之和与平均值 命令格式是: SUM|AVERAGE [<表达式表>] [<范围>] [FOR<条件>] [WHILE<条件>] [TO <内存变量表>|ARRAY <数组> 该命令在当前表中,求指定表达式之和或平均值。 命令中各子句的含义是: (1)两条命令的格式相同,SUM命令求指定表达式之和,而AVERAGE命令求指定表达式的平均值。 (2)<范围>选择项的缺省值为ALL。 (3)<表达式表>中的表达式可以包括字段名,也可以不包括字段名,若省略<表达式表>,则对全部数值型字段求和。计算结果存放在由<内存变量表>指定的内存变量中或<数组>指定的数组元素中。 2017/9/9 22:57:30 102
103
AVER YEAR(DATE())-YEAR(出生日期) TO y ? y
例:对学生表,求全体学生的平均年龄。 操作命令如下: USE 学生 AVER YEAR(DATE())-YEAR(出生日期) TO y ? y 2017/9/9 22:57:30 103
104
财务统计 命令格式是: CALCULATE <表达式表> [<范围>] [FOR<条件>] [WHILE<条件>] [TO <内存变量表>|ARRAY <数组>] 该命令在当前表中,对指定表达式进行财务统计函数计算。 命令中各子句的含义是: (1)若没有选择<范围>、FOR <条件>或WHILE <条件>选项,则统计计算表的全部记录,否则只统计计算指定范围内满足条件的记录。 (2)<表达式表>中的表达式至少应包含一种财务统计函数。Visual FoxPro共提供8种财务统计函数: AVE(<数值表达式>):求数值表达式的平均值。 CNT():统计表中指定范围内满足条件的记录个数。 2017/9/9 22:57:30 104
105
MAX(<表达式>):求表达式的最大值,表达式可以是数值、日期或字符型。
MIN(<表达式>):求表达式的最小值,表达式可以是数值、日期或字符型。 SUM(<数值表达式>):求表达式之和。 NPV(<数值表达式1>,<数值表达式2>[,<数值表达式3>]):求数值表达式的净现值。 STD(<数值表达式>):求数值表达式的标准偏差。 VAR(<数值表达式>):求数值表达式的均方差。 2017/9/9 22:57:30 105
106
例:对学生表,进行如下操作: (1)求入学成绩的均方差。 (2)求最年轻学生的出生日期。 操作命令如下: USE 学生
CALC VAR(入学成绩) TO x1 CALC MAX(出生日期) TO x2 ? x1,x2 2017/9/9 22:57:30 106
107
该命令对当前表的某些数值型字段,按<关键字表达式>进行分类统计,并把统计结果存放在<文件名>指定的表中。
分类汇总 命令格式是: TOTAL ON <关键字表达式> TO <文件名> [FIELDS <数值型字段名表>] [<范围>] [FOR <条件>] [WHILE <条件>] 该命令对当前表的某些数值型字段,按<关键字表达式>进行分类统计,并把统计结果存放在<文件名>指定的表中。 命令中各子句的含义是: (1)FIELDS <数值型字段名表>指出要汇总的字段,如果缺省则对表所有数值型字段汇总。 (2)<范围>缺省值是ALL。 (3)分类汇总是把所有具有相同关键字表达式值的记录合并成一条记录,对数值字段进行求和,对其他字段则取每一类中第一条记录的值。因此,为了进行分类汇总,必须对当前表按<关键字表达式>进行排序或建立索引文件。 (4)如果分类汇总的值超过字段所能容纳的宽度时,则Visual FoxPro系统在这个字段上放入若干个“*”号。为了避免这种情况,可以利用MODIFY STRUCTURE命令增加当前表中该字段的宽度,使其能容纳分类汇总之和。 2017/9/9 22:57:30 107
108
TOTAL ON 籍贯 TO hz FIELDS 入学成绩 USE hz LIST 籍贯,入学成绩
例 对学生表,按籍贯对入学成绩进行汇总。 操作命令如下: USE 学生 INDEX ON 籍贯 TAG sy5 TOTAL ON 籍贯 TO hz FIELDS 入学成绩 USE hz LIST 籍贯,入学成绩 2017/9/9 22:57:30 108
109
4.5 多个表的操作 工作区 1.工作区的概念 工作区是用来保存表及其相关信息的一片内存空间。平时讲打开表实际上就是将它从磁盘调入到内存的某一个工作区。在每个工作区中只能打开一个表文件,但可以同时打开与表相关的其他文件,如索引文件、查询文件等。若在一个工作区中打开一个新的表,则该工作区中原来的表将被关闭。 有了工作区的概念,我们就可以同时打开多个表,但在任何一个时刻用户只能选中一个工作区进行操作。当前正在操作的工作区称为当前工作区。 2017/9/9 22:57:30 109
110
不同工作区可以用其编号或别名来加以区分。 Visual FoxPro提供了2551个工作区,系统以1~2551作为各工作区的编号。
2.工作区号与别名 不同工作区可以用其编号或别名来加以区分。 Visual FoxPro提供了2551个工作区,系统以1~2551作为各工作区的编号。 工作区的别名有两种,一种是系统定义的别名:1~10号工作区的别名分别为字母A~J;另一种是用户定义的别名,用命令“USE <表文件名> ALIAS <别名>”指定。由于一个工作区只能打开一个表,因此可以把表的别名作为工作区的别名。若未用ALIAS子句对表指定别名,则以表的主名作为别名。 2017/9/9 22:57:30 110
111
命令格式是:SELECT <工作区号>|<别名>|0
3.工作区的选择 命令格式是:SELECT <工作区号>|<别名>|0 该命令选择一个工作区为当前工作区,以便打开一个表或把该工作区中已打开的表作为当前表进行操作。 命令中各子句的含义是: (1)工作区的切换不影响各工作区记录指针的位置。每个工作区上打开的表有各自独立的记录指针。通常,当前表记录指针的变化不会影响别的工作区中表记录指针的变化。 (2)SELECT 0表示选择当前没有被使用的最小号工作区为当前工作区。用本命令开辟新的工作区,不用考虑工作区号已用到了多少,使用最为方便。 (3)也可在USE命令中增加IN子句来选择工作区并打开表。例如,在1号工作区打开学生表,并给它取一个别名,可用命令:USE 学生 ALIAS zg IN 1或USE 学生 ALIAS zg IN A 4.工作区的互访 在当前工作区中可以访问其他工作区中的表的数据,但要在非当前表的字段名前加上别名和连接符,引用格式为:别名.字段名或别名->字段名。 2017/9/9 22:57:30 111
112
表的关联 所谓关联,就是当前表记录指针的移动,能引起别的表按某种条件相应地移动记录指针。建立关联后,我们称当前表为主文件,与主文件建立关联的表为子文件。 1.一对一的关联 命令格式是: SET RELATION TO [<关联表达式1>] INTO <工作区号1>|<别名1> [,<关联表达式2> INTO <工作区号2>|<别名2>]…] [ADDITIVE] 该命令使当前表与INTO子句所指定的工作区上的表按表达式建立关联。 2017/9/9 22:57:30 112
113
(1)INTO子句指定子文件所在的工作区,<关联表达式>用于指定关联条件。
命令中各子句的含义是: (1)INTO子句指定子文件所在的工作区,<关联表达式>用于指定关联条件。 ①可以使用索引表达式建立关联。首先在子文件中按某表达式建立索引并指定为主索引,然后使用某关联表达式建立关联,当关联成功后,每当主文件的记录指针移动时,Visual FoxPro就在子文件中查找索引表达式的值和主文件中关联表达式的值相匹配的记录,若找到了,则记录指针指向找到的第一条记录,如没有找到,则记录指针指向文件尾。注意,索引表达式和关联表达式不一定相同,当然大多数情况下是相同的。 ②也可以使用数值表达式建立关联。当主文件的记录指针移动时,子文件的记录指针移至和主文件中数值表达式值相等的记录。 (2)若选择ADDITIVE,则在建立新的关联的同时保持原先的关联,否则会去掉原先的关联。 (3)省略所有选项时,SET RELATION TO命令将取消与当前表的所有关联。 2017/9/9 22:57:30 113
114
2.一对多的关联 前面介绍了一对一的关联,这种关联只允许访问子文件满足关联条件的第一条记录。如果子文件有多条记录和主文件的某条记录相匹配,当需要访问子文件的多条匹配记录时,就需要建立一对多的关联。 命令格式是: SET SKIP TO [<别名1>[,<别名2>…] 命令功能:使当前表和它的子表建立一对多的关联。 命令中各子句的含义是: (1)别名指定子文件所在的工作区。如果缺省所有选项,则取消主文件建立的所有一对多关联。 (2)一个主文件可以和多个子文件分别建立一对多的关联。因为建立一对多关联的表达式仍是建立一对一关联的表达式,所以建立一对多的关联应分两步完成: ①使用命令SET RELATION建立一对一的关联(使用索引方式建立关联)。 ②使用命令SET SKIP建立一对多的关联。 2017/9/9 22:57:30 114
115
表的联接 命令格式是: JOIN WITH <工作区号>|<别名> TO <文件名> [FOR <条件>] [FIELDS <字段名表>] 该命令将当前表与指定工作区的表按指定的条件进行联接,联接产生一个新的表。 命令中各子句的含义是: (1)<工作区号>|<别名>指明被联接的表。<文件名>指定联接后的新库文件名。 (2)FOR<条件>给出了联接的依据。联接时,首先两个工作区的记录指针分别指向联接和被联接表中的第一条记录,然后顺序检索被联接表中的每条记录,看是否满足条件。如果条件满足则在新表中生成一条新记录,当被联接表所有记录扫描完以后,则联接表的记录指针即下移一条记录。重复上述过程依次处理,直至联接表中所有记录均处理完毕。 2017/9/9 22:57:30 115
116
(3)FIELDS <字段名表>指明生成新库文件中包含有哪些字段,省略该选项时新数据库文件中将包含两个表中的所有字段。
由上述过程可以看出,若联接表的一条记录在被联接表中有m条符合条件的记录,便可在新数据文件中生成m条记录。若联接表有n条记录(设条件总是符合),则目的表将有m×n条记录。当m,n值较大时,表联接过程很花时间。如果<条件>很宽,将使很多记录参与联接,并且产生一个庞大的表。因此使用该命令时应避免无实际意义的联接操作。联接中最常用的是等值联接,即联接条件为两个表中公共字段值对应相等。 (3)FIELDS <字段名表>指明生成新库文件中包含有哪些字段,省略该选项时新数据库文件中将包含两个表中的所有字段。 2017/9/9 22:57:30 116
117
课后作业——书面作业 1. 教材P86/8. P86/13.(2)(4)(7)(10)(11)(13)(15)
2017/9/9 22:57:30 117
Similar presentations