您的位置: 网站首页 > 程序开发 > Visaul FoxPro程序设计 > 第2章 数据表的基本操作 > 【2.2 数据表的基本操作】

2.2 数据表的基本操作

 

2.2  数据表的基本操作

当信息以表格形式存放时,数据才能被有效地利用。在Visual FoxPro 6.0中,表是处理数据和创建关系型数据库及应用程序的基本单元,用户可以处理当前存储在表中的信息,定制已有的表或者创建自己的表来存储数据,还可以使用索引对数据进行排序及处理。

2.2.1  表的打开与关闭

1.表和工作区

当一个数据库被打开的时候,它里面的数据库表可以分别分配一个工作区。

注意:工作区实际上是一些内存赋以序号132767的标识,对应的字符是AJW11W32767,超过了字符的工作区只能用数字表示。

同时,虽然利用工作区可以存入多个表,但处于活动状态(即允许使用操作)的表始终只有一个。使用SELECT命令就可以选择工作区,以便打开里面的表,如下所示:

SELECT 7    &&选择工作区7

SELECT F    &&选择工作区F

SELECT ab   &&选择别名为ab的工作区

2.表的打开

表的打开可以通过菜单方式,也可以通过命令方式来进行。

1)菜单方式。选择“文件”“打开”命令,在“打开”对话框中选择文件类型为“表*.dbf”,并在指定位置下选择需要打开的表,然后单击“确定”按钮即可。

2)命令方式。在“命令”窗口中使用“USE”命令也可以打开表,其格式为:

USE[表别名|][IN 工作区]

注意:USE命令除了可以打开*.dbf文件外,还可以打开索引文件*.idx

3.表的关闭

当表已经打开后,可以使用USE命令或CLOSE命令将其关闭。其中,CLOSE命令是将指定的有关文件从内存中移去(包括数据表),格式如下:

CLOSE [ALL|TABLES[ALL]]

2.2.2  表记录的录入

当表结构已经建立完后,即可向表中录入记录。

1.立即输入方式

最开始建立表结构时,在“表设计器”窗口中设置相应的结构,然后单击“确定”按钮,此时系统将弹出“现在输入数据记录吗?”对话框,提示是否直接进入数据输入状态。若选“是”,则进入编辑窗口,并输入相应的数据记录,如图2-12所示,输入完后单击窗口右上角的“关闭”按钮 退出,系统自动存盘。

2.追加方式

若设计好表的结构后并没有及时输入数据,则可以用追加方式添加表记录。

选择“文件”“打开”命令(或在“命令”窗口中输入:USE 表文件名),打开所需要的表文件,然后选择“显示”“浏览”命令,再选择“显示”“追加方式”命令,使数据处理追加记录状态,在浏览窗口后面自动追加一条空白记录,如图2-13所示。

           

2-12  记录的编辑窗口                            2-13  追加记录

3APPEND命令方式

APPEND命令格式为:

APPEND [BLANK] [IN 工作区表别名]

APPEND命令通常有以下两种用法。

·    APPEND向表的末尾加一条空记录并打开编辑窗口,可以在其中输入一个或多个新记录。增加新记录后,Visual FoxPro 将自动修改打开的所有索引。

·    APPEND BLANK向表的末尾加入一条空记录,但Visual FoxPro并不打开编辑窗口。

用户可以用EIDTCHANGEBROWSE命令以窗口的方式向新记录填写内容,或者用REPLACE命令输入内容。

注意:当执行APPENDAPPEND BLANK命令,并且没有在当前选定工作区中打开表时,将显示一个“打开”对话框,可以在其对话框中选择需要添加记录的表。

4INSERT命令方式

INSERT命令的格式为:

INSERT [BLANK] [BEFORE]

它是指在表的指定位置上插入一条新的记录。选用BEFORE选项时,表示在当前记录前插入,否则在当前记录后插入;当选用BLANK选项时,将弹出如图2-12所示的记录编辑窗口,由用户录入插入记录的具体内容。

5.录入数据的注意事项

在录入表记录时,应注意以下几点。

1)当录入的内容满一字段时,光标会自动跳到下一字段;内容不够一字段但已完成该数据的录入时,可用Tab键或Enter键将光标移到下一字段;还可以用鼠标单击其中的任一字段。

2)当要编辑备注型(memo)字段时,双击备注字段的memo字样,或将光标移到memo字样处按Ctrl+Home组合键就可进入memo字段的编辑窗口进行编辑,如图2-14所示。当编辑完成后,按Ctrl+W组合键就可以保存并退出memo字段的编辑窗口,此时表中的备注字段的“memo”字样变为“Memo”,表示该字段已有具体内容。

2-14  编辑备注字段

