- Visual FoxPro程序设计
- 黄玲芳 刘建兰主编
- 5961字
- 2025-02-20 13:34:01
3.3 表的基本操作
按前面所述方法分别创建工资表“Gzb.dbf”和增加工资表“ZZ.dbf”,这样就创建了RSGZK数据库。其中包含4个表,即RSB(人事表)、Gzb(工资表)、BMDM(部门代码表)和ZZ(增加工资)表,创建表之后会经常根据需要更改其中的数据。
3.3.1 打开与关闭表
1.打开
操作表前必须打开表,打开有菜单和命令方式两种。
(1)菜单方式。
例3-8:从“文件”菜单中打开RSB表。
操作步骤如下。
● 选择“文件”|“打开”选项,或者单击工具栏中的“打开”按钮或者按下Ctrl+O组合键,弹出“打开”对话框,如图3-21所示。

图3-21 “打开”对话框
● 在“查找范围”下拉列表框中选择表所在的目录,在“文件类型”下拉列表框中选择“表”选项。找到要打开的文件,选中“独占打开”复选框。
● 双击要打开的文件或选中要打开的文件后单击“确定”按钮。
表打开后在状态栏中会显示表的有关信息,这时可以操作表。
例3-9:在RSGZK数据库中打开BMDM表。
操作步骤如下。
● 打开数据库RSGZK,弹出“数据库设计器”窗口。
● 双击BMDM表。
(2)命令方式。
格式:USE [<数据库名!>]|<表文件名>
功能:打开表。
说明:若要打开数据库表,可以用USE [<数据库名!>]|<表文件名>命令或者OPEN DATABASE<数据库名>命令打开数据库,然后用USE <表文件名>打开表;若打开自由表,则可直接使用USE <表文件名>命令。
例3-10:打开数据库RSGZK中的RSB表。
USE RSGZK! RSB.DBF &&直接打开数据库表
或:
OPEN DATABASE RSGZK &&打开数据库”RSGZK.dbc” USE RSB.DBF &&打开数据库中的数据表”RSB.dbf”
例3-11:打开自由表“ZZ.DBF”。
USE ZZ.DBF &&假定ZZ.dbf为一自由表
2.关闭表
完成表的操作后要及时关闭才能及时保存修改,关闭表的方法如下。
(1)菜单方式。
● 选择“窗口”|“数据工作期”选项,弹出“数据工作期”对话框,如图3-22所示。

图3-22 “数据工作期”对话框
● 在“别名”下拉列表框中选择要关闭的表,然后单击“关闭”按钮。
(2)命令方式。
格式:USE
功能:关闭当前工作区中的表。
3.3.2 显示表
1.显示表结构
显示表结构即列出数据表各字段的名字、类型和宽度等信息。
(1)菜单方式。
打开需要操作的表,然后选择“显示”|“表设计器”选项,弹出“表设计器”窗口,其中显示表的结构。
(2)命令方式。
格式:LIST|DISPLAY STRUCTURE [TO PRINTER [PROMPT]|TO FILE <文件名>]
该命令在屏幕上列出指定表的结构,包括记录个数、记录长度,以及各字段的名称、宽度和类型等。LIST为连续显示,DISPLAY为分屏显示。
例3-12:在VFP 9.0主窗口显示“RSB.dbf”表的结构。
在命令窗口中输入如下命令:
USE RSB LIST STRUCTURE
运行结果如图3-23所示。

图3-23 运行结果
2.显示表记录
通过USE <表文件名>命令打开表后可以通过字段名来引用字段,VFP 9.0用记录指针的方式来指定表中记录。输入记录时系统会自动产生一个“记录号”,即记录在表文件中的序号。使用USE打开一个表文件时,记录的指针指向并停留在第1条记录。当前指针所指向的记录称为“当前记录”,当前记录号随记录指针的改变而改变。
显示表记录的两种方式如下。
(1)菜单方式。
打开表文件后,选择“显示”|“浏览”选项,显示表中所有记录。如果要查看特定记录,则可以通过数据过滤器筛选。
例3-13:显示RSB.dbf中出生日期在1973年以后的职工记录。
操作步骤如下。
● 打开表RSB.DBF,选择“显示”|“浏览”选项,在弹出的“浏览”窗口中显示表RSB。
● 选择“表”|“属性”选项,弹出如图3-24所示的“工作区属性”对话框。

