560 likes | 699 Views
Visual FoxPro 程序设计教程. 第 10 章 创建表和索引. 10.1 创建新表. 表的概念. 1. 数据表 记录与字段 关键字 索引 数据库表和自由表. 总复习教学进程. ● 使用命令 创建新表: 使用 CREATE 〈 新表文件名 〉 命令也可以打开“表设计器”,创建一个新的表文件结构。使用 CREATE ? 命令则可以在其他目录中创建一个新的表文件结构。 使用下述命令可以不使用“表设计器”,直接创建表的结构: CREATE TABLE 〈 新表文件名 〉(〈 字段名 1〉〈 类型 〉(〈 长度 〉)
E N D
第10 章 创建表和索引
10.1 创建新表 表的概念 1 • 数据表 • 记录与字段 • 关键字 • 索引 • 数据库表和自由表 总复习教学进程
●使用命令创建新表: 使用CREATE〈新表文件名〉命令也可以打开“表设计器”,创建一个新的表文件结构。使用CREATE ?命令则可以在其他目录中创建一个新的表文件结构。 使用下述命令可以不使用“表设计器”,直接创建表的结构: CREATE TABLE 〈新表文件名〉(〈字段名1〉〈类型〉(〈长度〉) [,〈字段名2〉〈类型〉(〈长度〉)…] 打开表: 使用USE〈表文件名〉命令可以打开一个已经存在的数据表。 添加记录: 使用APPEND命令可以向打开的数据表中添加记录。 总复习教学进程
10.2 查看表中的数据 ●在表单中显示浏览窗口 【例10-1】在表单中使用命令方式来打开浏览窗口,显示并修改数据表的内容。 图10-12 在表单中编辑或浏览数据表 总复习教学进程
设计步骤如下: (1) 建立应用程序用户界面与设置对象属性。 (2) 编写代码。 在表单的Load事件代码中打开数据表: USE student 在表单的Destoy事件代码中关闭数据表: USE 在命令按钮Command1的Click事件代码中打开编辑窗口: GO TOP EDIT 在命令按钮Command2的Click事件代码中打开浏览窗口: GO TOP BROWSE 总复习教学进程
● 数据环境 【例10-2】在上例的表单中使用数据环境。 设计步骤如下: (1) 创建“数据环境”。 选择新建表单,进入表单设计器。在系统菜单的“显示”子菜单中选择“数据环境”,或在表单设计器中单击鼠标右键,从弹出的快捷菜单中选择“数据环境”,或单击表单设计器中“数据环境”按钮(如图10-14),均可打开“数据环境设计器”窗口。 图10-14 选择“数据环境” 总复习教学进程
在“数据环境”窗口中单击鼠标右键,在快捷菜单中选择“添加”,可添加表单所要控制的数据表:Student.dbf,如图10-15所示。在“数据环境”窗口中单击鼠标右键,在快捷菜单中选择“添加”,可添加表单所要控制的数据表:Student.dbf,如图10-15所示。 图10-15 “数据环境”设计器 (2) 修改代码。 删除上例表单中的Load事件代码与Destoy事件代码,改由数据环境来处理数据表的打开与关闭。 (3) 运行表单结果完全相同。 总复习教学进程
使用移动指针命令 移动记录指针的命令分为绝对移动(GO)和相对移动(SKIP)两种,其格式如下: (1) 绝对移动。 GO { BOTTOM | TOP |〈记录号〉} 其中BOTTOM表示末记录,TOP表示首记录,〈记录号〉可以是数值表达式,按四舍五入取整数,但是必须保证其值为正数且位于有效的记录数范围之内。 (2) 相对移动。 SKIP {n | –n } 其中n为数值表达式,四舍五入取整数。若是正数,向记录号增加的方向移动,若是负数,向记录号减少的方向移动。 总复习教学进程
10.3 数据表单的设计 使用表单设计器 1 用表单设计器设计一个可以浏览和编辑数据表的程序。 【例10-3】设计一个操作数据表的表单,使之具有按记录浏览、编辑的功能。 设计步骤如下: (1) 创建数据环境。 (2) 建立应用程序用户界面与设置对象属性。 总复习教学进程
(3) 编写事件代码。 在表单中增加一个自定义方法butt()来控制4个按钮的是否可用: LPARAMETERS L THIS.CommandGroup1.Buttons(1).Enabled = L THIS.CommandGroup1.Buttons(2).Enabled = L THIS.CommandGroup1.Buttons(3).Enabled = not L THIS.CommandGroup1.Buttons(4).Enabled = not L 编写命令按钮组CommandGroup1的Click事件代码: n = THIS.Value DO CASE CASE n = 1 GO TOP THISFORM.butt(.f.) CASE n = 2 SKIP –1 总复习教学进程
IF BOF() GO TOP THISFORM.butt(.f.) ENDIF THIS.Buttons(3).Enabled = .T. THIS.Buttons(4).Enabled = .T. THISFORM.Refresh CASE n = 3 SKIP 1 IF EOF() GO BOTTOM THISFORM.butt(.T.) ENDIF THIS.Buttons(1).Enabled = .T. THIS.Buttons(2).Enabled = .T. CASE n = 4 GO BOTTOM THISFORM.butt(.T.) ENDCASE 总复习教学进程
在此例基础上增加一个命令按钮使之在表单中显示浏览窗口。设计步骤如下:在此例基础上增加一个命令按钮使之在表单中显示浏览窗口。设计步骤如下: 在表单上增加一个命令按钮Command1,将其Caption属性改为:浏览,如图10-18左所示。 图10-18 增加一个“浏览”按钮 总复习教学进程
编写Command1的Click事件代码: BROWSE GO RECNO() THISFORM.Refresh 运行表单,单击“浏览”按钮,可以显示浏览窗口(如图10-18右)。 总复习教学进程
2 使用表格控件 【例10-4】在上例的表单中增加一个浏览窗口。如图10-19所示。 设计步骤如下: (1) 在“文件”菜单中选择“打开”或直接用鼠标单击“常用工具栏”中的“打开”按钮,选择上例的表单文件,进入表单设计器。 首先修改表单布局,并在表单上增加一个“表格”控件Grid1,如图10-20所示。 图10-19 增加一个浏览窗口 图10-20 增加一个“表格”控件
(2) 用鼠标右键单击Grid1,在弹出的快捷菜单中选择“生成器”,打开“表格生成器”。用鼠标单击“数据库和表”右边的命令按钮“...”,如图10-21左所示,可以选择数据表。 然后选择“可用字段”中的“学号”、“姓名”、“性别”和“总学分”等字段,按添加按钮,将其添加到“选定字段”列表中,如图10-21右所示。 图10-21 “表格生成器”对话框
在“布局”页中,用鼠标指向标题行的分隔线可以调整列标题的宽度,如图10-22。在“布局”页中,用鼠标指向标题行的分隔线可以调整列标题的宽度,如图10-22。 按“确定”退出表格生成器。运行表单,发现表格中的记录和文本框中的记录不同步。为此,重新打开“表单设计器”,继续修改表单。 图10-22 调整列标题的宽度
(3) 修改事件代码。 编写表格Grid1的AfterRowColCange事件代码: LPARAMETERS nColIndex THISFORM.Refresh 其中第一行是原有的。第二行表示当光标在表格中移动时,随时刷新表单。 在命令按钮组CommandGroup1的Click事件代码最后增加一条命令: THISFORM.Grid1.SetFocus 修改后的数据表单运行时如图10-19所示。
3 使用页框 如果感觉表单界面太过狭小,可以在设计时扩大表单,或者为表单添加页面。 【例10-5】在例10-3的表单中使用页面技术。如图10-23所示。 如果感觉表单界面太过狭小,可以在设计时扩大表单,或者为表单添加页面。 图10-23 使用页框
设计步骤如下: (1) 在“文件”菜单中选择“打开”或直接用鼠标单击“常用工具栏”中的“打开”按钮,选择上例的表单文件,进入表单设计器。 (2) 增加页框。将表单中除标题和命令按钮组外的所有控件做“多重选定”(如图10-24)。 图10-24 多重选定
在“编辑”菜单中选择“剪切”,或直接按〈Ctrl〉+〈X〉,将其移放剪贴板中。然后,在表单上增加一个页框对象Pageframe1并适当调整其大小和位置(如图10-25左)。在“编辑”菜单中选择“剪切”,或直接按〈Ctrl〉+〈X〉,将其移放剪贴板中。然后,在表单上增加一个页框对象Pageframe1并适当调整其大小和位置(如图10-25左)。 图10-25 增加并编辑页框
(3) 编辑第一页。 (4) 编辑第二页。 (5) 编写代码。 在例10-3的基础上增加如下代码: 在命令按钮组CommandGroup1的Click事件代码最后增加一条命令: THISFORM.PageFrame1.Page2.GrdStudent.SetFocus 页框pageFrame1中第一页page1的Activate事件代码: THIS.txt学号.SetFocus 页框pageFrame1中第二页page2的Activate事件代码: THIS.grdstudent.SetFocus 第二页page2中表格GrdStudent的AfterRowColChange事件代码: LPARAMETERS nColIndex THIS.Parent.Parent.Page1.Refresh
另外修改命令按钮组CommandGroup1的Click事件代码:另外修改命令按钮组CommandGroup1的Click事件代码: n = THIS.Value DO CASE CASE n = 1 GO TOP THISFORM.butt(.f.) CASE n = 2 SKIP –1 IF BOF() GO TOP THISFORM.butt(.f.) ENDIF THIS.Buttons(3).Enabled = .T. THIS.Buttons(4).Enabled = .T.
CASE n = 3 SKIP 1 IF EOF() GO BOTTOM THISFORM.butt(.T.) ENDIF THIS.Buttons(1).Enabled = .T. THIS.Buttons(2).Enabled = .T. CASE n = 4 GO BOTTOM THISFORM.butt(.T.) ENDCASE IF THISFORM.PageFrame1.ActivePage = 2 THISFORM.PageFrame1.Page2.GrdStudent.SetFocus ENDIF THISFORM.Refresh
4 逻辑字段的控制技巧 【例10-6】修改上例,使用“选项按钮组”控制“性别”字段(如图10-28)。 图10-28 使用“选项按钮组”控制“性别”字段
设计方法如下: (1) 修改界面。 (2) 修改事件代码。 选项按钮组optiongroup1的InteractiveChange事件代码: THIS.Parent.chk性别.Value=IIF(THIS.Value=1,.T.,.F.) 复选框(chk性别)的Refresh事件代码: THIS.Parent.OptionGroup1.Value=IIF(THIS.Value,1,2)
10.4 修改表结构 1 使用表设计器 在命令窗口可以使用如下命令打开表设计器: MODIFY STRUCTURE 2 以编程方式修改表结构 1.给表添加字段 使用ALTER TABLE命令的ADD [COLUMN]子句。例如,可以使用以下命令把备注型字段“地址”添加到Student表中,并允许该字段有null值: ALTER TABLE Student ADD COLUMN 地址 m NULL
2.从表中删除字段 使用ALTER TABLE命令的DROP [COLUMN] 子句。例如,可以使用以下命令从Student表中删掉“地址”字段: ALTER TABLE Student DROP COLUMN 地址 3.重新命名表字段 使用ALTER TABLE命令的RENAME COLUMN子句。例如,可以使用以下命令对Student表的“总学分”字段重新命名: ALTER TABLE Student RENAME COLUMN 总学分 TO 学分
10.5 编辑表中数据 1 编辑字段 • 在“浏览”或“编辑”窗口中 • 在“编辑”窗口中 • 使用批替换命令 批替换命令的语法格式为: REPLACE [〈范围〉] 〈字段名1〉 WITH 〈表达式1〉 [,〈字段名2〉 WITH 〈表达式2〉…] [FOR | WHILE〈条件〉]
2 在表中添加新记录 1. 在“浏览”或“编辑”窗口中 2. 使用命令 直接在命令窗口使用命令APPEND,也可以按“追加方式”打开“浏览”或“编辑”窗口,为数据表添加新纪录。 若要从其他表中追加记录,可以使用如下格式的命令: APPEND FROM 〈表文件名〉 FOR 〈逻辑表达式〉
3 删除记录 1. 在“浏览”或“编辑”窗口中 2. 使用命令 (1) 逻辑删除记录命令可以对数据表中指定范围内满足条件的记录加注标记,其格式为: DELETE [〈范围〉] [FOR〈条件〉] (2) 恢复注删记录命令可以恢复数据表中指定范围内满足条件的注删记录。撤消标记,其格式为: RECALL [〈范围〉] [FOR〈条件〉] RECALL是DELETE的逆操作,作用是取消标记,恢复成正常记录。 (3) 物理删除记录命令可以将数据表中所有具有删除标记的记录正式从表文件中删掉。其格式为: PACK PACK为物理删除命令,一旦执行,无法用RECALL恢复。
4 编辑表单的设计 【例10-7】修改例10-6,使之具有增加、删除、编辑记录的功能(如图10-34)。 图10-34 具有增加、删除、编辑记录的功能
在例10-6的基础上进行修改,具体步骤如下: (1) 在表单上增加一个命令按钮组CommandGroup2,将其按钮个数属性ButtonCount改为:3,并依次修改各按钮的Caption属性,如图10-34左所示。 (2) 修改第一页中各文本框、编辑框、选项按钮组的属性 (3) 在表单中增加一个自定义的方法disi(),用来控制第一页中输入框的可用与否。 (4) 修改数据环境中数据表的Exclusive(独占)属性改为:.T. – 真,BufferModeOverride属性改为:2 – 保守式行缓冲。 (5) 编写代码。 ● 编写自定义方法disi()的代码: LPARAMETERS L THIS.PageFrame1.Page1.SetAll("Enabled",IIF(L,.T.,.F.),"TextBox") THIS.PageFrame1.Page1.SetAll("Enabled",IIF(L,.T.,.F.),"OptionGroup") THIS.PageFrame1.Page1.SetAll("Enabled",IIF(L,.T.,.F.),"EditBox") THIS.CommandGroup1.Enabled=IIF(L,.F.,.T.)
●编写命令按钮组CommandGroup2中各按钮的事件代码如下:●编写命令按钮组CommandGroup2中各按钮的事件代码如下: Command1的Click事件代码: IF THIS.Caption = "添加" THIS.Caption = "保存" THIS.Parent.Command2.Caption = "取消" THISFORM.disi(.T.) THIS.Parent.Tag = STR(RECNO()) APPEND BLANK ELSE THIS.Caption = "添加" THIS.Parent.Command2.Caption = "编辑" THISFORM.disi(.F.) ENDIF THISFORM.PageFrame1.Refresh
● Command2的Click事件代码: IF THIS.Caption = "编辑" THIS.Caption = "取消" THIS.Parent.Command1.Caption = "保存" THISFORM.disi(.T.) THIS.Parent.Tag = STR(RECNO()) ELSE THIS.Caption = "编辑" THIS.Parent.Command1.Caption = "添加" TABLEREVERT() THISFORM.disi(.F.) THISFORM.PageFrame1.Page1.Refresh ENDIF GO VAL(THIS.Parent.Tag) THISFORM.PageFrame1.Page1.Refresh
● Command3的Click事件代码: a = MESSAGEBOX("是否确定删除当前记录?",32+4+256,"删除记录") IF a = 6 THIS.Tag = THISFORM.PageFrame1.Page2.grdstudent.RecordSource DELE NEXT 1 PACK THISFORM.PageFrame1.Page2.grdstudent.RecordSource = THIS.Tag ENDIF 运行表单后,各输入框禁用,只有当按下“添加”或“编辑”按钮后,各输入框才被启用。此时两按钮分别变为:“保存”和“取消”,按下“保存”,可以将添加的记录或对记录所作的修改存盘,按下“取消”,则取消所作的添加或修改。 说明:函数TABLEREVERT()可以取消对当前记录的修改。
5 使用下拉列表框 【例10-8】修改例10-7,在数据环境中增加一个班级代码表,并且使用下拉列表框来输入“班级编号”(如图10-35)。 在例10-7的基础之上进行修改,具体步骤如下: (1) 修改数据环境, (2) 修改表单, (3) 修改组合框的属性 图10-35 使用下拉列表框输入“班级编号”
(4) 修改自定义方法disi()的代码: LPARAMETERS L THIS.PageFrame1.Page1.SetAll("Enabled",IIF(L,.T.,.F.),"TextBox") THIS.PageFrame1.Page1.SetAll("Enabled",IIF(L,.T.,.F.),"Optiongroup") THIS.PageFrame1.Page1.SetAll("Enabled",IIF(L,.T.,.F.),"editbox") THIS.PageFrame1.Page1.SetAll("Enabled",IIF(L,.T.,.F.),"Combobox") THIS.CommandGroup1.Enabled=IIF(L,.F.,.T.)
10.6 定制表 1 筛选表 1. 通过界面操作 2. 使用命令 SET FILTER命令的语法格式为: SET FILTER TO [〈逻辑表达式〉]
【例10-9】修改例10-6,使用筛选条件控制显示的记录(如图10-38)【例10-9】修改例10-6,使用筛选条件控制显示的记录(如图10-38) 图10-38 使用筛选
在例10-6的基础上进行修改,具体步骤如下: (1) 在第二页中增加两个命令按钮Command1、Command2,修改其Caption属性,并调整各控件的大小及位置。 (2) 编写代码。 ●Command1的Click事件代码: SET FILTER TO THIS.Parent.Refresh ● Command2的Click事件代码: SET FILTER TO NOT 性别 THIS.Parent.Refresh
2 限制对字段的访问 使用如下格式的命令限制对字段的访问: SET FIELDS TO {ALL |〈字段名表〉} 其中〈字段名表〉是希望访问的字段名称列表,各字段之间用“,”分开。ALL选项将取消所有的限制,而显示所有的字段。
10.7 数据表的索引 1 建立索引 1. 使用表设计器建立索引 使用表设计器建立索引的步骤如下: ① 从“文件”菜单中选择“打开”命令,选定要打开的表。 ② 从“显示”菜单中选择“表设计器”命令,表的结构将显示在“表设计器”中。 ③ 在“表设计器”中,选择“索引”选项卡,
④ 在“索引名”框中,键入索引名。 ⑤ 从“类型”列表中,选定索引类型。可以选择四种索引类型之一:主索引、候选索引、普通索引、唯一索引。 ⑥ 在“表达式”框中,键入作为记录排序依据的字段名。或者,通过选择表达式框后面的对话按钮,显示“表达式生成器”来建立表达式。 ⑦ 若想有选择地输出记录,可在“筛选”框中输入筛选表达式,或者选择该框后面的按钮来建立表达式。 ⑧ 选择“确定”。 2. 索引命令 若要创建普通索引可以使用INDEX命令, 其语法格式为: INDEX ON〈索引表达式〉TAG〈索引名〉 总复习教学进程
10.8 使用索引 1 对记录进行排序 1. 使用表设计器 若要建立一个索引来对记录排序: ① 打开要添加索引的表。 ② 在“表设计器”的“索引”选项卡中,输入索引名和索引类型。 ③ 在“表达式”一栏中,键入作为排序依据的字段名。或者,键入一个作为排序依据的表达式,或通过选择该方框后面的按钮,用“表达式生成器”建立一个表达式。 ④ 若要以降序显示记录,可选择索引名左侧的箭头按钮。按钮上的箭头方向向上时按升序排序,向下时则按降序排序。 ⑤ 选择“确定”。
2. 使用命令 在运行时刻,可以使用 SET ORDER命令改变表单中记录的顺序。其格式为: SET ORDER TO〈索引名〉 其中〈索引名〉为按照某个索引表达式建立的索引的标识名。 【例10-10】修改例10-6,使用索引来控制浏览窗口中记录显示的顺序。如图10-42。 图10-42 控制记录显示的顺序
设计步骤如下: • 首先在数据表Student中按学号、性别、出生日期、班级编号等建立普通索引 • 在例10-6的基础上修改代码。 • ● 编写表格第1列表头Header1的Click事件代码: • SET ORDER TO 学号 • GO TOP • THISFORM.Refresh • ●编写表格第3列表头Header1的Click事件代码: • SET ORDER TO 性别 • GO TOP • THISFORM.Refresh
●编写表格第4列表头Header1的Click事件代码: SET ORDER TO 出生日期 GO TOP THISFORM.Refresh ●编写表格第5列表头Header1的Click事件代码: SET ORDER TO 班级 GO TOP THISFORM.Refresh 运行表单,用鼠标单击表格某列的表头,即可按相应的字段顺序排列。
2 查找记录 1. 字符查找命令(FIND) ●语法格式为: FIND〈字符串〉|〈数值〉 2. 表达式查找命令(SEEK) ●语法格式为: SEEK〈表达式〉 3. 顺序查询命令(LOCATE) ● 语法格式为: LOCATE [〈范围〉] [FOR〈条件〉] 4. 继续查找命令(CONTINUE) ●命令格式为: CONTINUE
【例10-11】修改例10-8,为表单增加查找功能,可以分别“按学号查找”和“按姓名查找”,如图10-43所示。【例10-11】修改例10-8,为表单增加查找功能,可以分别“按学号查找”和“按姓名查找”,如图10-43所示。 图10-43 “按学号查找”和“按姓名查找”