3)当要编辑通用(gen)字段时,双击通用字段的gen字样,或将光标移到gen字样处按Ctrl+End组合键就可进入gen字段的编辑窗口进行编辑,如图2-15所示。当编辑完成后,按Ctrl+W组合键就可以保存并退出gen字段的编辑窗口,此时表中的备注字段的“gen”字样变为“Gen”,表示该字段已有具体内容。

2-15  编辑通用字段

注意:在编辑通用字段的数据时,可以通过剪贴板粘贴,也可通过单击菜单“编辑”“插入对象”命令的方法来插入各种OLE对象,其“插入对象”对话框如图2-16所示。

2-16  “插入对象”对话框

2.2.3  表记录的浏览和修改

当用户创建好一张表后,有时需要对表中的记录进行浏览和编辑,主要是在浏览窗口和编辑窗口中进行。

1.用菜单方式浏览与修改

首先打开需要浏览的表,然后选择“显示”“浏览”命令,弹出如图2-17所示的浏览窗口,用户可以对其记录进行查看和修改。

2-17  学生档案表的浏览窗口

如果要用编辑窗口修改记录,可以选择“显示”“编辑”命令,则把原来的浏览方式切换到如图2-18所示的编辑方式,而且在下一次用这种方法来查看和修改记录时,打开的窗口就变成可编辑窗口,除非再将它切换回浏览方式。

2-18  学生档案表的编辑窗口

2.用命令方式浏览与修改

Visual Foxpro中,用户可以通过下面的命令方式来浏览或修改表记录。

1EDIT/CHANGE命令。

格式:EDIT/CHANGE  [<范围>][FOR<条件>][WHILE<条件>][FIELDS<字段表>]

功能:弹出编辑窗口,以编辑方式对记录进行浏览与修改。

2BROWSE命令。

格式:BROWSE [FIELDS<字段表>][LOCK<expN>][FREEZE<字段名>]

               [NOAPPEND][NOMODIFY]

功能:以浏览窗口方式显示当前表中的数据,并供用户进行修改。

若选择[NOAPPEND]选项时,则禁止向表中追加记录;若选择[NOMODIFY]选项时,则只供浏览数据表,而禁止修改表中的任何内容;若选择[LOCK<expN>]选项时,则将锁定窗口左端的<expN>个字段,使得当窗口内容向右滚动时仍能显示这些字段的内容;若选择[FREEZE<字段名>]选项时,将使光标“冻结”在指定的字段上,用户仅能对该字段进行修改。

【例2-3 使用命令的方式对学生档案表(xsda.dbf)进行浏览或修改。

USE xsda

EDIT

BROWSE

COSE TABLES

3REPLACE…WITH命令。

REPLACE…WITH命令可以在不打开任何编辑窗口的情况下,直接对表进行字段值的修改和替换,其格式为:

REPL 字段1 WITH 表达式1 [ADDITIVE][,字段2 WITH 表达式2[ADDITIVE]]

其中,[ADDITIVE]选项表示可将新加入的内容添加到原内容的后面,比如在备注文件的后面加上新的文字。

【例2-4使用REPLACE…WITH命令对学生档案表(xsda.dbf)的指定记录进行修改。

USE xsda

BROWSE

SKIP 2

REPLACE  姓名WITH '李波',出生年月WITH {^1976/07/16}

BROWSE

其运行前后的结果比较如图2-19所示。

2-19  利用REPLACE…WITH命令修改记录

3.在Visual Foxpro窗口中显示记录

Visual FoxPro中,可以使用DISPLAYLIST命令对数据表的记录显示在VisualFoxPro窗口中。

格式:LISTDISPLAY [<范围>][FOR <条件>][WHILE <条件>][[FIELDS]<表达式表>]

DISPLAY命令用于在Visual Foxpro 的主窗口中,显示当前记录指针所指向的记录或满足规定条件的记录,它可以简写成DISP;而LIST命令则列出表中的所有记录,它与DISPLAY ALL功能基本相同。

【例2-5将学生档案表(xsda.dbf)显示在Visual FoxPro窗口中。

CLEAR

USE xsda

DISPLAY

DISPLAY 编号,学号,姓名,出生年月,入学成绩

LIST

Visual FoxPro窗口显示如图2-20所示。

2-20  DISPLAYLIST显示的结果

注意:表中的记录是依次存放在文件中的,为了便于访问,系统内部提供了一个“记录指针”,指出当前要操作的记录。

DISPLAY还可以显示表的结构,当在“命令”窗口中输入如下命令后,将在Visual FoxPro的主窗口中显示如图2-21所示的表结构信息。

CLEAR

USE xsda

DISPLAY STRUCTURE

2-21  DISPLAY显示数据表结构

2.2.4  表记录的定位