图3-24 “工作区属性”对话框
● 在“数据过滤器”文本框中输入筛选表达式“Rsb.出生日期>{^1973-12-31}”,或者单击“数据过滤器”文本框后的按钮,在“表达式生成器”对话框中输入表达式“Rsb.出生日期>{^1973/12/31}”,如图3-25所示。

图3-25 输入表达式
● 单击“确定”按钮,回到浏览窗口,显示出生日期在1973年以后的职工信息,如图3-26所示。

图3-26 出生日期在1973年以后的职工记录
例3-14:显示RSB.dbf表中的姓名、性别和职称数据。
操作步骤如下。
● 在浏览窗口中打开RSB.dbf。
● 选择“表”|“属性”选项,弹出“工作区属性”对话框。
● 选中“允许访问”选项组中的“字段筛选指点定的字段”单选按钮。
● 单击“字段筛选”按钮,弹出“字段选择器”对话框,如图3-27所示。

图3-27 “字段选择器”对话框
● 在“所有字段”下拉列表框中选择所有要显示的字段,将“姓名”“性别”和“职称”分别添加到“选定字段”下拉列表框中。
● 单击“确定”按钮,关闭“字段选择器”对话框。
● 在“工作区属性”对话框中选择“允许访问”选项组中的“字段筛选指定的字段”单选按钮。
● 单击“确定”按钮,关闭“工作区属性”对话框。
● 打开浏览窗口,其中显示“姓名”“性别”和“职称”3个字段,如图3-28所示。

图3-28 定制显示字段后的显示结果
(2)命令方式。
格式 1:LIST [<范围>] [[FIELDS] <表达式表>] [FOR<条件>] [WHILE <条件>] [TO PRINTER [PROMPT]| TO FILE <文件名>] [OFF] 格式2:DISPLAY [<范围>] [[FIELDS] <表达式表>] [FOR<条件>] [WHILE <条件>] [TO PRINTER [PROMPT]|TO FILE <文件名>] [OFF] 格式3: BROWSE [LAST] [FIELDS <字段表>] [FOR <条件>] [FREEZE <字段>] [LOCK< 数值表达式>]
这3个命令均显示表中的记录,LIST和DISPLAY命令的区别是如果省略FOR子句或WHILE子句,以及范围,则LIST默认为所有记录,即取ALL; DISPLAY默认为当前记录,即显示一条记录。当显示多条记录时,DISPLAY分页显示,而LIST不分页,即连续地滚动显示;BROWSE命令是所有记录的总浏览命令,执行时打开浏览窗口。该命令可以添加、删除和修改记录,也可以用鼠标或光标键移动。其中各选项的含义如下。
● FIELDS:字段名表,指定要显示的字段,各字段间用英文逗号分开,默认为全部字段。
● FOR和WHILE条件:显示满足条件的结果。若选中FOR子句,则显示满足所给条件的所有记录;若选中WHILE子句,则显示直到条件不成立时为止,这时后面即使还有满足条件的记录也不再显示。
● 范围:可以是ALL、REST、RECORD N和NEXT N。
● OFF:表示只显示记录内容而不显示记录号,若省略该项,则同时显示记录号和记录内容。
● TO P RINTER:将显示结果输送到打印机打印。
● TO FILE <文件名>:将显示结果输送到指定的文件中保存。
例3-15:根据人事表(RSB.DBF)写出如下操作命令并观察结果。
● 显示所有记录:
USE RSB LIST &&也可以用DISPLAY ALL命令 USE
● 显示前5条记录:
USE RSB LIST NEXT 5 &&也可以用DISPLAY NEXT 5命令 USE
● 显示已婚的男职工的记录:
USE RSB LIST FOR婚否=.T. and性别="男" USE
执行结果如图3-29所示。

