1、Visual FoxPro,程序设计,第3章 表的基本操作,31表的建立 32表的显示与更新 33排序与索引 34统计与汇总 35多表操作,3.1表的建立,311建立表结构 312修改表结构 313输入数据,3.1.1建立表结构,1.设计表的结构 (1)字段名字段名是表中每个字段的名字,它必须以汉字、字母或下划线开头,由汉字、字母、数字或下划线组成。自由表中的字段名最多为10个字符,数据库表中的字段名最多为128个字符。当数据库表转化为自由表时截去超长部分的字符。 (2)字段类型字段类型、宽度属性都用来描述字段值。字段类型表示该字段中存放数据(即字段值)的类型。 (3)字段宽度字段宽度用以表明
2、允许字段存储的最大字节数。对于字段宽度不固定的字段,字符型、数值型、浮动型这3种字段在建立表结构时应根据要存储的数据的实际需要设定合适的宽度。其他类型字段的宽度均由系统统一规定,它们是:货币型、日期型、日期时间型、双精度型字段宽度均为8个字节;逻辑型字段宽度为1字节;整型、备注型字段和通用型字段宽度均为4个字节。,(4)小数位数只有数值型与浮动型字段才有小数位数。应注意小数点和正负号在字段宽度中都占一位,例如,职工工资若为4位整数与2位小数,则该字段的宽度应设定7位。由此可知,对于纯小数,其小数位数至少应比字段宽度小1;若字段值都是整数,则应定义小数位数为0。双精度型字段允许输入小数,但不需事
3、先定义小数位数,小数点将在输入数据时键入。 (5)是否允许为空表示是否允许字段接受空值(NULL)。空值是指无确定的值,它与空字符串、数值0等是不同的。例如,表示成绩的字段,空值表示没有确定成绩,0表示0分。一个字段是否允许空值与字段的性质有关,作为关键字的字段是不允许为空值的。,3.1.1建立表结构,3.1.1建立表结构,照片,3.1.1建立表结构,2.建立表的结构 (1)菜单操作方式 “文件”菜单项中的“新建”命令选择“文件”菜单项中的“新建”命令,将出现 “新建” 对话框。在这个话框中用户可以选择所要新建文件的类 型。在这里是建立表文件,所以需要选择“表”文件类 型,然后可以选择“新建文
4、件” 或“向导”按钮去建立新的 文件。,3.1.1建立表结构,(2)命令操作方式格式: CREATE|?,3.1.2修改表结构,1.打开表设计器来修改表结构 (1)菜单方式 表处于打开状态时,“显示”菜单中就会包含表设计器命 令,选定该命令即出现表设计器,这和建立表时的屏幕 画面是一样的,显示出原来的表结构,此时可以根据需 要修改结构。 (2)命令方式 格式:MODIFY STRUCTURE 使用此命令也会打开表设计器,其前提也是表须 先打开。,3.1.3输入数据,1.记录输入窗口 2.备注型字段数据的输入 3.通用型字段数据的输入,3.2表的显示与更新,321表的打开与关闭 322显示记录
5、323记录指针移动 324增加记录 325修改记录 326删除记录 327逻辑表的设置 328表的复制 329查询定位,3.2.1表的打开与关闭,1.表的打开(1)菜单方式选择“文件”菜单下的“打开”命令,出现“打开”对话框。在“打开” 对话框中还有“以只读方式打开”和“独占”两个复选框可供选择。如 果选择“以只读方式打开”复选框,则不允许对表进行修改,如果未 选择“以只读方式打开”则默认的打开方式是读写方式,即可修改。 如果选择“独占”复选框,即不允许其他用户在同一时刻也使用该 表,如果不选择“独占”复选框则允许其他用户在同一时刻也使用该 表,也就是以“共享”方式打开表。默认的打开方式由SE
6、TEXCLUSIVE ON|OFF的设置值确定,系统默认设置为ON。选择“窗口”菜单中的“数据工作期”命令,弹出数据工作期窗口, 在数据工作期窗口中选择“打开”按钮,也会出现 “打开”对话框,3.2.1表的打开与关闭,(2)命令方式 格式:USE(表文件名NOUPDATE EXCLUSIVE | SHAREDALIASIN功能:在选定工作区中打开表,并可以同时给表起别名。命令中各子句的含义是: 表示被打开的表的名字,其中NOUPDATE指定以只读方式打开表,EXCLUSIVE指定以独占方式打开表, SHARED指定以共享方式打开表。 表打开时,若该表有备注型或通用型字段,则自动打开同名的FPT
7、文件。如备注文件丢失,则表打不开。,3.2.1表的打开与关闭,2表的关闭 (1)菜单方式 选择“窗口”菜单中的“数据工作期”命令,弹出数据工作期窗口,在 数据工作期窗口中选择“关闭”按钮关闭表。 (2)命令方式 在命令窗口中使用不带文件名的USE命令,可关闭当前工作区中打开的表。 CLEAR ALL:关闭所有的表,并选择工作区1。从内存释放所有内存变量及用户定义的菜单和窗口,但不释放系统变量。 CLOSE ALL:关闭所有打开的数据库与表,并选择工作区1。关闭表单设计器,查询设计器,报表设计器,项目管理器。 CLOSE DATABASEALL:关闭当前数据库及其中表,若无打开的数据库,则关闭所
8、有自由表,并选择工作区1。带有ALL则关闭所有打开的数据库及其中的表和所有打开的自由表。 CLOSE TABLESALL:关闭当前数据库中所有的表,但不关闭数据库。若无打开的数据库,则关闭所有自由表。带有ALL则关闭所有数据库中的表和所有自由表,但不关闭数据库。,3.2.2表的显示,1.表结构的显示(1)菜单方式 表文件打开后,选择“显示”菜单中的“表设计器”(2)命令方式 格式:LIST| DISPLAY STRUCTURETO PRINTERPROMPT|TO FILE功能:显示当前表的结构。除显示各字段的名称、类型、宽度和小数位数还包括文件更新日期、记录个 数、记录长度。LIST和DIS
9、PLAY两个命令的作用基本相同,区别仅在于LIST是 连续显示,当显示的内容超过一屏时,自动向上滚动,直到显示完成为止。 DISPLAY则是分屏显示,显示满一屏时暂停,待用户按任意键后继续显示后面 的内容。命令中各子句的含义是: 若选择TO PRINTER子句,则一边显示一边打印。若包括PROMPT命令,则 在打印前显示一个对话框,用于设置打印机,包括打印份数、打印的页码等。 若选择TO FILE,则在显示的同时将表结构输出到指定的文本文件 中。,3.2.2表的显示,2.表记录的显示 (1)菜单方式选择“显示”菜单中的“浏览”命令。即可打开浏览窗口。浏览窗口显示表记录的格式分为编辑和浏览两种,
10、编 辑状态一个字段占一行,记录按字段竖直排列;浏览状 态时一个记录占一行。,3.2.2表的显示,(2)命令方式 格式: LIST|DISPLAYFIELDS|WHILE(条件 TO PRINTERPROMPT|TO FILEOFF功能:显示当前表中的记录或指定的表达式的值。命令中各子句的含义是: FIELDS指定要显示的表达式。表达式可直接使用字段名,也可以是含有 字段名的表达式,甚至是不含字段名的任何表达式。如果省略FIELDS命令,则显示表中 所有字段的值,但不显示备注型和通用型字段的容,除非备注型和通用型字段明确地包 括在表达式表中。 若选定FOR子句,则显示满足所给条件的所有记录。若选
11、定WHILE子句,显示到条件 不成立时为止,这时后面即使还有满足条件的记录也不再显示。FOR子句和WHILE子可 以同时使用,同时使用时WHILE子句优先。 、FOR、WHILE用于决定对哪些记录进行操作。如果有FOR子 句,缺省的范围为ALL,有WHILE子句,缺省的范围为REST。 如果FOR子句或 WHILE子句以及范围全省略,对于LIST默认显示所有记录,对于DISPLAY则默认显示 当前记录。即LIST命令相当于DISPLAY ALL命令。此外,对于DISPLAY命令是分屏输 出,对LIST是连续输出。 选用OFF时,表示只显示记录内容而不显示记录号,若省略该项则同时显示记录和记 录
12、内容。,3.2.2表的显示,例题3.3 就XS表,写出进行如下操作的命令。 (1)显示表的全部记录 (2)显示前5条记录; (3)显示记录号为奇数的记录; (4)显示临床医学男学生的记录; (5)显示北京或黑龙江学生的姓名、性别、年龄以及简历。 (6)显示学号最后两位为01的学生的记录,3.2.2表的显示,操作1: USE XS DISP ALL操作2: USE XS LIST NEXT 5操作3: LIST FOR MOD(RECNO(),2)=1或 LIST FOR RECNO()/2 INT(RECNO()/2)或 LIST FOR RECNO()%2=1操作4: LIST FOR专业=
13、“临床医学“ AND 性别=“男“ 操作5: LIST姓名,性别,YEAR(DATE()-YEAR (出生日期),简历 FOR 籍贯=“北京“ ; OR 籍贯=“黑龙江“操作6: DISP ALL FOR RIGHT(学号,2)=“01“,3.2.3表记录指针的移动,1.绝对定位 格式:GOTO|TOP|BOTTOM命令中各子句的含义是:(1)“GO TOP”将记录指针指向表的首记录。(2)“GO BOTTOM”将记录指针指向表的尾记录。(3)“GO”将记录指针指向表的某记录,指出该记录的记录号。命令中记录号的取值范围是1至当前表 中的最大记录个数,即函数ECCOUNT()的值,否则出错。,3
14、.2.3表记录指针的移动,例题3.4 记录定位USE XS &当前记录为第1个记录?RECNO() &显示:1GO BOTTOM &记录指针指向第10个记录,当 前记录为第10个记录?RECNO() &显示:10GO 4 &当前记录为第4个记录?RECNO() &显示:4USE,3.2.3表记录指针的移动,2相对定位 格式:SKIP从当前记录开始移动记录指针,表示移位记录 的个数。如果的值为正数,则记录指针往表尾方向 移动,若为负数,则往表头方向移动。若省略此项,则记录指针 移到下一个记录。如果记录指针指向末记录而执行SKIP ,则 ECNO()返回一个比表记录数大1的数,且EOF()返回T。
15、如果 记录指针指向首记录后再执行 SKIP -1,则RECNO()返回1,且 BOF()返回T。利用BOF()和EOF()这两个函数可以掌握有关记 录指针移动的情况。当BOF()和EOF()这两个函数的值已经T时, 如仍向各自相同方向再移动记录指针,就会出现相应的已到文件 头和已到文件尾的越界提示信息。,3.2.3表记录指针的移动,例题3.5 记录定位USE XS?RECNO(),BOF() &显示:1FSKIP -1 &记录指针向文件头移位1个记录?BOF(),RECNO() &显示:T1(应注意,记录号仍为1) SKIP 9 &记录指针从第1个记录开始向文件尾移位9个记录?RECNO(),
16、EOF() &显示:10FSKIP?RECNO(),EOF() &显示:11T,3.2.4增加记录,1.插入记录格式:INSERT BLANK BEFORE功能:该命令在当前表的指定位置上插入一个新记录。若给出BLANK选项,则插入一条空白记录;若不给出此项, 则进入全屏幕数据记录输入窗口。若给出BEFORE选项,则在当 前记录之前插入一个新记录,则插入的新记录成为当前记录,而 原来的当前记录及其后面记录记录号均加1;若不给出该选项,则 在当前记录的后面插入一个新记录。,3.2.4增加记录,例题3.6 对XS表增加6号和7号记录。USE XSGO 6INSERT BEFORE &此时新增加的6
17、号记录变成当前记录INSERT &在6号记录之后插入一条新记录,即第7号记录,3.2.4增加记录,2.追加记录 (1)追加单条记录 格式:APPEND EBLANK功能:该命令在当前表的末尾追加一个新记录。若选用BLANK选项,则追加一个空记录到表的末尾。 APPEND命令是在当前表的末尾增加新记录,而INSERT命令可以 在指定位置上增加新记录。两条命令的屏幕操作方式是相同的。,3.2.4增加记录,例题3.7 在XS表末记录后增加一个记录。USE XSAPPEND显然,APPEND命令与下面两条命令等价:GO BOTTOMINSERT,3.2.4增加记录,(2)追加成批记录格式:APPEND
18、 FROMFIELDSFORTYPEDELIMITEDWITH| WITH BLANK | WITH TAB|SDF|XLS功能:该命令将指定文件(源文件)中的数据添加到当前表的尾部。命令中各子句的含义是: 源文件的类型可以是表,也可以是系统数据格式、定界格式等文本文件,或 Microsoft Excel文件。不含TYPE子句时,源文件的类型是表。若源文件是Excel文件,TYPE子句中必须取XLS。若源文件是文本文件,TYPE子句中必须取SDF或DELIMITED。 若给出FIELDS选项,则数据只添加到在中说明的字段。 FOR或WHILE是对源文件记录的限制。 要注意源文件中的数据与当前表
19、字段类型、顺序和长度要匹配。否则追加没有意义。 执行该命令时源文件不需打开。,3.2.5修改记录,1.浏览窗口的操作2.全屏幕编辑修改命令 对记录进行全屏幕编辑修改的命令有BROWSE、EDIT和CHANGE,这里重点介绍和上面浏览窗口对应的BROWSE命令。格式:BROWSEFIELDSFORFREEZELASTNOAPPENDNODELETENOEDITPARTITIONLEDITREDITLPARTTTIONLOCKNOLGRIDNORGRIDNOLINKNOWAITTIMEOUTTITLE 功能:该命令打开浏览窗口,浏览或修改当前表的记录数据。,3.2.5修改记录,3成批替换修改 格式
20、:REPLACEWITHADDITIVEWITHADDITIVE,FORWHILE功能:该命令用一个表达式的值替换当前表中一个字段的值。命令中各子句的含义是:(1)若不选择和FOR子句或WHILE子句,则默认为替换当 前记录。如果选择子句,则默认为ALL,选择了WHILE子 句,则默认为REST。(2)ADDITIVE只能在替换备注型字段时使用。使用ADDITIVE, 备注型字段的容将附加到备注型字段原来内容的后面,否则用表达 式的值改写原备注型字段的内容。,3.2.5修改记录,例题3.9 写出对学生表进行如下操作的命令: (1)将不是代培学生的入学成绩增加20分; (2)将6号记录的出生日期
21、修改为1990年9月7日。 (3)将第一条记录的备注字段增加“三好学生”内容。 操作1: USE XS REPLACE入学成绩WITH入学成绩+20 FOR 代培否 操作2: GO 6 REPLACE出生日期 WITH 1990-09-07 操作3 USE XS REPLACE 备注 WITH 三好学生ADDITIVE,3.2.6删除记录,1.记录的逻辑删除 格式:DELETEFORWHILE功能:对当前表在指定内满足的记录加上删除标记。 若可选项都缺省,则只对当前记录加删除标记。加了删除标记的记 录是否参加下面的操作,可以通过SET DELETED ON|OFF命令来设 置。ON状态不参加下
22、面的操作,OFF状态则参加下面的操作。默认 状态为OFF状态。当然也有的操作不受此命令的控制。,3.2.6删除记录,例题3.10: USE XS DELELE FOR 性别=“女 LIST SET DELETED ON LIST,3.2.6删除记录,2.记录的恢复 格式:RECALLFORWHILE 功能:对当前表在指定内满足的记录去掉删除标记。 若可选项都缺省,只恢复当前记录。 例题3.11:USE XSDELETE FOR入学成绩=600LIST &带有 *号的记录即为已逻辑删除的记录.GO 4 RECALL &去掉4号记录的删除标记。LIST &第4条记录左侧的删除标记*号已去掉。,3.
23、2.6删除记录,3.记录的物理删除格式: PACK功能:从物理上删除,也即真正删除带有删除标记的记录。例题3.12删除XS表中第5至第10条之间的记录。USE XSGo 5DELETE NEXT 6PACKLIST,3.2.6删除记录,4.记录清除命令格式:ZAP功能:物理删除当前表中的所有记录,只留下表结构。 执行ZAP相当于执行DELETE ALL和PACK两条命令。,3.2.7表的复制,1.复制表的结构 格式:COPY STRUCTURE TO FIELDS 功能:该命令将当前表的结构复制到指定的表中。仅复制当前表 的结构,不复制其记录数据。命令中各子句的含义是:(1)是复制后产生的表名
24、,复制后只有结构而无任何 记录。(2)若给出了FIELDS选项,则生成的空表文件中只 含有中给出的字段,若省略此项,则复制的空表文件 的结构和当前表相同。,3.2.7表的复制,例题3.13: USE XS COPY STRU TO XJ2 FIELDS学号,姓名,入学成绩,备注 USE XJ2 BROWSE,3.2.7表的复制,2.复制表格式: COPY TOFIELDSFORWHILE TYPESDF | DELIMITED | XLSWITH|BLANK 功能:该命令将当前表中的数据与结构同时复制到指定的表中,即复 制了一个新的表。此命令还可以将当前表复制生成一个其他格式 的数据文件。 命
25、令中各子句的含义是:(1)表示复制后产生的新的文件名。(2)若选择了FIELDS,则将中给出的部 分字段的数据复制到指定的文件中,省略此项,则等价于当前表 的全部字段。字段名表中还可包含有其他工作区表的字段。,3.2.7表的复制,(3)和FOR、WHILE决定了对哪些记录进 行复制。省略这些子句时,则复制当前表的所有记录。(4)复制含有备注型字段的表时,如果指定要复制该备注型字 段,则在复制表的同时,复制相应的备注文件。(5)若选择了SDF或DELIMITED,则将当前表复制成指定的文本 文件,默认扩展名为.TXT。其格式由SDF和DELIMITED决定。SDF为标准格式,记录定长,不用分隔符
26、和定界符,每个记 录均从头开始存放,均以车符结束。DELIMITED为通用格式,记录不等长,每个记录均以回车符 结束。若选用BLANK,字段值之间用一个空格分隔,否则用一个 逗号分隔。若选用,字符型数据用指定的括起 来,否则用双引号括起来。(6)若选择了XLS,则得到一个Excel文件,该文件只能在Excel中 打开。,3.2.7表的复制,例题3.14 对XS表进行复制操作。(1)将入学成绩大于600分的记录复制到XS2.DBF中;(2)分别生成标准格式和通用格式的文本文件NEWl.TXT和 NEW2.TXT。操作1:USE XSCOPY TO XS2 FOR入学成绩600USE XS2 &打
27、开并查看新表的记录LIST操作2:USE XSCOPY TO NEW1 SDFTYPE NEW1.TXT &查看新文本文件的内容COPY TO NEW2 DELIMITEDTYPE NEW2.TXT,3.2.7表的复制,3.复制任何类型文件 格式:COPY FILE TO 功能:从文件复制得文件。 命令中各子句的含义是:(1)若对表进行复制,该表必须处于关闭状态。(2)和都可使用通配符“*”和“?”。例题3.15USE &若XS.DBF是打开的,则须关闭它COPY FILE XS.DBF TO XS3.DBF &复制得XS3DBFCOPY FILE XS.FPT TO XS3.FPT &复制得
28、xjlFPT,3.2.8查询定位,顺序查询的命令格式是:LOCATEFOR|WHILE 功能:搜索满足的第一个记录。若找到,记录指针就指向该 记录;若表中无此记录,搜索后VFP主屏幕的状态栏中将显示“已 到定位范围末尾”,表示记录指针指向文件结束处。 如果指定,则按指定时默认为ALL。找到, 记录指针指向该记录,函数FOUND()值为T,否则,记录指针 指向的最末一个记录上,省略则指向文件尾,函数 FOUND()值为F。查到记录后,要继续往下查找满足的 记录必须用CONTINUE命令。,3.2.8查询定位,例题3.16在XS表中查询不是代培男生的姓名、入学成 绩和年龄。USE XSLOCAT
29、FOR !代培否AND性别=“男DISP姓名,入学成绩,YEAR(DATE()-YEAR(出生日期)CONTINUE?RECNO(),姓名,入学成绩,YEAR(DATE()-YEAR(出生 日期),3.3排序与索引,3.3.1排序 3.3.2索引建立 3.3.3索引文件使用,3.3.1排序,格式: SORT TO ON ADC,AD CFIELDSFORWHILE 功能:该命令对当前表中的记录按指定的字段排序,并将排序后的 记录输出到一个新的表中。 命令中各子句的含义是:(1)是排序后产生的新表文件名,其扩展名默认 为.DBF。(2)由的值决定新表中记录的排列顺序,缺省时,按 升序排列,不能按
30、备注型或通用型字段排序。 可以按多个字段排 序。为首要排序字段,的值相等的记录再按进一步排序,依此类推。,3.3.1排序,(3)对于在排序中使用的每个字段,可以指定升序或降序的排 列顺序。A表示升序,D表示降序。 缺省时,字符型字段中的 字母大小写是不同的。如果在字符型字段后加上C,则忽略大小 写。可以把C与A或D选项结合在一起使用,例如,AC或 DC。(4)由FIELDS指定新表中包含的字段名。如果省略FIELDS子 句,当前表中的所有段都包含在新表中。(5)各种类型的字段名(备注型和通用型字段除外)都可用作 排序关键字。命令执行时,根据各种类型数据的比较原则实现排 序。(6)若省略、FOR
31、和WHILE等选项,表示 对所有记录排序。,3.3.1排序,例题3.17对XS.DBF分别按以下要求排序 (1)显示入学成绩最高的5名学生的记录。 (2)将代培学生按专业降序排序,当专业相同时则按出生日期升序 排序。 操作1:USE XSSORT ON入学成绩D TO XS4USE XS4 &打开排序后生成的新表文件LIST NEXT 5 操作2:USE XSSORT ON 专业/D,出生日期 TO XS5USE XS5LIST,3.3.2索引建立,1.索引的概念2.索引文件的类型,3.3.2索引建立,3.索引的类型在Visual FoxPro中,索引可分为下列4种类型:,3.3.2索引建立,
32、四.建立索引文件1命令方式格式: (1)单索引文件INDEX ON TOCOMPACT ADDITIVE FOR TAG FOR TAG OF FOR ASCENDING|DESCENDING UNIQUE ADDITIVE,3.3.2索引建立,功能:该命令对当前表建立一个索引文件或增加索引标志。命令中各子句的含义是:是包含当前表中的字段名的表达式,表达式中 的操作数应具有相同的数据类型。若选择FOR选项,则只有那些满足条件的记录才出现 在索引文件中。选用COMPACT,则建立一个压缩的单索引文件。复合索引 文件自动采用压缩方式。复合索引时,系统默认或选用ASCENDING,按索引表达式的 升
33、序建立索引;选择DESCENDING按降序建立索引。单索引文件 只能按升序索引。选用UNIQUE,对于索引表达式值相同的记录,只有第一个 记录列入索引文件。选用ADDITIVE,建立本索引文件时,以前打开的索引文件仍保持打开状态。,3.3.2索引建立,例题3.18用建立索引的方法实现上例中的第一个操作。 显示入学成绩最高的5名学生的记录。USE XSINDEX ON -入学成绩TO RXCJLIST NEXT 5,3.3.2索引建立,例题3.19就XS表建立结构复合索引文件,其中包含2个索引: (1)按出生日期的升序排列,不允许有出生日期相同的记录。 (2)先按性别升序,性别相同再按入学成绩降
34、序排列。 操作1:USE XSINDEX ON 出生日期TAG CSRQ UNIQUE 操作2:USE XSINDEX ON性别+STR(1000-入学成绩)TAG XBRXCJ,3.3.2索引建立,2菜单方式也可以在表设计器中建立索引。打开表设计器窗口, 选择“索引”选项卡。注意:用表设计器建立的索引都是结构复合索引文件,3.3.3索引文件的使用,1.打开索引文件索引文件必须先打开才能使用。结构复合索引文件随相关表的打开而自动 打开,但单索引文件和非结构复合索引文件必须由用户自己打开。 (1)表和索引文件同时打开格式:USEINDEX功能:该命令打开指定的表及中的索引文件。可以包含多个索引文
35、件,这些索引文件可以是单索引文件, 也可以是非结构复合索引文件。(2)打开表后再打开索引文件格式:SET INDEX TOADDITIVE功能:该命令为当前表打开中的索引文件。命令中各子句的含义是:省略任何选项而直接使用SET INDEX TO,将关闭当前工作区中除结构复 合索引文件之外的全部索引文件。若省略ADDITIVE选项,则在使用该命令打开中的索引文 件时,除结构复合索引文件之外其它已打开的索引文件均会被关闭。,3.3.3索引文件的使用,2.关闭索引文件格式一: CLOSE INDEX格式二: SET INDEX TO 关闭当前工作区内所有打开的索引文件,但结构复 合索引文件不关闭。注
36、意:表关闭时索引文件就随之关闭(包括结构复合 索引文件)。,3.3.3索引文件的使用,3.确定主控索引一个表可能有多个索引文件被打开,但在一个时刻只有一个索引起控制作 用,这就是主控索引文件。对于新建立的索引文件,它是当然的主控索引。打 开索引文件时,排在索引文件表中第一位的是主控索引文件,如果主控索引文 件是单索引文件,那么它所包含的索引就成为主控索引,如果主控索引文件是 复合索引文件,还得进一步确定哪个索引标志是主控索引。有时因为当前主控 索引不合适,需要更换主控索引。格式:SET ORDER TO|TAGOF功能:该命令指定表的主控索引文件或主控索引标志。命令中各子句的含义是:(1)表示
37、已打开的索引文件的序号,用以指定主控索引。单 索引文件首先按打开的先后顺序标识序号,结构复合索引文件的索引标志按其 生成的顺序计数,最后是非结构复合索引文件的索引标志按其生成的顺序计数。(2)最好使用指定一个单索引文件为主控索引文件,这样做比 用索引文件顺序号更直观。(3)TAGOF用于指定一个已打开的复合索 引文件中的一个索引标志为主控索引。(4)不带任何短语的SET ORDER TO命令可以取消主控索引。,3.3.3索引文件的使用,例题3.20例3.18和例3.19已就XS表建立了有关单索引文 件和结构复合索引文件,现要使用这些索引文件对XS表 进行浏览操作。 USE XS INDEX R
38、XCJ &RXCJ.IDX为主控索引文件 BROWSE SET 0RDER TO CSRQ &索引标志CSRQ为主控索引 BROWSE SET ORDER T0 &取消主控索引,按物理顺序显示 BROWSE,3.3.3索引文件的使用,使用索引文件后,虽然表中各记录的物理顺序并未改变,但 记录指针不再按物理顺序移动,而是按主控索引文件中记录的逻 辑顺序移动,于是整个表中的记录是按索引关键表达式值排序。使用索引文件时,还要特别注意以下几点:(1)在使用GO命令时,GO使记录指针指向具体的 物理记录号,而与索引无关,而GO TOP| BOTTOM将使记录指针 指向逻辑首或逻辑尾记录,这时GO TOP
39、不再等同于GO 1。(2)SKIP命令按逻辑顺序移动记录指针。(3)表被打开后,记录指针位于TOP位置,而不一定指向记录号 为1的记录。,3.3.3索引文件的使用,例题3.21 当有索引文件时,分析记录指针的移动规律。USE XSINDEX ON -入学成绩 TAG RXCJ1GO TOP?RECNO(),姓名 GO 1?RECNO(),姓名 SKIP?RECNO(),姓名 GO BOTTOM?RECNO(),姓名,3.3.3索引文件的使用,四.删除索引1.删除索引文件若用删除文件命令来删除索引文件,须遵循先关闭后删除的原 则,这与删除表类似。2.删除索引标识格式:DELETE TAG ALL
40、|功能:删除打开的结构复合索引文件的索引标识。 命令用于删除打开的复合索引文件的所有索引标志或指定的索引 标志。如果一个复合索引文件的所有索引标志都被删除,则该复 合索引文件也就自动被删除了。 例题3.22 删除例3.19建立的结构复合索引文件中的索引标识 CSRQUSE XSDELETE TAG CSRQ,3.3.3索引文件的使用,五.索引的更新1自动更新当表中的数据发生变化时(例如对它进行插入、删除、添加或 更新操作之后),所有当时打开的索引文件都会随数据的改变自动 改变记录的逻辑顺序,实现索引文件的自动更新。 2重新索引若未确定主控索引文件或主控索引,修改表的记录时索引文 件就不会自动更
41、新。如果仍要维持记录的逻辑顺序,可用EINDEX 命令重建索引。格式:REINDEX COMPACT当然也可用INDEX ON命令再次建立索引。两者效果相同。,3.3.3索引文件的使用,六.索引查询命令SEEK和FIND两条命令均可用来进行索引查询。FIND 是为了与旧版本兼容而保留的, SEEK的用法更灵活。格式:SEEK FIND 功能:在已确定主控索引的表中按索引关键字搜索满足值的第一个记录。若找到,记录指针就指向该记 录;找不到该记录则在主屏幕的状态条中显示“没有找到”说明:FIND命令中的常量只能是字符常量和数值常量。,3.3.3索引文件的使用,SEEK命令只能使记录指针定位于符合条
42、件的 第一条记录,可用SKIP命令使指针指向下一个符 合条件的记录。,3.4统计与汇总,341统计记录个数 342纵向求和与求平均值 343统计函数的计算 344分类求和,3.4.1统计记录个数,命令格式是:COUNTFORWHILETO功能: 该命令统计当前表中,在指定范围内满足指定条件的记录个数。命令中各子句的含义是:(1)选择项的缺省值为ALL。使用TO选择项, 将统计记录个数的结果存入指定的内存变量中。(2)若设置了SET TALK OFF,则不显示统计的结果。若设置了 SET DElETED ON命令,则做了删除标记的记录不被计数。(3)不带任何选项的COUNT命令与RECCOUNT
43、()函数作用相同, 都可以获得一个表的记录数。但RECCOUNT()函数忽略DELETED 设置,它总是把做了删除标记的记录也计入总数中。要想忽略已 删除的记录或只计数那些符合某些条件的记录,就必须使用 COUNT命令。,3.4.1统计记录个数,例题3.25对XS表,分别统计男女生的人数。 USE XS COUNT FOR性别=女TO Xl COUNT FOR性别=男TO X2 ? X1,X2,3.4.2纵向求和与求平均值,格式:SUM|AVERAGEFOR WHILE TO| ARRAY 功能: 该命令在当前表中,求指定表达式之和或平均值。 命令中各子句的含义是:(1)两条命令的格式相同,S
44、UM命令求指定表达式之和,而 AVERAGE命令求指定表达式的平均值。(2)选择项的缺省值为ALL。(3)中的表达式可以包括字段名,也可以不包括字段 名,若省略,则对全部数值型字段求和或求平均值。 计算结果存放在由指定的内存变量中或指定 的数组元素中。这里需要注意的是给出的内存变量个数一定要与 要进行计算的值的个数一致。,3.4.2纵向求和与求平均值,例题3.26对XS表,求全体学生的平均年龄。USE XSAVER YEAR(DATE()-YEAR(出生日期) TO X1?X1,3.4.3统计函数的计算,格式: CALCULATEFORWHILE(条件TOARRAY 功能: 该命令在当前表中,
45、对指定表达式进行统计函数计算。 命令中各子句的含义是:(1)若没有选择、FOR或WHIIE选项,则统计计算表的全 部记录,否则只统计计算指定范围内满足条件的记录。(2)中的表达式至少应包含一种统计函数。Visual FoxPro共提供如 下8种统计函数:AVG():求数值表达式的平均值。CNT():统计表中指定范围内满足条件的记录个数。MAX():求表达式的最大值,表达式可以是数值、日期或字符型。MIN(表达式):求表达式的最小值,表达式可以是数值、日期或字符型。SUM():求表达式之和。NPV(,,):求数值表达式的净现值。STD():求数值表达式的标准偏差。VAR():求数值表达式的均方差
46、。,3.4.3统计函数的计算,例题3.27对XS表,进行如下操作:(1)求入学成绩的均方差。(2)求最年轻学生的出生日期。 USE XS CALC VAR(入学成绩) TO X2 CALC MAX(出生日期) TO X3由此可见,使用COUNT、SUM和AVERAGE命令 时,每个命令只能完成一种功能,而CALCULATE命令 则具有多种功能,可以代替计数、求和、求平均值等命 令,而且还能完成其他功能。,3.4.4分类汇总,格式: TOTAL ONTOFIELDSFORWHILE功能: 该命令对当前表的某些数值型字段,按进行分类 统计,并把统计结果存放在指定的表中。 命令中各子句的含义是:(1
47、)FIELDS指出要汇总的字段,如果缺省则对 表所有数值型字段汇总。(2)缺省值是ALI。(3)分类汇总是把所有具有相同关键字表达式值的记录合并成一 条记录,对数值字段进行求和,对其他字段则取每一类中第一条 记录的值。因此,为了进行分类汇总,必须对当前表按进行排序或建立索引文件。由此也可以知道分类汇总后结果 表中所具有记录的个数就是按某关键字表达式分类的种类数。,3.4.4分类汇总,例题3.28 对XS表,按专业对入学成绩进行汇总。USE XSINDEX ON 专业 TAG ZYTOTAL ON 专业 TO XS5 FIELDS 入学成绩USE XS5LIST,3.5多表操作,351多工作区概
48、念 352工作区的选择 353表的连接 354表的关联,3.5.1多工作区概念,工作区:是用来保存表及其相关信息的一片内存空间。Visual Foxpro提供了32767个工作区。平时所说的打开表实际上就是将它从磁盘调入到内存的某一个工作区。 当前工作区:有了工作区的概念,就可以同时打开多个表,但在任何一个时刻用户只能选中一个工作区进行操作。当前正在操作的工作区称为当前工作区。 工作区的表示可以有两种方式:工作区号和别名。别名又分为系统别名和用户别名。,3.5.1多工作区概念,1.工作区号Visual Foxpro提供的32767个工作区,系统以132 767作为各工 作区的编号。 在每个工作
49、区中只能打开一个表文件,但可以同时打开与表相关 的其他文件,如索引文件、查询文件等。若在一个工作区中打开 一个新的表,则该工作区中原来的表将被关闭。反之,一个表只 能在一个工作区打开,在其末关闭时若试图在其它工作区打开 它, VFP会显示信息框提示出错信息“文件正在使用”。 2.别名 前10个工作区除使用110为编号外,还可依次用AJ这十个 字母来表示,即为系统给工作区起的别名。 其实表也有别名,并可用命令“USEALIAS”来 指定。例如命令“USE XS ALIAS XXSS”即指定XXSS为XS.DBF的 别名。若未对表指定别名,则表的主名将被默认为别名,例如命 令“USE XS”表示XS.DBF的别名也是XS。为什么表的别名可以代 表工作区的别名呢,因为一个工作区同时只能打开一个表,所以 这个表就能代表这个工作区。,