表中的记录是依次存放在文件中的,为了访问它们,系统内部提供了一个指针,它指出当前要操作的那条记录。记录的定位就是设置记录指针指向那条记录。

1.记录的三个控制标志

任何一个表都有3个控制标志,即开始标志、指针标志和结束标志。

1)开始标志:位于第一个记录之前,其值用函数BOF()进行测试。

2)指针标志:指向当前记录,其值用函数RECNO()进行测试。

3)结束标志:位于最后一个记录之后,其值用函数EOF()进行测试。

记录指针标志可以理解为保存当前记录号的变量,它的初始值总是1,不可能为0或负数,最大值是表中记录的总数加1

2-1给出了刚打开表时记录指针标志的情况。

2-1  刚打开表时记录指针标志的情况

表中记录情况

BOF()的值

RECNO()的值

EOF()的值

无记录

.T.

1

.T.

有记录

.F.

1

.F.

 

2.记录的定位方式

Visual FoxPro中,可以通过以下几种方式进行记录的定位。

1)绝对定位,是指把指针移到指定的位置,即定位任意一个记录,其命令格式如下:

GO [RECORD]表达式[IN 工作区 IN 表别名]

GOTO [RECORD]表达式[IN 工作区 IN 表别名]

这两个命令都是将记录指针指向指定的记录。“表达式”的值作为要定位的记录号,主要用“[RECORD]表达式”来控制。因此,表达式的值必须是数字,且必须在1和表的最大记录数范围内。

GO TOPBOTTOM[IN 工作区IN 表别名]

GOTO TOPBOTTOM[IN 工作区IN 表别名]

这两个命令是将记录指针定位在表的第一个记录(TOP)或最后一个记录(BOTTOM)。

注意:表的最后一条记录并不等于表尾,因为表的末尾是一个指针,它指示下一条新记录将存储的位置,也可以把它视为一条空记录,所以,程序中虽然用了GO BOTTOM命令,但函数EOF()返回的值是.F.

2)相对定位,是指把指针从当前位置开始,相对于当前记录向前或向后移动若干个记录位置。

相对定位记录指针使用SKIP命令来实现,其格式如下:

SKIP <n>

n为正值时,则向下移动;当n为负值时,则向上移动;当无n时,则向下移动1个,如下所示:

SKIP    &&记录指针指向当前记录的下一个记录

SKIP-2  &&记录指针指向当前记录之前的第2个记录

SKIP 5  &&记录指针指向当前记录之后的第5个记录

3)条件定位,是指按一定的条件在整张表或表的某个指定范围中按顺序查找符合该条件的记录,其命令格式为:

LOCATE FOR 逻辑表达式1 [范围] [WHILE 逻辑表达式2] [NOOPTIMIZE]

CONTINUE

LOCATE FOR在找到符合条件的第一条记录以后,就停止查找,而CONTINUE命令则告诉系统继续往下查找。

【例2-6在学生档案表(xsda.dbf)中,查找性别是男的所有记录。

USE XSDA

LOCATE FOR 性别=.T.

DISPLAY

CONTINUE

DISPLAY

则在Visual FoxPro主窗口中显示如图2-22所示的内容。

2-22  DISPLAY显示记录

【例2-7打开学生档案表(xsda.dbf),并进行记录指针移动的示例。

USE XSDA                &&打开学生档案表(xsda.dbf)

? RECNO()               &&显示当前记录号为1

SKIP 3                  &&记录指针向下移动3

? RECNO()               &&显示当前记录号为4

SKIP -2                 &&记录指针向上移动2

? RECNO()               &&显示当前记录号为2

GO BOTTOM               &&记录指针移到最后一条记录

? EOF()                 &&显示.F.,则最后一条记录并不是文件末尾

? RECCOUNT()            &&显示共有记录10

? RECNO()               &&显示当前记录号为10

SKIP                    &&记录指针再向下移动一条

? EOF()                 &&显示.T.,说明记录指针已到文件末尾

? RECNO()               &&显示文件尾的记录号为11

USE                     &&关闭学生档案表(xsda.dbf)

4)使用菜单定位,在浏览可修改数据表时,选择“表”“转到记录”命令,然后在其下级菜单中选择相应的命令即可,如图2-23所示。

2-23  使用菜单定位方式

如果选择“记录号”命令,将弹出“转到记录”对话框,在其“记录号”文本框中输入相应的记录号(如8),然后单击“确定”按钮,即可将指针定位在相应的记录中,如图2-24所示。

2-24  使用“记录号”定位

如果选择“定位”命令,将弹出“定位记录”对话框,在其“For”文本框中输入相应条件(如“入学成绩>600),然后单击“确定”按钮,即可将指针定位在当前指针向下的第一条符合记录的位置上,如图2-25所示。

2-25  使用“条件”定位