图3-29 满足条件的记录
● 显示职称是“教授”人员的姓名、性别及工作日期:
USE RSB LIST FIELDS 姓名, 性别,工作日期; FOR职称="教授" USE
执行结果如图3-30所示。

图3-30 满足条件的记录
3.3.3 修改表
1.修改结构
在“表设计器”窗口中可以定义、插入、删除、修改字段并调整字段的顺序等。
(1)插入字段:单击需要插入字段的位置,单击“插入”按钮,在该字段之前插入一个新的字段。输入相关字段信息后,原字段后面的字段位置按顺序后移。
(2)删除字段:选择要删除的字段,单击“删除”按钮。
(3)更改字段内容:单击要修改处,然后输入需要修改的内容。
(3)调整字段的顺序:在字段名的左边有一排纵向排列的方形按钮,需要调整哪个字段的位置则单击该按钮,显示一个上下箭头的符号。拖动该按钮,该按钮所在行的字段放到新的位置。
例3-16:打开“表设计器”窗口修改表RSB的结构,要求在“姓名”和“性别”之间增加“籍贯”字段。其类型为字符型,宽度为10,删除“出生日期”字段并修改“职称”字段的宽度为8。
操作步骤如下。
(1)打开RSB.dbf。
(2)选择“显示”|“表设计器”选项,弹出“表设计器-rsb.dbf”对话框。
(3)选中“性别”字段,单击“插入”按钮,在“姓名”与“性别”之间增加了一行。
(4)在新字段中输入字段名“籍贯”,在“类型”列中选择数据类型为“字符型”,在“宽度”列中选择亮度为“10”,如图3-31所示。

图3-31 插入新字段
(5)选中“出生日期”字段,单击“删除”按钮。
(6)选中“职称”字段,改变宽度为10。
(7)单击“确定”按钮,在弹出的提示对话框中单击“是”按钮。
2.修改记录
(1)使用浏览窗口。
浏览窗口实际上是一个全屏幕编辑窗口,在其中可以查看和修改表记录。把光标定位在要修改记录的相应字段上直接修改即可,如图3-32所示。

图3-32 在浏览窗口中修改记录
若要编辑备注型和通用型字段,则双击对应的字段,打开编辑窗口后修改。
(2)使用EDIT或CHANGE命令。
EDIT和CHANGE命令均可修改当前记录,按PageDown或PageUp键可跳到下一条或上一条记录,也可用光标定位。
(3)使用成批替换命令。
REPLACE命令可成批有规律地修改字段内容。
格式:REPLACE [范围] <字段1> WITH <表达式1>[, <字段2> WITH <表达式2>…] [FOR< 条件>][WHILE <条件>]
功能:对指定范围内满足条件的各记录,以<表达式1>的值替换<字段名1>的内容,以<表达式2>的值替换<字段名2>的内容,依此类推(备注型和通用型字段除外)。
注意:REPLACE命令的范围默认为当前记录。
例3-17:计算Gzb表中所有职工的应发工资(基本工资+岗位津贴+奖金)和实发工资(应发工资-水电-保险)。
命令如下:
USE RSB BROWSE REPLACE ALL应发工资WITH基本工资+岗位津贴+奖金 &&替换所有的记录 REPLACE ALL实发工资WITH应发工资-水电-保险
说明:如果REPLACE后面没有范围子句和FOR条件表达式,则只作用于当前记录。
例3-18:将Gzb表中应发工资大于3000的职工的保险增加10%。
命令如下:
USE Gzb BROWSE REPLACE ALL保险WITH保险*(1+0.10)FOR应发工资>3000
3.3.4 定位表记录指针
打开表后系统会自动产生唯一一个记录指针指向当前记录,定位记录指针就是根据需要移动记录指针并使其指向特定的记录。
1.在浏览窗口中移动记录指针
(1)选择“文件”|“打开”选项,打开一个表。
(2)选择“显示”|“浏览”选项,显示表的记录。
(3)选择“表”|“转至记录”选项。
定位记录指针的选项有“第一个”“最后一个”“上一个”“下一个”“记录号”和“定位”,如图3-33所示。

图3-33 定位记录指针的选项
(4)选择所需选项。
2.命令方式
(1)指针绝对定位,即将记录指针定位到指定记录。
格式:[GO[TO]] <记录号>|TOP|BOTTOM|<数值表达式>|<整数>
功能:将一个已打开的表文件记录指针移到指定的记录处。
选用TOP,指针定位到首记录;选用BOTTOM,指针定位到末记录。<记录号>定位到指定的记录,<数值表达式>定位到表达式值指定的记录,<整数>定位到整数值指定的记录。
例3-19:打开RSB表,在命令窗口中执行以下命令并观察结果。
GO TOP &&将记录指针移到第1条记录 ?RECNO() &&此时显示当前记录号为1 GO BOTTOM &&将记录指针移到最后1条记录 GO 5 &&将记录指针移到第5条记录 ?RECNO() &&此时显示当前记录号为5
(2)指针相对定位,即以当前记录位置为基准向前或向后移动记录指针。
格式:SKIP ±<数值表达式>
功能:以当前记录为基准将记录指针向前或向后移动,移动记录个数由<数值表达式>的值确定,为正时向后移动;为负时向前移动。若省略<数值表达式>,则系统默认表达式值为1。
例3-20:打开RSB表,在命令窗口中执行以下命令并观察结果。
GO 3 &&将记录指针移到第3个记录 SKIP 2 &&将记录指针向后移动两条记录,即现在指向第5条记录 ?RECNO() &&此时记录号为5 SKIP -1 &&将记录指针向前移动1条记录,即现在指向第4条记录 SKIP &&将记录指针向后移动1条记录,即现在指向第5条记录
(3)查询定位。
格式:LOCATE [<范围>] FOR <条件>|WHILE <条件>
功能:搜索满足条件的第1条记录。若找到,记录指针指向该记录;若找不到,搜索后主窗口的状态栏中显示“已定位范围末尾”,此时记录指针指向文件结束处。如果没有指定范围,则默认为ALL。若找到记录后要继续查找满足<条件>的记录,则必须用CONTINUE命令。此时若找到,函数FOUND()返回.T.;否则返回.F.。
例3-21:在RSB表中查询男讲师的姓名、工作日期和部门代码。
命令序列如下:
USE RSB LOCATE FOR 职称= "讲师" AND 性别="男" &&查找男讲师的记录 ?FOUND( ) &&查看是否找到 DISPLAY姓名,工作日期, 部门代码 &&显示查找到的记录且只显示指定字段 CONTINUE &&继续查找 DISPLAY姓名,工作日期, 部门代码 &&显示找到结果,若未找到,则不显示数据
3.3.5 插入与删除表记录
1.插入记录
格式:INSERT [BLANK] [BEFORE]
功能:在当前表的指定位置上插入一条新记录。
说明:若给出BLANK选项,则插入一条空记录;否则进入数据记录输入窗口;若给出BEFORE选项,则在当前记录前面插入一条新记录。即插入的新记录成为当前记录,原来的当前记录及其后面记录的记录号均加1,否则在当前记录的后面插入一个新记录。
2.追加记录
(1)命令方式。
格式:APPEND [BLANK]
功能:在当前表的末尾追加一条新记录。
说明:若选用BLANK选项,则追加一条空记录到表尾。该命令在当前表尾增加新记录。而INSERT命令可以在指定位置增加新记录,两个命令的屏幕操作方式相同。
(2)菜单方式。
例3-22:在RSB表中追加4条记录。
操作步骤如下。
● 打开RSB表,选择“显示”|“浏览”选项,打开浏览窗口。
● 选择“显示”|“追加方式”选项,如图3-34所示,在RSB表的末尾添加一条空记录并显示输入框。