2.2.5  表记录的删除与恢复

要将没有用的记录从表中永久删除,则先应对记录作删除标记;而记录的恢复只是指撤销删除标记。本节主要说明如何设置删除标记、记录的物理删除,以及如何撤销删除标记。

1.逻辑删除记录

将指定范围内满足条件的记录设置删除标记,其命令格式为:

DELETE [范围][FOR逻辑表达式1][WHILE逻辑表达式2]

[IN 工作区表别名] [NOOPTIMIZE]

在默认情况下,仅对当前记录做删除标记。可用DELETED()函数来检测当前记录是否带有删除标志。

当设置了删除标记后,在使用LISTDISPLAY命令显示记录时,可见到这些记录前的删除标志“*”,如图2-26所示;而在浏览窗口中察看数据表时,可见到这些记录左端的小方块已被涂黑,如图2-27所示。

         

   2-26  显示下的删除标记                  2-27  浏览窗口中的删除标记

注意:对于已经做上删除标志的记录操作,与SET DELETED ON/OFF命令的设置有关,当执行命令SET DELETED ON后,所有打上删除标志的记录将被“屏蔽”,如同这些记录已经被删除一样。

2.物理删除记录

使用PACK命令可对已经做了删除标记的记录进行物理删除,其命令格式为:

PACK [MEMO][DBF]

在该命令中,[MEMO]选项表示删除备注文件中不用的空间,但并不删除记录;[DBF]选项表示删除记录,但不删除备注文件。

3.删除全部记录

使用ZAP命令可以删除当前数据表中的所有记录,使其成为空的数据表结构文件,其格式为:

ZAP

【例2-8学生档案表(xsda.dbf)中,做删除记录示例(用户可将该数据表文件备份,以便今后使用)。

USE xsda                &&打开学生档案表

? RECCOUNT()            &&显示共有10条记录

DELETE FOR 性别=.T.      &&逻辑删除性别等于男生的记录

LIST                    &&显示记录,被删除记录前可见到删除标志“*

GOTO 4                  &&指针指向已有删除标记的第4条记录

RECALL                  &&去掉第4条记录的删除标志

SET DELETED ON          &&设置为DELETED ON状态

LIST                    &&再次显示,有删除标志的记录将被隐蔽

? RECCOUNT()            &&显示10,说明表中仍有10条记录

PACK                    &&物理删除有删除标志的记录

? RECCOUNT()            &&显示5,说明表中有5条记录被彻底删除

USE                     &&关闭学生档案表

4.恢复删除记录

对设置了删除标记的记录,可以使用RECALL命令对其进行恢复,其格式为:

RECALL [范围][FOR逻辑表达式1][WHILE逻辑表达式2]

注意:若事先已用SET DELETED ON命令将带有删除标记的记录“屏蔽”了,则本命令不起作用。

2.2.6  数据表的排序

数据表的排序,是指依照某一关键字段的大小重新排列数据表中记录的顺序,并生成一个新的数据表文件,也可以称之为物理排序。其命令格式为:

SORT ON <字段1>[/A] [/C] [/D][,<字段2>[/A] [/C] [/D]] TO <文件名>

[<范围>][FOR <条件>][WHILE <条件>][FIELDS <字段表>]

[ASCENDINGDESCENDING]

它是对指定范围内条件的记录按指定<字段>之值的大小重新排列后生成的一个给定名称的表文件。

说明:

1)排序的结果存入到由TO<文件名>短语指定的新表文件中,其扩展名默认为*.dbf,其新表的结构由FIELDS短语确定;若没有给出FIELDS短语,则新表结构与当前表的结构相同。

2)可以实现多重排序,首先按<字段1>之值的大小进行排序,然后按<字段2>进行排序,依次类推。

3)指定[/A]为升序排序,指定[/D]为降序排序,默认为升序排序。

4)指定[/C],则排序时不区分字母的大小写。

5选用[ASCENDING]选项时,表示所有关键字段都按升序排序;选用[DESCENDING]选项时,表示所有关键字段都按降序排序。

2-9 将学生档案表(xsda.dbf)中的所有记录按姓名进行排序。

USE xsda                    &&打开学生档案表

SORT ON 姓名TO xsda-xm      &&按姓名排序生成新表xsda-xm

USE xsda-xm                 &&打开新表xsda-xm

BROWSE                      &&显示排序的表,如图2-28所示

USE                         &&关闭数据表

【例2-10在学生档案表(xsda.dbf)中,先按性别再按入学成绩的降序进行排序。

USE xsda

SORT ON 性别,入学成绩/D TO xsda-xb

USE xsda-xb

BROWSE                      &&显示的排序结构如图2-29所示

USE

 

2-28  显示排序的新表                    2-29  按性别和入学成绩排序