图3-34 “追加方式”选项
● 输入数据,输入一条记录后系统自动追加下一条记录,直到输入4条记录后保存。
3.删除记录
为要删除的记录添加删除标志(*),即逻辑删除。并没有真正被删除,需要时仍可以恢复。将有删除标志的记录从表文件中彻底删除,即物理删除。记录一旦被物理删除,则无法恢复,因此在物理删除时一定要慎重。
(1)在浏览或编辑窗口中实现。
例3-23:在Rsb表中逻辑删除第1、3、4、9条记录,然后恢复第1、3、4条记录并彻底删除第9条记录。
操作步骤如下。
● 依次单击第1、3、4、9条记录左边的小方框,为这些记录添加删除标记,结果如图3-35所示。

图3-35 添加删除标记
● 单击第1、3、4条记录左边的小方框,恢复这3条记录,如图3-36所示。

图3-36 逻辑恢复结果
● 选择“表”|“彻底删除”选项,弹出如图3-37所示的确认删除提示对话框。单击“是”按钮,彻底删除第9条记录。

图3-37 确认删除提示对话框
例3-24:在Rsb表中逻辑删除男职工的记录。
操作步骤如下。
● 选择“表”|“删除记录”选项,弹出“删除”对话框,如图3-38所示。

图3-38 “删除”对话框
● 输入删除条件、选择删除记录范围,这里将范围选择为“ALL”。
● 单击For后面的按钮,弹出“表达式生成器”对话框,如图3-39所示。

图3-39 “表达式生成器”对话框
● 通过输入或选择的方式构造表达式Rsb,性别="男",单击“确定”按钮。回到浏览窗口,可以看到满足条件的记录均添加了删除标记。
(2)命令方式。
● 为记录加删除标志。
格式:DELETE [<范围>] [FOR<条件>] [WHILE <条件>]
功能:为指定的记录添加删除标志,若不选择可选项,则仅为当前记录添加删除标志。
● 取消删除标记(恢复)。
格式:RECALL [<范围>] [FOR<条件>] [WHILE<条件>]
该命令取消指定记录上的删除标志,若不选择可选项,则仅取消当前记录的删除标志。
● 物理删除记录。
格式:PACK
功能:该命令清除所有带删除标志的记录。
● 删除全部记录。
格式:ZAP
功能:该命令删除当前表的全部记录,只留下表结构。
例3-25:执行以下命令并观察结果。
USE Rsb BROWSE DELETE ALL &&逻辑删除所有记录 RECALL FOR性别="女" &&把已逻辑删除、性别为女的记录恢复,结果如3-40所示 PACK &&将具有删除标记的记录永久删除,结果如图3-41所示

图3-40 显示结果(1)
3.3.6 复制表
复制表文件即得到一个已有表文件的一个副本,这是保护数据常用的安全措施之一。通过复制还能在已建表文件的基础上,灵活方便地产生新的表文件或新的表文件结构。
1.复制表的结构
格式:COPY STRUCTURE TO <文件名> [FIELDS <字段名表>]
功能:仅复制当前表文件的结构,不复制其中的记录。若有可选项FIELDS<字段名表>,则复制的新表文件结构只包含其中指定的字段。
2.复制表
格式:COPY TO <文件名> [<范围>] [FIELDS<字段名表>] [FOR<条件>] [WHILE <条件>] [[TYPE]SDF|DELIMITED|XLS] [WITH 定界符|BLANK]
功能:将当前表的记录数据和结构复制到一个指定表中或生成其他格式的文件。
说明:如果命令中各可选项省略,则复制所得的新表文件为当前表文件的一个副本,若选择SDF或DELIMITED,则复制为文本文件;若选择XLS,则复制为Excel文件。
例3-26:将Rsb表中的女职工复制到新表FEMALE.dbf中,并将表中讲师的记录生成一个文本文件NEW.txt。
USE Rsb COPY TO FEMALE FOR性别="女" &&将性别为“女”的记录复制到表FEMALE.DBF中 COPY TO NEW FOR 职称="讲师" SDF &&将职称为“讲师”的记录复制到文本文件NEW.TXT中 USE &&关闭Rsb表 USE FEMALE &&打开新表FEMALE LIST &&查看表FEMALE中的记录 TYPE NEW.TXT &&查看文本文件NEW中的内容
复制结果如图3-42所示。

图3-42 复制表的结果