Visual FoxPro 程序设计案例教程上机实训指导
主 编:梁 爽 何贤芳副主编:宋 华 张俊芳
杨 菲 康立权主 审:陶桂义

前 言
为认真落实我院“737355”人才培养模式,彻底贯彻执行以综合素质为核心,以能力为本位,以高技能应用型人才培养为目标的教改思路。我“计算机基础教研室”编辑了这本《Visual FoxPro 程序设计案例教程上机实训指导》,本书共分两部分。
第一部分 Visual FoxPro 程序设计实训指导,共包括八章26个上机实训指导,每个实训中都有具体的实训目的、知识要点、实训内容及实训过程。对于学生中水平较高的一部分同学,我们专门编制了高手进阶,让他们能在实际操作中一展风采。每个实训的最后都有一个自我测试,让学生自己检查一下对该实训的掌握情况,以提高和增强对Visual FoxPro学习的积极性。
第二部分 计算机等级二级考试(数据库)复习资料,共分笔试和上机两个内容。我们根据《重庆市计算机等级考试大纲(Visual FoxPro 程序设计部分)》的要求,参考历年二级考试试题编制而成。
本书在内容的选择、结构的编排上进行了精心的组织,重点突出实用性和操作性,力求结合学生实际和工作需要。争取学生通过七个月的实训操作后能初步掌握Visual FoxPro 程序设计的基本内容,而在三个月实训和今后的工作中能独立解决实际工作中遇到的具体问题。本书的二级考试复习资料进行了精心设计,力求使我校学生二级考试的过关率有大幅度的提升。
本书实训指导部分的第二、三章由宋华和张俊芳编写;第四章由陶桂义编写;第五、六章由梁爽编写;第七章由杨菲编写;第八、九章由康立权编写;计算机二级考试复习资料由何贤芳编写。
在本书的编写过程中,自始自终得到了学院领导的精心指导,特别是谭俊、付世平处长仔细审阅了全部书稿,并提出了许多宝贵意见,在此表示衷心的感谢。同时还要感谢常世晓和魏军等老师的大力支持和帮助。
计算机基础教研室
2007年5月18日
目 录第一部分 上机实训第1章 数据库基础知识(无)
第2章 Visual FoxPro 6.0基础知识
练习一 VFP6基础操作 …………………………………………………………… 1
第3章 数据库和表的设计与操作
练习一 数据表基本操作 …………………………………………………………… 8
练习二 记录的显示与定位 ………………………………………………………… 17
练习三 记录的修改与删除 ……………………………………………………… 23
练习四 索引与查找 ……………………………………………………………… 29
练习五 表的统计与计算 ………………………………………………………… 35
练习六 表的关联 ………………………………………………………………… 41
练习七 数据库基本操作 ………………………………………………………… 47
第4章 视图、查询与SQL语句
练习一 视图与查询练习二 SQL查询功能(一)
练习三 SQL查询功能(二)
练习四 SQL定义功能练习五 SQL操纵功能第5章 项目管理器的使用第6章 Visual FoxPro程序设计练习一 项目管理器基本操作和程序文件的建立练习二 程序基本结构:分支结构(一)
练习三 程序基本结构:分支结构(二)
练习四 程序基本结构:循环结构(一)
练习五 程序基本结构:循环结构(二)
练习六 程序基本结构:循环结构(三)
练习七 程序基本结构:循环结构(四)
第7章 表单设计与应用练习一 创建和管理表单与标签控件练习二 常用控件:命令按钮、命令按钮组、文本框
练习三 常用控件:编辑框、复选框、选项组、计时器、图像
练习四 常用控件:微调、页框、列表框、组合框、表格第8章 菜单设计、消息栏和工具栏练习一 菜单设计基本操作第9章 报表与标签练习一 报表与标签基本操作第二部分 计算机VF二级考试复习资料
第2章 Visual FoxPro 6.0基础知识练习一 VFP基本操作
【实验目的】
熟练掌握VFP启动、关闭;
熟练掌握内存变量的赋值、显示;
掌握运算符和表达式的用法;
熟练掌握常用函数使用。
【知识要点】
 一、启动VFP系统用三种方法练习启动VFP系统
 二、关闭VFP系统用四种方法练习关闭VFP系统
三、变量的赋值
1.赋值格式格式1:STORE 表达式 TO内存变量名清单格式2:内存变量名=表达式
2.表达式的显示
格式1:?[表达式清单] (若无表达式清单,则会输出一个换行符,若指定表达式清单,
则在下一行起始处输出表达式值)
格式2,表达式清单 (在当前的光标所在出直接输出表达式的值)
 四、日期格式设置与操作
1.将系统日期设为“yyyy-mm-dd”格式
SET CENTURY ON && 设置年份为4位数
SET MARK TO,-” && 设置日期分隔符为:-
SET DATE TO YMD && 设置为“年/月/日”格式
2.求当前系统的年份、月份、日期、星期、时间
YEAR(DATE()) && 求当前的年份
MONTH(DATE()) && 求当前的月份
DAY(DATE()) && 求当前的日期五、运算符和表达式的操作
1.算术运算符:**或^(乘方)、%(求余)、*(乘)、/(除)、+(加)、-(减)
2,字符运算符,+ 将两个字符型数据连接起来
- 将前一字符型数据尾部空格移到后一个字符型数据后,在连接
$ 格式为:串1$串2,若串1包含于串2中,则结果为.t.,否则为.f.
3.日期型运算符,+、-
日期 + 整数:为增加整数天后的日期
日期 - 整数:为减少整数天后的日期
日期 - 日期:为两日期间的天数
4.关系运算符:>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、
#或!=或<>(不等于)、=(等于)、==(全等于)
5,逻辑运算符:not(逻辑非),and(逻辑与),or(逻辑或)
运算符的优先级:
先执行算术运算、字符运算和日期运算,再执行关系运算,最后执行逻辑运算。
六、函数的应用
熟悉最常用的函数
【实验内容】
一﹑启动Visual FoxPro系统,并熟悉其环境二﹑关闭Visual FoxPro系统三﹑变量的的操作在命令窗口定义下列内存变量,并赋值,变量名和值如下表所示:
变量名
值的类型
值
A1
字符型
‘中国’
A2
货币型
$123.4500
B1
日期型
2007年3月26日
B2
数值型
123.4500
ABC
逻辑型
逻辑真
数组B(2,3)
分别为1,‘2’,.t.,$12.45,当天日期
C2
日期时间型
2004年1月23日15点30分30秒
四、运算符及表达式的操作,进行下列各种运算
1.2的3次方
2.“计算机,+“世界”;
3.“计算机,-“世界”;
4.“计算机,+,世界”;
5.“计算机,-,世界”
6.“计算机”$“计算机世界”
7.“计算机世界”$“计算机”
8.“123.45”>“21.50”
9.“Abcd”<“Abed”
10.系统日期减你的生日,计算你来到世界上有多少天?
11.系统日期加52,计算52天后是几月几日?
12.“abcd”=“Abcd” and,计算机”$“计算机世界”
五、写出下列式子在VFP中的表达式
1.A+B÷(C+D)
2.(-a)2b3+3mn
3.姓名为“张三”或“李四”
4.年龄在20至35岁的
5.年龄小于20岁和大于35岁的
6.出生日期在85年1月1日以前的
六、函数应用
  1.|-12.30|,ln5,求25的平方根,求45与62的最大值,
2,?ROUND(337.2007,3)
3,?LEN(“THIS IS MY BOOK”)
4,? Y = DATE()
5,? ABS(-3.2) > MAX(-11,23.2)
6,? MOD(22,5) < MIN(-23.2,22)
7,? STR(234.3456,6,2)+“32”
8,AA =“Visual foxpro 6.0”
BB =left(AA,4),CC=SUBSTR(AA,8,3)
BB,CC
【高手进阶】
数组的应用数组是按一定顺序排列的内存变量,数组中的各个变量成为数组元素,数组元素用数组名及该元素在数组中排列位置下标一起表示,下标的个数称为数组的维数。数组一经定义,它的每个元素就有了逻辑初值.f.,可用赋值命令给数组元素赋值。给数组名赋值就相当于给该数组的每个元素赋同一值。
例1.给定两个数组a(2)、b(2,2),分别赋值,然后显示数组变量的值。
a(1)=’abcd’ a(2)=.t.
b(1,1)=’计算机基础’ b(1,2)=‘数据库’ b(2,2)=123
2.函数的使用例2,abc=’共产主义青年团’
left(abc,2)+substr(abc,9,2)+right(abc,2)
例3.y=’hello’
’&y.world’
例4.?mod(12,5),mod(12,-5),mod(-12,5),mod(-12,-5)
例5,设有字符串“Visual foxpro 6.0”,用函数方法将foxpro改为FoxPro
【自我测试】
计算下列表达式的值。
(14%4=2) and (‘abd’>’abc’ or ‘Abc’$’AbdAchd’) or not(‘abc’=’abcd’)
【实验过程】
一、启动Visual FoxPro系统,并熟悉其环境(如右图)
1.双击桌面上的快捷方式图标(要自已建);
2.“开始/程序”中单击“Visual FoxPro 6.0”图标;
3.在“资源管理器”(或“我的电脑”)中双击“Visual FoxPro 6.0”程序图标二、关闭Visual FoxPro系统用下列五种方法中的任一种,练习关闭VFP系统
 1.单击窗口右上角的“关闭”钮;
 2.“文件/退出”;
3.单击窗口左上角的“控制菜单”图标-“关闭”钮;
 4.双击窗口左上角的“控制菜单”图标;
5.Alt+F4
三、变量的的操作
1.在命令窗口定义下列内存变量,并赋值,变量名和值如下表所示:
变量名
值的类型
值
A1
字符型
‘中国’
A2
货币型
$123.4500
B1
日期型
2007年3月26日
B2
数值型
123.4500
ABC
逻辑型
逻辑真
数组B(2,3)
分别为1,‘2’,.f.,$12.45,当天日期
C2
日期时间型
2004年1月23日15点30分30秒
[操作]启动Visual FoxPro 6.0 在命令窗口中输入命令:
A1= '中国' 或,中国” 或 [中国]
A2=$123.4500
B1={^2007/03/26}
B2=123.4500
ABC=.t.
Dimension B(2,3)
B(1,1)=1
B(1,2)=’2’
B(1,3)=.f.
B(2,1)=$12.45
B(2,2)=date()
C2={^2004/01/23 15:30:30}
四、运算符及表达式的操作,进行下列各种运算
1.2的3次方
[操作]在命令窗口输入:2^3 或2**3
2.“计算机,+“世界”
[操作]“计算机 世界”
3.“计算机,-“世界”
[操作]“计算机世界,
4.“计算机,+,世界”
[操作]“计算机 世界,
5.“计算机,-,世界”
[操作]“计算机 世界,
6.“计算机”$“计算机世界”
[操作].t.
7.“计算机世界”$“计算机”
[操作].f.
8.“123.45”>“21.50”
[操作].f.
9.“Abcd”<“Abed”
[操作].t.
10.系统日期减你的生日,计算你来到世界上有多少天?(设生于1983年5月15日)
[操作]?date()-ctod(‘05/15/83’)
11.系统日期加52,计算52天后是几月几日?
[操作]?date()+52
12.“abcd”=“Abcd” and,计算机”$“计算机世界”
[操作].f.
五、写出下列式子在VFP中的表达式
1.A+B÷(C+D)
[操作]A+B/(C+D)
2.(-a)2b3+3mn
[操作](-a)^2*b^5+3*m*n
3.姓名为“张三”或“李四”
[操作]姓名=’张三’ or 姓名=’李四’
4.年龄在20至35岁的
[操作]年龄>=20 AND 年龄<=35
5.年龄小于20岁和大于35岁的
[操作]年龄<20 OR 年龄>35
6.出生日期在85年1月1日以前的
[操作]出生日期<CTOD(“01/01/85”)
六、写出相应的函数和函数的值。
1.用函数表示下列计算式:|-12.30|,ln5,求25的平方根,求45与62的最大值
[解答]abs (-12.30),log(5),sqrt(25),max(45,62)
进行下列函数的运算
2,ROUND(337.2007,3)
[操作]? ROUND(337.2007,3) 结果显示:337.201
3,LEN(“THIS IS MY BOOK”)
[操作]? LEN(“THIS IS MY BOOK”) 结果显示:15
4,Y = DATE()
[操作]Y = DATE() →? Y 结果显示:当前系统日期
5,ABS(-3.2) > MAX(-11,23.2)
[操作]? ABS(-3.2) > MAX(-11,23.2) 结果显示:.F,
6,MOD(22,5) < MIN(-23.2,22)
[操作]? MOD(22,5) < MIN(-23.2,22) 结果显示,.F,
7,STR(234.3456,6,2)+“32”
[操作]? STR(234.3456,6,2)+“32” 结果显示:234.3532
8,AA =“Visual foxpro 6.0”
BB =left(AA,4)
CC=SUBSTR(AA,8,3)
[操作]依次输入上面三句语句后,再输入? BB,CC 结果显示:Visu fox
【高手进阶解答】
例1.定义两个数组a(2)、b(2,2),然后分别赋值,最后显示数组变量的值。
a(1)=’abcd’ a(2)=.t.
b(1,1)=’计算机基础’ b(1,2)=‘数据库’ b(2,2)=123
[解答]dimension a(2),b(2,2)
a(1)='abcd'
a(2)=.t.
b(1,1)= '计算机基础'
b(1,2)='数据库'
b(2,2)=123
a(1),a(2),b(1,1),b(1,2),b(2,1),b(2,2)
显示的结果为:’abcd’,t,’计算机基础’ ‘数据库’,f,123
2.函数的使用要先了解函数的用法。
例2,abc=’共产主义青年团’
left(abc,2)+substr(abc,9,2)+right(abc,2)
[解答]left(表达式,n)是从字符串的左边取长度为n的子串,substr(表达式,n[,m])从字符串表达式中提取从n开始的m个子串,right(表达式,n)就是从字符串右边取n个字符。
显示的结果为:‘共青团’
例3.y=’hello’
’&y.world!’
[解答]&<字符型变量>[.]是宏替换函数,就是将&<字符型变量>[.]换成字符变量的值
显示的结果为:hello world!
例4.?mod(12,5),mod(12,-5),mod(-12,5),mod(-12,-5)
[解答]mod(表达式1,表达式2)就是求表达式1对表达式2的余数。
它的规律是 mod(n,-m)=mod(n,m)-m mod(-n,m)=m-mod(n,m)
mod(-n,-m)=-mod(n,m)
显示的结果为:2 -3 3 -2
例5.设有字符串“Visual foxpro 6.0”,用函数方法将foxpro改为FoxPro
[解答]
AA =“Visual foxpro 6.0” && 赋值
BB = SUBSTR(AA,1,7)+UPPER(SUBSTR(AA,8,1))+SUBSTR(AA,9,2);
+UPPER(SUBSTR(AA,11,1))+SUBSTR(AA,12,6)
&& SUBSTR函数:截取子字符串;UPPER函数:转为大写字母
BB
或:
AA =“Visual foxpro 6.0”
BB = STUFF(AA,8,1,”F”) && STUFF函数:用字串2替换字串1中的一部分
CC = STUFF(BB,11,1,”P”)
CC
【自我测试解答】
计算下列表达式的值。
(14%4=2) and (‘abd’>’abc’ or ‘Abc’$’AbdAchd’) or not(‘abc’=’abcd’)
[解答]显示的结果:.t,(自己分析计算的顺序)
第3章 数据库和表的设计与操作练习一 数据表基本操作
【实验目的】
1.熟练掌握用“表设计器”建立数据表的方法;
2.能够正确输入表记录;
3.掌握表文件的打开、关闭操作;
4.掌握表结构的显示、修改方法。
【知识要点】
1.使用表设计器创建自由表方法一:使用菜单方式建立表结构;
(1)(在“项目管理器”中)选“数据/自由表”-“新建” -“新建表”- 输入表名并确定存放位置-“保存”按钮。
(2)“文件/新建”-(类型)选“表”-“新建文件”钮-输入表名并确定存放位置。
方法二:使用命令方式建立表结构。
格式:CREATE <表名>
功能:创建以指定表名命名的表结构。
2.表数据的输入
(1)立即输入:在建立表结构后,立即输入记录(此时是在“编辑”状态)
(2)追加输入:建立表以后,再打开此表,进行输入记录
①,项目管理器”)“数据/自由表”- 选定表-“浏览”钮-“显示/追加方式”
②(先打开表,“显示/浏览”进入浏览状态)“表/追加新记录”(追加一条记录)
③ (先打开表,“显示/浏览”进入浏览状态),显示/追加方式” (追加多条记录)
④ (先打开表) APPEND [BLANK] (有“BLANK”项,则添加一条空白记录)
注:M型字段的录入:双击M字段,录入数据;
G型字段的录入:双击字段 -“编辑/插入对象”- 选“类型”- 选择文件
(3)成批追加:将指定表中的记录追加到当前表的尾部
APPEND FROM 表名 [FOR/WHILE 条件式][FIELDS 字段名表]
注:两表要追加的字段,类型要相同
3.打开表
(1)“文件/打开”-(类型)选“表”- 选定表-“确定”
(2)USE <表名>
4.关闭表
(1)USE
(2)退出VFP
5.表结构的显示与修改
显示:LIST|DISPLAY STRUCTURE
修改:(1)菜单方式:打开要修改的数据表,进入表设计器对表结构进行修改。
(2)MODIFY STRUCTURE
【实验内容】
1.在D盘根目录下建立一个以学生自己的学号命名的文件夹。
2.建立自由表“学生表”,保存至学号文件夹中,表的结构如表3-1所示。
表3-1 学生表.DBF表文件的结构
字 段 名
字 段 类 型
字 段 宽 度
小 数 点
索 引 否
学 号
字符型
8
姓 名
字符型
8
性 别
字符型
2
出生日期
日期型
8
团 员 否
逻辑型
1
入学成绩
数值型
6
2
班 级
字符型
10
照 片
通用型
4
简 历
备注型
4
(1)创建表结构,(在“表设计器”中输入表内容:字段名、类型、宽度等)
(2)输入表记录:
用立即输入方式输入如表3-2所示的信息,只输入三条记录即可,此时是在编辑状态下输入表记录。
注意:备注型数据和通用型数据的输入方法。
表3-2 学生.DBF记录数据学号
姓名
性别
出生日期
团员否
入学成绩
班级
简历
照片
05011001
李平
女
10/21/85
.T.
502.00
计算机

05011002
章立新
男
02/14/86
.T.
489.50
计算机

05021001
林敏
女
08/01/85
.T.
498.00
金融

05021002
刘欣
男
11/05/84
.F.
500.00
金融

05031001
李国华
男
11/21/85
.T.
482.00
会计

05031002
陈炳章
男
06/01/83
.T.
466.00
会计

3.在某商场管理系统中,以下2个数据表反映一个月内有关手机销售、库存情况。建立数据表Stockll和Sell,用浏览中的“追加方式”输入表记录。
(1)商品月库存表(Stockll.dbf)
商品代码
品名
型号
单价
库存数量
库存金额
2011
诺基亚
N8250
2250.00
16
2120
诺基亚
3310
990.00
18
4025
摩托罗拉
8088
2090.00
12
3122
爱立信
T29
1380.00
14
5203
西门子
2118
1470.00
18
(2)销售明细表(Sell.dbf)
商品代码
日期
销售数量
营业员
2120
2001-11-12
5
方虹
4025
2001-11-12
6
方虹
3122
2001-11-13
4
李之和
2120
2001-11-14
10
张广河
按以上数据表内容创建Stockll.dbf和Sell.dbf数据表文件,录入数据。
4.表文件的操作:
(1).打开表:练习用菜单方式和和命令方式打开学生表.DBF。
(2).显示表结构:练习显示学生表.DBF的表结构
(3).修改表结构:
① 修改学生表.DBF的入学成绩字段为入学总分
② 给学生表.DBF增加一个年龄字段。
(4).关闭表:关闭学生表.DBF
【高手进阶】
建立如下表文件,并输入数据,
计算机小组表文件JSJ.DBF:
学号 姓名 性别 民族 政治面目 来源地区
1101 李晓芸 女 朝鲜族 团员 吉林省
1104 王景录 男 汉族 党员 四川省
1123 欧小飞 男 汉族 预备党员 重庆市
1108 唐锐 男 苗族 无 贵州省
1109 王小云 女 藏族 团员 西藏
文艺小组表文件WY.DBF:
学号 姓名 性别 民族 政治面目 来源地区
1101 李晓芸 女 朝鲜族 团员 吉林省
1114 伍小录 男 汉族 团员 四川省
1123 欧小飞 男 汉族 预备党员 重庆市
1108 唐锐 男 苗族 无 贵州省
1135 杨兵 男 藏族 党员 重庆市
[注意观察这两个表的结构是完全相同的,记录大多相同,思考一下,能否用复制或向导的方法建立第二个表。]
【自我测试】
1.用同样的方法建立如下数据表,并输入数据。可先输入两条记录,再以追加的方式输入其它的记录。
表3-4 书库.DBF
书号
书名
作者
定价
册数
总金额
JSJ6424
软件工程
刘小会
30.00
69
2070.00
SX23535
高等数学
林莉
18.80
306
5752.80
JJ63376
经济法
王继成
22.30
238
5307.40
YW43679
大学语文
张继忠
19.00
112
2128.00
2.建立如下表文件,并输入数据。
学生档案表文件:XSDA.DBF
学号 姓名 性别 民族 政治面目 入学成绩
0101  李芸 女 朝鲜族 团员 666.00
0104 王景 男 汉族 党员 550.00
0123 李明 男 汉族 预备党员 700.00
学生成绩表文件:XSCJ.DBF
学号 姓名 语文 数学 英语 总分
0101  李芸 88.5 86.8 70.0 245.30
0104 王景 90.0 79.0 78.5 247.50
0123 李明 67.0 88.0 89.0 244.00
【实验过程】
1.在D盘根目录下建立一个以学生自己的学号命名的文件夹。
[提示]:可设置自己文件夹所在位置为默认路径,方便后续作业的保存。
如在命令窗口中运行命令:SET DEFAULT TO d:\123456 完成默认路径的设置。
2.建立自由表“学生表.DBF”,保存至学号文件夹中,表的结构如表3-2所示。
表3-2 学生表.DBF文件的结构字 段 名
字 段 类 型
字 段 宽 度
小 数 点
索 引 否
学 号
字符型
8
姓 名
字符型
8
性 别
字符型
2
出生日期
日期型
8
团 员 否
逻辑型
1
入学成绩
数值型
6
2
班 级
字符型
10
照 片
通用型
4
简 历
备注型
4
[操作]
(1)创建表结构:
方法一:使用菜单方式建立表结构。
操作步骤:
① 在Visual FoxPro系统主菜单下,打开“文件”菜单,选择“新建”选项,弹出“新建”窗口,选择“表”,再单击“新建文件”按钮,进入“创建”窗口,在“创建”窗口,输入要建立的表的名字“学生表”,然后单击“保存”按钮,进入“表设计器”窗口,如图3-1所示;

图3-1,表设计器”窗口1
② 在图3-1中,可以逐一定义表中所有字段的名字、类型和宽度等。如果根据表3-2的内容定义“学生表”的结构,就要在“表设计器”窗口输入以下信息,如图3-2所示;

图3-2,表设计器”窗口2
③ 当表中所有字段的属性定义完成后,单击“确定”按钮,进入系统窗口,如图3-3所示;

图3-3 Microsoft Visual FoxPro窗口
④ 在图3-3中,根据自己的需要,如果选择“是”,可以立即向表文件中输入数据,如果选择“否”,以后再输入数据,将结束表结构的建立。
方法二:使用命令方式建立表结构。
① 当在命令窗口输入CREATE 学生表,将进入如图3-1“表设计器”窗口,其他操作与方法一相同;
② 当在命令窗口输入CREATE?,将进入,表设计器”窗口,其他操作与方法一相同。
(2).输入表记录方法一:创建表结构后立即输入数据当表中的所有字段定义完成之后,单击“确定”按钮,出现如图3-3所示的对话窗口,单击“是”按钮,进入数据输入窗口,即可向表中输入数据。输入数据有两种方式,一是浏览方式,如图3-4(a)所示;二是编辑方式,如图3-4(b)所示。两种方式可以通过“显示”菜单下的“编辑”、“浏览”选项相互转换。

图3-4 输入数据窗口向表中输入数据时,应注意以下几个问题。
① 在输入数据时,当输入内容填满一个字段的宽度时,光标会自动跳到下一个字段;内容不满一个字段的宽度时,可使用Tab键或单击鼠标将光标移到下一个字段。
② 对数值型数据,只需输入数字部分,不需要输入小数点。
③ 输入逻辑型字段时,只需输入“T”或“F”即可,不分大小写,不需要输入逻辑数据两边的圆点。
④ 输入日期型数据时,只需输入月、日、年格式的数字,不需输入“/”,要求输入的日期是有效日期,否则系统将提示日期无效。
⑤ 备注型字段和通用型字段的输入方法与其他类型的数据输入方法不同,不能在编辑或浏览窗口中直接输入,必须用下面方法完成,
输入备注型字段时,将光标定位到相应的备注型字段上,按Ctrl+Home键或Ctrl+PageUp键或直接双击,进入Visual FoxPro Visual FoxPro 编辑窗口,在编辑窗口进行输入等操作,输入完毕,按Ctrl+W键或单击右上角的“关闭”按钮,即可关闭“编辑”窗口。输入内容的备注型字段会显示Memo,表示该备注型字段非空。
输入通用型字段内容时,双击浏览或编辑窗口中的通用型字段,进入Visual FoxPro 编辑窗口,然后在如图3-5所示的窗口中,选择“编辑”菜单中的“插入对象”命令,系统弹出“插入对象”对话框,如图3-6所示,在该对话框窗口的“对象类型”中选择需要的对象类型。在“插入对象”窗口中,如果选择,新建”选项,则进入创建一个对象窗口,在对象创建好之后,退出此窗口;如果选择“由文件创建”选项,则进入另一个“插入对象”窗口,如图3-7所示,输入要插入的文件名,或单击“浏览”按钮,选择需要插入对象的文件,单击“确定”按钮即可。实际上,表文件的通用型字段的内容与备注型字段一样存储在与表文件同名、扩展名为.FPT的文件中。

图3-5 选择插入对象

图3-6,插入对象”窗口

图3-7,插入对象”窗口方法二:以追加的方式输入数据建立表结构时,如果用户没有选择立即方式向表输入数据,可以用追加的方式向表输入数据,操作步骤如下。
① 打开要输入数据的自由表。
② 在Visual FoxPro系统主菜单下,单击“显示”菜单,选择“编辑”选项,可进入表的“编辑”窗口,再单击“显示”菜单下的“追加方式”选项,即可向表文件中追加数据。如图3-8所示。

图3-8,编辑”窗口
③ 也可以在“显示”菜单下,选择“浏览”选项,再进行“追加”,同样可以达到向表中输入数据或修改数据的目的,如图3-9所示。

图3-9,浏览”窗口
3.在某商场管理系统中,以下2个数据表反映一个月内有关手机销售、库存情况。
 [操作]
(1)商品月库存表(Stockll.dbf)
商品代码
品名
型号
单价
库存数量
库存金额
2011
诺基亚
N8250
2250.00
16
2120
诺基亚
3310
990.00
18
4025
摩托罗拉
8088
2090.00
12
(2)销售明细表(Sell.dbf)
商品代码
日期
销售数量
营业员
2120
2001-11-12
5
方虹
4025
2001-11-12
6
方虹
3122
2001-11-13
4
李之和
2120
2001-11-14
10
张广河
根据表文件数据决定数据表的结构,依据上述方法建立表结构。输入表记录,建立数据表。
4.表文件的操作:
[操作]
(1)打开表:练习用菜单方式和和命令方式打开学生表(略)
注意:用命令“USE 表名”打开表的时候,表名前应含路径,为减少麻烦,可在刚打开VFP的时候,用命令指定默认路径。如:SET DEFAULT TO D:\VFP程序设计\表\
(2)显示表结构:练习显示学生表的表结构
USE 学生表
LIST STRUCTURE
(3)修改表结构:
① 修改学生表的入学成绩字段为入学总分(略)
② 给学生表增加一个年龄字段。
注意:要以独占方式打开表,在“表设计器”中修改。
(4)关闭表:关闭学生.DBF
USE
【高手进阶解答】
建立如下表文件,并输入数据,
计算机小组表文件JSJ.DBF:
学号 姓名 性别 民族 政治面目 来源地区
1101 李晓芸 女 朝鲜族 团员 吉林省
1104 王景录 男 汉族 党员 四川省
1123 欧小飞 男 汉族 预备党员 重庆市
1108 唐锐 男 苗族 无 贵州省
1109 王小云 女 藏族 团员 西藏
文艺小组表文件WY.DBF:
学号 姓名 性别 民族 政治面目 来源地区
1101 李晓芸 女 朝鲜族 团员 吉林省
1114 伍小录 男 汉族 团员 四川省
1123 欧小飞 男 汉族 预备党员 重庆市
1108 唐锐 男 苗族 无 贵州省
1135 杨兵 男 藏族 党员 重庆市
[操作]
注意观察这两个表的结构是完全相同的,记录大多相同,思考一下,能否用复制或向导的方法建立第二个表。
根据表文件数据决定数据表的结构,依据上述方法建立表结构。输入表记录,建立数据表JSJ.DBF。观察两表结构相同,可以用向导或者后边将要讲到的复制操作建立第二个数据表。
【自我测试解答】
1,同样的方法建立如下数据表,并输入数据。
表3-4 书库.DBF
书号
书名
作者
定价
册数
总金额
JSJ6424
软件工程
刘小会
30.00
69
2070.00
SX23535
高等数学
林莉
18.80
306
5752.80
JJ63376
经济法
王继成
22.30
238
5307.40
YW43679
大学语文
张继忠
19.00
112
2128.00
[操作]
(1)根据给出数据表的记录值,确定书库表的结构为(表3-5所示),
表3-5 书库.DBF的结构字 段 名
字 段 类 型
字 段 宽 度
小 数 位
索 引 否
书号
字符型
7
书名
字符型
10
作者
字符型
6
定价
数值型
5
2
册数
数值型
3
总金额
数值型
7
2
依据上述方法建立表结构,注意字段类型和字段宽度的设置。
(2)输入表记录可以用立即输入方法输入前两条记录,再用追加方法输入后面记录。熟练掌握表记录的输入方式。
2.建立如下表文件,并输入数据。
[操作](略)
练习二 记录的显示与定位
【实验目的】
1.显示表记录(LIST与DISPLAY)
2.记录指针的定位(绝对移动GO与相对移动SKIP)
【知识要点】
1.显示表记录
LIST | DISPLAY [范围] [FOR/WHILE <条件表达式>] [FIELDS <字段名表>] [OFF] [TO PRINT/FILE <文件名>]
2.记录指针的定位方法一:在“浏览”窗口中移动指针方法二:用命令移动指针
(1)绝对移动:GO | GOTO <N>
(2)相对移动:SKIP <N>
【实验内容】 
[提示:以下题目在学生表中操作]
1.显示记录,
(1)显示前5条记录
(2)显示3-8条记录,不显示记录号
(3)显示表记录只显示姓名、学号、班级三个字段
(4)只显示当前一条记录
(5)只显示当前一条记录的学号,姓名两个字段
(6)显示是团员的学生
(7)显示是团员的女生
(8)显示入学成绩大于550分的男生
(9)显示入学成绩大于530分的女生的学号、姓名、性别和出生年月
(10)显示83年出生的学生
2.定位操作
(用菜单方式和命令方式各试一次,看哪种方式更方便?)
(1)绝对移动
① 将指针移到第三条记录,再显示其后连续四条记录
② 移指针到第七条记录,再移到第五条记录,并显示此记录
③ 显示第二条到第七条这六条记录
④ 将指针移到首记录,并显示此记录
⑤ 将指针移到尾记录,并输出函数EOF()和函数RECNO()的值
(2)相对移动
① 将指针移到第五条记录,再前进4步,又后退六步,这是第几条记录
② 回到第一条记录,移动指针到第七条记录,再移到第五条记录,并显示此记录
③ 回到第一条记录,显示第三条到第七条这五条记录
④ 回到第一条记录,显示第八条记录
⑤ 将指针移动到文件尾输出函数EOF()和函数RECNO()的值
(3)综合应用:
定位到首记录,测试文件首和当前记录函数的值;定位到文件首,测试文件首和当前记录函数的值;定位到尾记录,测试文件尾和当前记录函数的值;定位到文件尾,测试文件尾和当前记录的值。
【高手进阶】
在学生.DBF中,显示所有表记录,用函数测试当前记录号。
定位当前记录为3号记录,显示3—6号记录,并用函数测试当前记录号。
定位当前记录指针到尾记录,用函数测试当前记录号,指针下移一位,用函数测试当前记录号和是否到文件尾。
定位记录指针到3号记录,显示余下的记录,并用函数测试当前记录号和是否到文件尾。
显示83年出生的入学成绩大于500分的同学记录。
【自我测试】
以独占的方式打开数据表:书库.DBF。
给数据表书库增加一个字段(出版社,C,20)
定位记录指针到3号记录,修改定价为:32.00
定位记录指针到2号记录,显示2----6号记录,不显示记录号修改册数大于200的出版社为:高等教育出版社显示总金额小于3000的所有记录的书号、书名、总金额字段
定位记录指针到8号记录,测试函数EOF()和函数RECNO()的值定位到4号记录,显示4号至尾记录将作者为刘小会的书名改为:《软件工程概论》
将书名为“基础会计”的定价增加10%
【实验过程】
1.显示记录:[设数据表已打开]
(1)显示前5条记录
[操作] LIST NEXT 5
(2)显示3-8条记录,不显示记录号
[操作] GO 3
LIST NEXT 6
(3)显示表记录只显示姓名、学号、班级三个字段
[操作] LIST FIELDS 姓名,学号,班级
(4)只显示当前一条记录
[操作] DISPLAY
(5)只显示当前一条记录的学号,姓名两个字段
[操作] DISPLAY FIELDS 学号,姓名
(6)显示是团员的学生
[操作] LIST FOR 团员
(7)显示是团员的女生
[操作] LIST FOR 团员 AND 性别=“女”
(8)显示入学成绩大于550分的男生
[操作] LIST FOR 入学成绩>550 AND 性别=“男”
(9)显示入学成绩大于530分的女生的学号、姓名、性别和出生年月
[操作] LIST FOR 入学成绩>530 AND 性别=“女” FIELDS 学号,姓名,性别,出生年月
(10)显示83年出生的学生
[操作] LIST FOR YEAR(出生年月)=1983
2.定位操作
(1)绝对移动
① 将指针移到第三条记录,再显示其后连续四条记录
[操作] GO 3
LIST NEXT 4
② 移指针到第七条记录,再移到第五条记录,并显示此记录
[操作] GO 7
GO 5
DISPLAY
③ 删除第二条到第七条这六条记录
[操作] GO 2
DELELT NEXT 7
④ 将指针移到首记录,并显示此记录
[操作] GO TOP
DISPLAY
⑤ 将指针移到尾记录,并测试函数EOF()的值和函数RECNO()的值
[操作] GO BOTTOM
EOF(),RECNO()
(2)相对移动
① 将指针移到第五条记录,再前进4步,又后退六步,这是第几条记录
[操作] GO 5
SKIP 4
SKIP -6
RECNO()
② 回到第一条记录,移动指针到第七条记录,再移到第五条记录,并显示此记录
[操作] GO TOP
GO 7
SKIP -2
DISPLAY
③ 回到第一条记录,显示第三条到第七条这五条记录
[操作] GO TOP
SKIP 2
LIST NEXT 5
④ 回到第一条记录,删除第八条记录
[操作] GO TOP
SKIP 7
DELETE
⑤ 将指针移动到文件尾测试EOF()的值和函数RECNO()的值
[操作] GO BOTTOM
SKIP
EOF(),RECNO()
(3)综合应用:
定位到首记录,测试文件首和当前记录函数的值;定位到文件首,测试文件首和当前记录函数的值;定位到尾记录,测试文件尾和当前记录函数的值;定位到文件尾,测试文件尾和当前记录的值。
[操作]GO TOP
?BOF(),RECNO()
SKIP -1
?BOF(),RECNO()
GO BOTTOM
?EOF(),RECNO()
SKIP
?EOF(),RECNO()
【高手进阶解答】
在学生.DBF中,显示所有表记录,用函数测试当前记录号。
[操作] LIST
?RECNO()
定位当前记录为3号记录,显示3—6号记录,并用函数测试当前记录号。
[操作] GO 3
LIST NEXT 4
?RECNO()
定位当前记录指针到尾记录,用函数测试当前记录号,指针下移一位,用函数测试当前记录号和是否到文件尾。
[操作] GO BOTTOM
?RECNO()
SKIP
?RECNO(),EOF()
定位记录指针到3号记录,显示余下的记录,并用函数测试当前记录号和是否到文件尾。
[操作] GO 3
LIST REST
?RECNO(),EOF()
显示83年出生的入学成绩大于500分的同学记录。
[操作] LIST FOR YEAR(出生日期)=1983 AND 入学成绩>500
【自我测试解答】
独占的方式打开数据表:书库.DBF。
[操作] USE 书库 EXCLUSIVE 或 在打开窗口选取“独占”方式
给书库表增加一个字段(出版社,C,20),在表设计器中完成。
定位记录指针到3号记录,修改定价为:32.00
[操作] GO 3
REPLACE 定价 WITH 32.00
定位记录指针到2号记录,显示2----6号记录,不显示记录号
[操作] GO 2
LIST NEXT 5 OFF
修改册数大于200的出版社的值为:高等教育出版社
[操作] REPLACE 出版社 WITH,高等教育出版社” FOR 册数>200 ALL
显示总金额小于3000的记录的书号、书名、总金额
[操作] LIST FOR 总金额<3000 FIELDS 书号,书名,总金额
定位记录指针到8号记录,测试函数EOF()和函数RECNO()的值
[操作] GO 8
EOF(),RECNO()
定位到4号记录,显示4号至尾记录
[操作] GO 4
LIST REST
将作者为刘小会的记录的书名改为:《软件工程概论》
[操作] REPLACE 书名 WITH,软件工程概论” FOR 姓名=“刘小会”
将书名为“基础会计”的记录的定价增加10%
[操作] REPLACE 定价 WITH 定价*1.1 FOR 书名=“基础会计”
练习三 记录的修改与删除
【实验目的】
熟练掌握表记录的修改方法
掌握成批替换命令的应用
掌握追加记录命令、成批追加命令、插入记录的应用
掌握表记录的删除操作
【知识要点】
表记录的修改(BROWSE、EDIT)
成批替换(REPLACE)
追加记录(APPEND)和成批追加插入记录(INSERT)
表记录的删除(DELETA、RECALL、PACK、ZAP)
【实验内容】 
1.修改记录:(在“学生”表中)
(1)将3号记录的学号改为“05061008”
(2)将5号记录的简历改为以下内容:
,1996年被评为“三好学生”。”
(3)将”李平”的入学成绩改为:520.00,班级改为:电子商务
(4)将,林敏”的学号改为:“050801002”
(5)将6号记录的班级改为:“电子”
2.替换记录(在“学生”表中)
(1)将所有学生的入学成绩增加10分
(2)计算机班学生的入学成绩增加10%
(3)金融班女生的入学成绩增加20分
(4)把会计班改为电子班
(5)增加一个字段“年龄”[N型、2],并计算学生的年龄,填入表中
(6)所有学生的年龄加10岁
(7)增加一个字段“籍贯”[N型、10],将所有女生的籍贯填为“重庆”
3.追加记录 (在“学生”表中)
(1)打开学生.DBF,将其出生日期设置为空,在其中追加如表3-6中的两条记录:
表 3-6 要追加的记录学号
姓名
性别
出生日期
团员否
入学成绩
班级
简历
05031004
张小红
女
07/08/85
.F.
508.00
电子
05031008
刘杨
男
11/05/86
.T.
550.00
金融
(2)在数据表学生的末尾追加一条空白记录
(3)将数据表学生中的记录追加到数据表成绩中
4.插入记录(在“学生”表中)
(1)移指针到第五条记录,在它的后面插入一条空白记录
(2)在第一条记录的前面插入一条记录(内容自定)
(3)在第六条记录的前、后各插入一条空白记录(要求用的命令语句最少)
5.删除记录(在“学生”表中)
(1)用单击小方块的方法随意为几条记录作删除标记,然后取消这些标记;
(2)用命令方式作标记:(作标记后,立即撤消标记,好做下一题)
① 删除前4条记录
② 删除当前一条记录
③ 删除第4条记录
④ 删除姓“李”的学生
⑤ 删除金融班的男生
⑥ 删除会计班的女生或计算机班的男生
  ⑦ 删除86年出生的男生 
⑧ 删除金融班的男生团员记录
⑨ 删除入学成绩在500-599分的学生记录
⑩ 删除入学成绩在450-599分的金融班学生记录
(3)恢复上述加了删除标记的记录
(4)物理删除6—8号记录
(5)物理删除所有记录,只留表结构
(6)用菜单方式,再做一次删除操作
【高手进阶】
1.修改记录(在XSDA 表中)
(1)在浏览窗口中修改6号记录的入学日期为:99年9月1日
(2)在编辑窗口中修改英语系学生的人数为60
2.替换记录(在XSCJ表中)
(1)计算表中“总分”字段的值,并填在表中
(2)计算表中“平均分”字段的值,并填在表中
(3)对于总分大于450分的学生,“级别”字段中填写“优秀”
(4)对于英语成绩不及格的学生,英语成绩加10分
(5)对于平均分小于60的学生,“级别”字段中填写“不合格”
3,追加、插入、删除记录(在XSDA 表中)
(1)给Xsda表追加一条空白记录
(2)在1号记录的前面插入一条空白记录
(3)在5号记录的后面插入如下一条记录系别
班级
学号
姓名
性别
年龄
入学日期
婚否
人数
中文系
102202
05031004
张红
女
20
07/08/98
.F.
54
(4)逻辑删除3至8号记录
(5)逻辑删除数学系的所有男同学记录
(6)逻辑删除99年以前入学的英语系的女同学记录
(7)恢复(4)题中逻辑删除的记录
(8)物理删除(5)中逻辑删除的记录
【自我测试】
说明:以下题目在Stockll表中操作。
1,修改3号记录的单价为:2050.00元
2,计算表中“总金额”字段的值,并填写在表中
3,将诺基亚品牌的手机单价提高15%
4,将非诺基亚品牌的手机的库存数量增加10部,库存金额减少50%
5,逻辑删除单价小于1000元的记录
6,逻辑删除商品代码以2开头的记录
7,恢复上述逻辑删除的记录
8,给该表追加一条空白记录
9,在3号记录的前面插入如下一条记录

10.物理删除表的最后一条记录
【实验过程】
[提示:以下操作在学生表中操作]
1.修改记录,
(1)将3号记录的学号改为“05061008”
[操作] BROWSE或 REPLACE 学号 WITH,05061008” RECORD 3
在浏览窗口修改其值
(2)将5号记录的简历改为以下内容:
,1996年被评为“三好学生”。”
[操作] 在编辑窗口或浏览窗口均可修改。
(3)修改”李平”的入学成绩为:520.00,班级为:电子商务
[操作] REPLACE 入学成绩 WITH 520.00,班级 WITH,电子商务” FOR 姓名=”李平”
(4)用浏览的形式修改数据,修改姓名为“林敏”的记录的学号为:“050801002”
[操作] BROWSE
在浏览窗口修改其值
(5)将6号记录的班级改为电子
[操作] BROWSE
在浏览窗口修改其值
或 REPLACE 班级 WITH,电子” RECORD 6
2.替换记录
(1)将所有学生的入学成绩增加10分
[操作] REPLACE 入学成绩 WITH入学成绩+10
(2)计算机班学生的入学成绩增加10%
[操作] REPLACE 入学成绩 WITH 入学成绩*1.1 FOR 班级=”计算机”
(3)金融班女生的入学成绩增加20分
[操作] REPLACE 入学成绩 WITH 入学成绩+20 FOR班级=”金融”AND 性别=”女”
(4)把会计班改为电子班
[操作] REPLACE 班级 WITH,电子” FOR 班级=”会计”
(5)增加一个字段“年龄”[N型、2],并计算学生的年龄,填入表中
修改表结构,增加字段“年龄”;再用命令:
[操作] REPLACE 年龄 WITH YEAR(DATE()— 出生日期)
(6)所有学生的年龄加10岁
[操作] REPLACE 年龄 WITH 年龄+10 ALL
(7)增加一个字段“籍贯”[N型、10],将所有女生的籍贯填为“重庆”
[操作] 修改表结构,增加字段“籍贯”;再用命令,
REPLACE 籍贯 WITH,重庆” FOR性别=”女”
3.追加记录
(1)打开学生.DBF,将其出生日期设置为空,在其中追加如表3-6中的两条记录:
表 3-6 要追加的记录学号
姓名
性别
出生日期
团员否
入学成绩
班级
简历
05031004
张小红
女
07/08/85
.F.
508.00
电子
05031008
刘杨
男
11/05/86
.T.
550.00
金融
[操作] APPEND
弹出编辑窗口,可输入要追加的记录。
(2)在数据表学生的末尾追加一条空白记录
[操作] APPEND BLANK
(3)将数据表学生中的记录追加到数据表成绩中
[操作] USE 成绩
APPEND FROM 学生
4.插入记录
(1)移指针到第五条记录,在它的后面插入一条空白记录
[操作] GO 5
INSERT BLANK
(2)在第一条记录的前面插入一条记录(内容自定)
[操作] GO TOP
INSERT BEFORE
(3)在第六条记录的前、后各插入一条空白记录(要求用的命令语句最少)
[操作] GO 6
INSERT BEFORE BLANK
SKIP
INSERT BLANK
5.删除记录(作标记与彻底删除有何区别,不要真的删除了,不然无法继续操作)
(1)用单击小方块的方法随意为几条记录作删除标记,然后取消这些标记;
[操作](略)
(2)用命令方式作标记:(只作标记,作标记后,立即撤消标记,好做下一题)
① 删除前4条记录
[操作] DELETE NEXT 4
② 删除当前一条记录
[操作] DELETE
③ 删除第4条记录
[操作] DELETE RECORD 4
④ 删除姓“李”的学生
[操作] DELETE FOR SUBSTR(姓名,1,2) =”李”
⑤ 删除金融班的男生
[操作] DELETE FOR班级=”金融” AND 性别=”男”
⑥ 删除会计班的女生或计算机班的男生
 [操作] DELETE FOR班级=”会计” AND 性别=”女” OR 班级=”计算机” AND 性别=”男”
⑦ 删除86年出生的男生 
[操作] DELETE FOR YEAR(出生年月)=1986 AND 性别=”男”
⑧ 删除金融班的男生团员记录
[操作] DELETE FOR班级=”金融” AND 团员否
⑨ 删除入学成绩在500-599分的学生记录
[操作] DELETE FOR 入学成绩>=500 AND入学成绩<=599
⑩ 删除入学成绩在450-599分的金融班学生记录
[操作] DELETE FOR 入学总分>=450 AND入学总分<=599 AND班级=”金融”
(3)恢复上述加了删除标记的记录
[操作] RECALL
(4)物理删除6—8号记录
[操作] GO 6
DELETE NEXT 3
PACK
(5)物理删除所有记录,只留表结构
[操作] ZAP
(6)用菜单方式,再做一次删除操作
[操作](略)
【高手进阶解答】
1,修改记录(在Xsda 表中)
(1)在浏览窗口中修改6号记录的入学日期为:99年9月1日
[操作] BROWSE
(2)在编辑窗口中修改英语系学生的人数为60
[操作] EDIT
2,替换记录(在Xscj表中)
(1)计算表中“总分”字段的值,并填在表中
[操作] REPLACE ALL总分 WITH 高数+大语+邓论+英语+计算机
(2)计算表中“平均分”字段的值,并填在表中
[操作] REPLACE ALL 平均分 WITH 总分/5
(3)对于总分大于450分的学生,“级别”字段中填写“优秀”
[操作] REPLACE ALL 级别 WITH,优秀” FOR 总分>450
(4)对于英语成绩不及格的学生,英语成绩加10分
[操作] REPLACE ALL 英语 WITH 英语+10 FOR 英语<60
(5)对于平均分小于60的学生,“级别”字段中填写“不合格”
[操作] REPLACE ALL 级别 WITH,不合格” FOR 平均分<60
3,追加、插入、删除记录(在Xsda表中)
(1)给Xsda表追加一条空白记录
[操作] APPEND BLANK
(2)在1号记录的前面插入一条空白记录
[操作] GO 1
INSERT BLANK BEFORE
(3)在5号记录的后面插入如下一条记录系别
班级
学号
姓名
性别
年龄
入学日期
婚否
人数
中文系
102202
05031004
张红
女
20
07/08/98
.F.
54
[操作] GO 5
INSERT
(4)逻辑删除3至8号记录
[操作] GO 3
DELETE NEXT 6
(5)逻辑删除数学系的所有男同学记录
[操作] DELETE ALL FOR 系别=”数学系” AND 性别=”男”
(6)逻辑删除99年以前入学的英语系的女同学记录
[操作] DELETE ALL FOR系别=”英语系” AND 性别=”女”AND YEAR(入学日期)<1999
(7)恢复(4)题中逻辑删除的记录
[操作] GO 3
RECALL NEXT 6
(8)物理删除(5)中逻辑删除的记录
[操作] DELETE ALL FOR 系别=”数学系” AND 性别=”男”
PACK
【自我测试解答】
说明:以下题目在Stockll表中操作。
1,修改3号记录的单价为:2050.00元
[操作] BROWSE 或 EDIT
2,计算表中“总金额”字段的值,并填写在表中
[操作] REPLACE 总金额 WITH 单价*库存数量 ALL
3,将诺基亚品牌的手机单价提高15%
[操作] REPLACE 单价 WITH 单价*1.15 FOR 品名=”诺基亚”
4,将非诺基亚品牌的手机的库存数量增加10部,库存金额减少50%
[操作] REPLACE 库存数量 WITH 库存数量+10 库存金额 WITH 库存金额*0.5 FOR品名!=,诺基亚”
5,逻辑删除单价小于1000元的记录
[操作] DELETE ALL FOR 单价<1000
6,逻辑删除商品代码以2开头的记录
[操作] DELETE ALL FOR LEFT(商品代码,1)=,2”
7,恢复上述逻辑删除的记录
[操作] RECALL
8,给该表追加一条空白记录
[操作] APPEND BLANK
9,在3号记录的前面插入如下一条记录

[操作] GO 3
INSERT BEFORE
10.物理删除表的最后一条记录
[操作] GO BOTTOM
PACK
练习四 索引与查找
【实验目的】
1,掌握表文件的复制、表结构的复制操作
2,掌握建立结构复合索引的方法
3,掌握设置主控索引的命令
4,熟练掌握表的顺序查找
【知识要点】
1.表文件的复制命令格式:COPY TO <新表文件名>[范围][FIELDS <字段名表>][FOR/WHILE <条件表达式>]
2.表结构的复制命令格式:COPY STRUCTRUE TO <新表文件名>[FIELDS <字段名表>]
3,复合索引文件的建立
(1)命令方式命令格式:INDEX ON <关键字表达式> TAG<索引标识符> [OF<索引文件名>][FOR<条件>][ASCENDING/DESCENDING][UNIQUE/CANDINATE][ADDITIVE]
(2)菜单操作利用表设计器建立结构复合索引文件
4,设置主索引文件复合索引文件打开后,其中的索引不会自动设置主索引标识,必须使用命令设置。
命令格式:SET ORDER TO <TAG 索引标识>/<数值表达式>
5,数据表的顺序查找
(1)LOCATE
命令格式:LOCATE [<范围>][FOR/WHILE<条件表达式>]
命令功能:在当前表文件中,查找指定范围内满足条件的记录,并把指针定位到第一个满足条件的记录上。
(2)若要继续查找,则需使用CONTINUE命令。
命令格式:CONTINUE
命令功能:把指针定位到下一条满足条件的记录上。
【实验内容】
将原表学生表的结构和记录复制成XS.DBF,其中只含字段姓名、性别、出生日期、入学成绩字段,显示该表的所有记录。
将原表学生表中所有女同学的记录复制到新表XSCJ.DBF中,并显示该表的记录。
将原表成绩表中2—8条记录中所有课程号为1021的记录复制到新表XSCJ1.DBF中,并显示该表的记录。
打开学生表,将其表结构复制成表文件ABC1.DBF,并显示这个表结构。
在学生表中,按学号、姓名、出生日期、入学成绩建立一个复合索引,其索引标识分别为:SXH、SXM、SCSRQ、SRXCJ,除学号为唯一索引以外,其余的都为普通索引。
打开建立(5)中索引以后的学生表,分别设置其SXH、SXM、SRXCJ为主控索引,并显示表记录,观察表记录的显示情况。
[提示:以下题目是在学生表中操作,假设学生表已经打开。]
7,顺序查找姓名为“林敏”的记录,并显示。
8,查找“李”姓同学的记录,并显示。
9,查找85年出生的同学记录,并显示。
10,查找入学成绩大于480分的男生记录,并显示。
11,查找并显示第2个李姓同学的记录。
12,查找并显示第2个85年出生的同学的记录。
13,查找并显示第2个团员同学记录。
14,查找并显示会计班的男同学记录。
15,查找并显示2至8号记录中金融班的男同学记录。
【高手进阶】
[提示:以下题目是在Xsda表中操作]
1,利用“Xsda”的表结构,建立“Xsda2”的表文件,其中包括“系别”、“学号”、“姓名”和“年龄”4个字段。
2,将姓“张”同学的记录拷贝到“Xsda2”表中,并显示Xsda2 表的记录。
3,查找第一个姓“张”的学生记录,并显示记录内容。使用函数测试记录号为多少。
4,查找下一个姓“张”的学生记录,并显示记录内容。使用函数测试记录号为多少。
5,重复9题中的操作,直到所有姓“张”的学生记录都被找到并显示为止。观察这时
EOF()函数的值是什么。
【综合测试】
[提示:以下题目是在Xsda表中操作]
1,将Xsda表结构复制到表文件名为:“学生”中。
2,把数据表Xsda所有记录的学号、姓名两个字段复制到数据表Xsda1中。
3,把数据表Xsda中所有班级以“101”开头的记录复制到数据表“学生”中。
4,将3号记录以后的“计算机系”的学生记录复制到数据表“学生”中。
5,按入学日期建立复合索引,其索引标识为:SRXRQ,索引类型为侯选索引。
6,设置SRXRQ索引为主控索引,并显示表记录,观察记录号的变化。
7,查找并显示99年入学的第2个学生记录。
8,查找并显示数学系99年入学的所有学生记录。
9,查找并显示数学系99年入学的所有男生记录。
10.查找并显示班级尾数为“04”的第2个男生记录。
【实验过程】
1,将原表学生表的结构和记录复制成XS.DBF,其中只含字段姓名、性别、出生日期、入学成绩字段,显示新表的所有记录。
[操作] USE 学生表
COPY TO XS FIELDS 姓名,性别,出生日期,入学成绩
USE XS
LIST
2,将原表学生表中所有女同学的记录复制到新表XS1.DBF中,并显示新表的记录。
[操作] USE 学生表
COPY TO XS1 FOR 性别="女"
USE XS1
LIST
3,将原表成绩表中2—8条记录中所有课程号为1021的记录复制到新表XSCJ1.DBF中,并显示XSCJ1表中的记录。
[操作] USE 成绩表
GO 2
COPY TO XSCJ1 FOR ALLTRIM(课程号)= "1021” NEXT 7
USE XSCJ1
LIST
4,打开学生表,将其表结构复制成表文件ABC1.DBF,并显示这个表结构。
[操作] USE 学生表
COPY STRUCTURE TO ABC1
USE ABC1
LIST STRUCTURE
5,在学生表中,按学号、姓名、出生日期、入学成绩建立一个复合索引,其索引标识分别为:SXH、SXM、SCSRQ、SRXCJ,除学号为唯一索引以外,其余的都为普通索引。
[操作]
(1)菜单方式建立复合索引文件,步骤如下:
打开学生表,选择“显示”菜单下的“表设计器”菜单项,进入表设计器窗口。在表设计器窗口的索引选项卡下输入各个索引标识名、索引类型及表达式等。如图3-10所示:

图 3-10 建立“学生表”的索引
在表设计器中建立完所需索引后,单击“确定”按钮,弹出询问“是否永久性地更改表结构?”对话框,单击“是”按钮,系统将修改的结构存盘。
(2)命令方式建立复合索引文件
USE 学生表
INDEX ON 学号 TAG SXH UNIQUE
INDEX ON 姓名 TAG SXM
INDEX ON 出生日期 TAG SCSRQ
INDEX ON 入学成绩 TAG SRXCJ
6,打开建立(5)中索引以后的学生表,分别设置其SXH、SXM、SRXCJ为主控索引,并显示表记录,观察表记录的显示情况。
[操作] USE 学生表
LIST
SET ORDER TO SXH
LIST
SET ORDER TO SXM
LIST
SET ORDER TO SRXCJ
LIST
7,顺序查找姓名为“林敏”的记录,并显示。
[操作] LOCATE FOR 姓名="林敏"
DISPLAY
8,查找“李”姓同学的记录,并显示。
[操作] LOCATE FOR LEFT(姓名,2)= "李"
DISPLAY
CONTINUE
DISPLAY
9,查找85年出生的同学记录,并显示。
[操作] LOCATE FOR YEAR(出生日期)=1985
DISPLAY
CONTINUE
DISPLAY
10,查找入学成绩大于480分的男生记录,并显示。
[操作] LOCATE FOR 入学成绩>480 AND 性别="男"
  DISPLAY
CONTINUE
DISPLAY
11,查找并显示第2个李姓同学的记录。
[操作] LOCATE FOR LEFT(姓名,2)="李"
CONTINUE
DISPLAY
12,查找并显示第2个85年出生的同学的记录。
[操作] LOCATE FOR YEAR(出生日期)=1985
CONTINUE
DISPLAY
13,查找并显示第2个团员同学记录。
[操作] LOCATE FOR 团员否
CONTINUE
DISPLAY
14,查找并显示会计班的男同学记录。
[操作] LOCATE FOR 班级="会计"AND 性别="男"
DISPLAY
CONTINUE
DISPLAY
15,查找并显示2至8号记录中金融班的男同学记录。
[操作] GO 2
LOCATE FOR 班级="金融" AND 性别="男" NEXT 7
DISPLAY
CONTINUE
DISPLAY
【高手进阶解答】
[提示:以下题目是在Xsda表中操作]
1,利用“Xsda”的表结构,建立“Xsda2”的表文件,其中包括“系别”、“学号”、“姓名”和“年龄”4个字段。
[操作] USE Xsda
COPY STRUCTURE TO Xsda2 FIELDS 系别,学号,姓名,年龄
2,将Xsda 表中姓“张”同学的记录拷贝到“Xsda2”表中,并显示Xsda2 表的记录。
[操作] USE Xsda
COPY TO Xsda2 FOR LEFT(姓名,2)= "张"
USE Xsda2
LIST
3,查找第一个姓“张”的学生记录,并显示记录内容。使用函数测试记录号为多少。
[操作] USE Xsda
LOCATE FOR LEFT(姓名,2)=”张”
DISPLAY
RECNO()
4,查找下一个姓“张”的学生记录,并显示记录内容。使用函数测试记录号为多少。
在3题命令的基础上,继续在命令窗口中输入:
[操作] CONTINUE
DISPLAY
RECNO()
5,重复4题中的操作,直到所有姓“张”的学生记录都被找到并显示为止。观察这时
EOF()函数的值是什么。
[操作] CONTINUE
DISPLAY
EOF()
【综合测试解答】
[提示:以下题目是在Xsda表中操作,假设Xsda 表已经打开。]
1,将Xsda表结构复制到表文件名为:“学生”中。
[操作] COPY STRUCTURE TO 学生
2,把数据表Xsda所有记录的学号、姓名两个字段复制到数据表Xsda1中。
[操作] COPY TO Xsda1 FIELDS 学号,姓名
3,把数据表Xsda中所有班级以“101”开头的记录复制到数据表“学生”中。
[操作] COPY TO 学生 FOR LEFT(班级,3)="101"
4,将3号记录以后的“计算机系”的学生记录复制到数据表“学生”中。
[操作] GO 3
COPY TO 学生 FOR 性别="计算机" REST 
5,按入学日期建立复合索引,其索引标识为:SRXRQ,索引类型为侯选索引。
[操作] INDEX ON 入学日期 TAG SRXRQ CANDIDATE
6,设置SRXRQ索引为主控索引,并显示表记录,观察记录号的变化。
[操作] SET ORDER TO SRXRQ
LIST
7,查找并显示99年入学的第2个学生记录。
[操作] LOCATE FOR YEAR(入学日期)=1999
CONTINUE
DISPLAY
8,查找并显示数学系99年入学的所有学生记录。
[操作] LOCATE FOR YEAR(入学日期)=1999 AND 系别="数学系"
DISPLAY
CONTINUE
DISPLAY
9,查找并显示数学系99年入学的所有男生记录。
[操作] LOCATE FOR YEAR(入学日期)=1999 AND 系别="数学系"AND 性别="男"
DISPLAY
CONTINUE
DISPLAY
10,查找并显示班级尾数为“04”的第2个男生记录。
[操作] LOCATE FOR RIGHT(班级,2)="04"AND 性别="男"
  CONTINUE
DISPLAY
练习五 表的统计与计算
【实验目的】
1.熟练掌握表的计算
2.熟练掌握统计汇总的命令:记录个数(COUNT),数值字段求和(SUM),数值字段
求平均(AVERAGE),分类汇总(TOTAL),多功能计算命令(CALCULATE)
【知识要点】
数据表的运算
1.统计记录个数格式:COUNT [范围][FOR 条件式][TO 内存变量]
功能:用于统计当前表中指定范围内满足条件的记录个数说明:
(1)若无<范围>和 FOR/WHILE <条件>,则默认计算所有记录的个数。
(2)TO <内存变量>,则可将统计结果保存在内存变量中,否则结果只显示在屏幕上。
2.数值字段求和格式:SUM [字段表达式表] [范围] [FOR 条件式] [TO 内存变量表]
功能:对指定范围内、满足条件的记录,对指定数值型表达式按列分别求和说明:
(1)缺省范围、条件表示对全部记录统计。
(2)缺省数值型字段表达式表,表示对表中所有数值型字段求和。
(3)数值型字段表达式表的个数应与内存变量的个数一致。
3.数值字段求平均值格式:AVERAGE [字段表达式表] [范围] [FOR 条件式] [TO 内存变量表]
功能:对指定范围内、满足条件的记录,对指定的数值型字段计算平均值说明:
(1)缺省范围、条件表示对全部记录操作。
(2)缺省数值型字段表达式表,表示对当前表中所有数值型字段求平均值。
(3)数值型字段表达式的个数应与内存变量的个数一致。
4.分类汇总格式:TOTAL ON 关键字 TO 新文件名 [范围] [FIELDS 字段名表] [FOR 条件式]
功能:按关键字段对当前表文件的数值型字段进行分类汇总,形成一个新的表文件说明:
(1)按关键字段对当前表文件分类汇总,形成一个新的数据表文件。即将与关键字相同的记录汇总成一条记录,该记录中指定的数值字段的值为各条同类记录的值之和,其余字段的值为同类记录中第一条记录的值。
(2) 当前表必须按关键字进行排序或索引。
补充:多功能计算命令格式:CALCULATE 表达式表 [范围] [FOR 条件式] [TO 内存变量表]
功能:对当前表文件中指定范围内、满足条件的记录,进行指定的计算工作说明:表达式表可以是下列函数的任意组合:
函数名
功能
说 明
AVG(expN)
计算平均值
expN为N型表达式
CNT()
统计记录个数
统计满足条件的记录个数
MAX(expr)
求最大值
expr为N、C或D型表达式
MIN(expr)
求最小值
expr为N、C或D型表达式
SUM(expN)
求和
expN为N型表达式
VAR(expN)
计算均方差
expN为N型表达式
STD(expN)
计算标准偏差
expN为N型表达式
【实验内容】
数据表的运算:
1.统计记录个数,
(1)在Xsda表中统计女生的人
(2)统计成绩表中成绩优秀(>85分)的学生人数
(3)统计Xsda表中数学系的学生人数
(4)统计Xscj表中总分在450以上(含450分)的人数
2.数值字段求和
(1)对成绩表中的数值字段(成绩)求和
(2)对学生表中,求计算班的入学成绩之和
(3)统计成绩表中课程号为‘2011’的总分
(4)统计Xscj表中计算机的总分
3.数值字段求平均值
(1)对成绩表中的数值字段(成绩)求平均值
(2)统计学生表中团员的入学平均成绩和人数
(3)统计Xscj表中高数的平均成绩
(4)统计Xscj表中总分的平均分
4.分类汇总(要先建索引,再对索引关键字分类汇总)
(1)按班级,对学生表进行汇总统计入学成绩,把结果存入Bmgz 表
(2)统计成绩表中各课程的分数之和,存入Cj表并显示结果
(3)统计 Sell表中同一中商品的销售金额,存入Je表中并显示结果
5.综合练习:
(1)在Xscj表表中,统计英语的总分和平均分,每个人的总分(总成绩)和平均分
(2)在Xsda表中统计各系的学生人数,存入XB表并显示注:学号第5、6位数是系代码;并先在Xsda中添加一个新的数值型字段‘人数’
【高手进阶】
多功能计算
1.对学生表,计算入学成绩的最大值、最小值、平均值、总和
2.统计成绩表中学号为‘05011001’的学生平均成绩、最高分、最低分
3.统计成绩表中课程号为‘1021’的最大值、最小值、平均值、总分
【自我测试】
统计Xscj表中,各课成绩的平均分,并且统计出学生五课成绩的平均在80分以上的,并显示这些记录.
【实验过程】
数据表的运算:
1.统计记录个数,
(1)在Xsda表中统计女生的人数
[操作] USE Xsda
COUNT FOR 性别='女' TO CC
CC
(2)统计成绩表中成绩优秀(>85分)的学生人数
[操作]USE 成绩表
COUNT FOR 成绩>85 TO Cj
Cj
(3)统计Xsda表中数学系的学生人数
[操作]USE xsda
COUNT FOR 系别 = '数学系' TO Ab
Ab
(4)统计Xscj表中总分在450以上(含450分)的人数
[操作]USE Xscj
COUNT FOR 总分>=450 TO a
a
2.数值字段求和
(1)对成绩表中的数值字段(成绩)求和
[操作]USE 成绩表
SUM 成绩 TO Fs
Fs
(2)对学生表中,求计算班的入学成绩之和
[操作]USE 学生表
SUM 入学成绩 FOR 班级 = '计算机'
(3)统计成绩表中课程号为‘2011’的总分
[操作]USE 成绩表
SUM 成绩 FOR 课程号='2011'
(4)统计Xscj表中计算机的总分
[操作]USE Xscj
SUM 计算机 TO ABC
ABC
3.数值字段求平均值
(1)对成绩表中的数值字段(成绩)求平均值
[操作]USE 成绩表
AVERAGE 成绩
(2)统计学生表中团员的入学平均成绩和人数
[操作]USE 学生表
AVERAGE 入学成绩 FOR 团员否 TO A && 或:团员否=.t,
COUNT FOR 团员否 TO B && 或,团员否=.t,
A,B
(3)统计Xscj表中高数的平均成绩
[操作]USE Xscj
AVERAGE 高数 TO C
C
(4)统计Xscj表中总分的平均分
[操作]USE Xscj
AVERAGE 总分 TO A
A
4.分类汇总(要先建索引,再对索引关键字分类汇总)
(1)按班级,对学生表进行汇总统计入学成绩,把结果存入Bmgz 表
[操作]USE 学生表
INDEX ON 班级 TAG Bj
TOTAL ON 班级 TO Bmgz FIELDS 入学成绩
USE Bmgz
LIST
(2)统计成绩表中各课程的分数之和,存入Cj表并显示结果
[操作]USE 成绩表
INDEX ON 课程号 TAG Kch
TOTAL ON 课程号 TO Cj FIELDS 成绩
USE Cj
LIST
(3)统计 Sell表中同一中商品的销售金额,存入Je表中并显示结果
[操作]USE sell
INDEX ON 商品代码 TAG SPDM
TOTAL ON 商品代码 TO Je
USE Je
LIST
5.综合练习:
(1)在Xscj表表中,统计英语的总分和平均分,每个人的总分(总成绩)和平均分
[操作]USE Xscj
SUM 英语 TO F1
AVERAGE 英语 TO F2
REPLACE ALL 总分 WITH 高数+大语+邓论+英语+计算机
REPLACE ALL 平均 WITH 总分/5
F1,F2
总分,平均
注意:这两个总分和平均分是不同的,英语是对字段计算(按列),而每个人的是对每条记录计算(按行)。它们所用的命令是完全不同的。
(2)在Xsda表中统计各系的学生人数,存入XB表并显示注:学号第5、6位数是系代码;并先在Xsda中添加一个新的数值型字段‘人数’
[操作]USE Xsda
INDEX ON 学号TAG FF
TOTAL ON SUBSTR(学号,5,2) TO XB FIELDS 人数
USE XB
BROWSE FIELDS 学号,人数
【高手进阶解答】
多功能计算
1.对学生表,计算入学成绩的最大值、最小值、平均值、总和
[操作]USE 学生表
CALCULATE MAX(入学成绩),MIN(入学成绩),AVG(入学成绩),SUM(入学成绩)
2.统计成绩表中学号为‘05011001’的学生平均成绩、最高分、最低分
[操作]USE 成绩表
CALCULATE MAX(成绩),MIN(成绩),AVG(成绩) FOR 学号='05011001'
3.统计成绩表中课程号为‘1021’的最大值、最小值、平均值、总分
[操作]USE 成绩表
CALCULATE MAX(成绩),MIN(成绩),AVG(成绩),SUM(成绩)FOR 课程号='1021'
【自我测试解答】
统计Xscj表中,各课成绩的平均分,并且统计出学生五课成绩的平均在80分以上的,并显示这些记录.
[操作]USE Xscj
AVERAGE 高数,大语,邓论,英语,计算机 TO A1,A2,A3,A4,A5
A1,A2,A3,A4,A5
INDEX ON 学号 TO xh
TOTAL ON 学号 TO ZG FOR 平均>80
USE zg
BROWSE
LIST
或:
USE Xscj
CALCULATE AVG(高数),AVG(大语),AVG(邓论),AVG(英语),AVG(计算机)
INDEX ON 学号 TO XH
TOTAL ON 学号 TO ZG FOR 平均>80
USE ZG
BROWSE
LIST
练习六 表的关联
【实验目的】
1.练掌握选择工作区以及使用工作区;
2.熟练掌握怎样建立多表关联。
【知识要点】
一、多表操作
1.工作区的概念
(1)计算机内存中存放数据库数据的特定区域叫工作区。VFP可打开32767个工作区;
(2)每个工作区可打开一个表。某一时刻只有一个为当前工作区,所有命令都对当前工作区有效,允许在不同的工作区最多同时打开255个表;
(3)每个工作区中打开的表,各有其自己的记录指针。在当前工作区中可访问其它区中表的记录(用“别名->字段名”或“别名.字段名”或“字母区号->字段名”或“字母区号.字段名”的格式来表示),但不能改变其数据;
(4)通常用工作区号或区中表的别名来标识工作区。
工作区的表示有3种方法:
数字表示:用数字1,2,3,……32767表示
字母表示:用字母A,B,C……J,W11,W12……W32767表示
别名表示:在某工作区打开表时指定了别名,那么就别名就可以表示该工作区了。
0号工作区是尚未使用的工作区号中最小的一个
2.为表选择工作区:(在指定的工作区中打开表)
(1)(“窗口∕数据工作期”)“打开”钮-选择自由表)
 (2)SELECT 工作区号
USE 表名
3.指定当前工作区:(此时可能还未打开表文件)
  (1)(“窗口/数据工作期”)在“别名”框中,单击工作区别名
 (2)SELECT <工作区号>∕<别名>
二、在表间创建关联
1.作用:
关联是一种链接。它允许用户不仅从当前表中访问数据,而且还可访问其它表中的相关记录的数据,而不必在其它表中进行明显地指针移动。
父表:是一对一或一对多的表关系中的主表,父表中记录指针移动将导致子表中的记录指针随之而动。
子表:是一对一或一对多表关系中的相关表或受控表,记录指针的移动,受父表的控制。
2.条件:
父表和子表通常要有相同的字段(叫“关键字段”),且对此字段建立索引。父表一般为主索引(或侯选索引),子表为主索引(或侯选索引)时,建立“一对一”关联,为普通索引时,可建立“一对多”关联
3.建立临时关联:(当关闭一个表时,关联会自动撤销)
(1),一对一”关联
先认定父表和子表,并在不同工作区打开(父表为当前工作区中的表),子表要按关键字段建立索引,并设为主控索引。 建立方法有下列两种:
用“数据工作期”:
(“窗口/ 数据工作期”)“别名”框中选定父表-“关系”钮(将父表添加到“关系”框)-单击“别名”框中子表名-(进入“表达式生成器”)双击主控关键字段名-“确定”
用命令:
SET RELATION TO 关键字表达式 INTO 子工作区号∕子表别名
【实验内容】
在数据工作期中,为书店和书库两表的选择工作区,并建立临时关联。
用命令建立以下的临时关联,并完成下面的操作。
1.在不同的工作区打开成绩表和学生表,并设置学生表为当前的工作区
2.从学生表和成绩表中查询学生记录,并显示学生的学号,姓名,课程号,成绩
3.从学生表和成绩表中查询成绩不及格的学生姓名、课程号、成绩
4.从Xsda和Xscj表中,计算出每个同学的总分,并显示出计算机系的学生的学号、姓名、计算机成绩和总分。
5.在商品月库存表(Stockll.dbf)和销售明细表(Sell.dbf),计算出营业员的销售总额,并显示营业员方虹本月销售商品、姓名,日期,销售数量,销售金额
【高手进阶】
从Xsda和Xscj表中,计算出每个同学的五课平均分,若平均分在85分以上的将等级字段设置成“优秀”,并显示出他们的学号、姓名、系别、平均分、等级。
【自我测试】
从学生表和成绩表中,查找学号为“05011001”的学生,若是团员,入学成绩加5分,并显示其姓名、入学成绩、团员否、所选的课程。
【实验过程】
在“数据工作期”中,为书店和书库两表建立临时关联。
[操作]
1.打开“窗口”菜单,选择“数据工作期”,出现“数据工作期”窗口
 
2.在“打开”选项中,选择要打开书店表。

3.然后点击“属性”对话框中的修改,设置书店表的索引。

4.在“打开”选项中,选择要打开书库表。
5.单击“关系”选项框,书库表就加进关系选项框中

6.在单击书店表,出现一个表达式生成器设置关联条件。

7.关联条件“学号”设置完成,单击“确定”。

8.关联设置完成。
9.由上图可以看出当选中书店表时,工作区为1,当选中书库表时,工作区为2。
用命令建立以下的临时关联,并完成下面的操作。
1.不同的工作区打开成绩表和学生表,并设置学生表为当前的工作区
[操作]SELECT 1 或:SELECT 1
USE 成绩表 USE 学生表
SELECT 2 SELECT 2
USE 学生表 USE 成绩表
SELECT 1
2.从学生表和成绩表中查询学生记录,并显示学生的学号、姓名、课程号、成绩
[操作]SELECT 1
USE 成绩表
INDEX ON 学号 TAG XH
SELECT 2
USE 学生表
SET RELATION TO 学号 INTO A
LIST 学号,姓名,A.课程号,A.成绩
CLOSE ALL
RETURN
3.从学生表和成绩表中查询成绩不及格的学生姓名、课程号、成绩
[操作]SELECT 1
USE 学生表
INDEX ON 学号 TAG XH
SELECT 2
USE 成绩表
SET RELATION TO 学号 INTO A
LIST A.姓名,课程号,成绩 FOR 成绩<60
CLOSE ALL
RETURN
4.从Xsda和Xscj表中,计算出每个同学的总分,并显示出计算机系的学生的学号、姓名、计算机成绩和总分。
[操作]SELECT 1
USE Xsda
INDEX ON 学号 TAG XH
SELECT 2
USE Xscj
SET RELATION TO 学号 INTO A
REPLACE ALL 总分 WITH 高数+大语+邓论+英语+计算机
LIST FIELDS 学号,A.姓名,计算机,总分 FOR A.系别=“计算机系”
CLOSE ALL
RETURN
5.商品月库存表(Stockll.dbf)和销售明细表(Sell.dbf)计算出营业员的销售总额,并显示营业员方虹本月销售商品、姓名、日期、销售数量、销售金额
[操作]SET TALK OFF
CLEAR
SELECT 1
USE Stockll
INDEX ON 商品代码 TO SP
SELECT 2
USE Sell
SET RELATION TO 商品代码 INTO A
REPLACE 销售金额 WITH A->单价*销售数量 ALL
LIST 营业员,日期,A->品名,销售数量,销售金额 FOR 营业员 =“方虹”
RETURN
【高手进阶解答】
从Xsda和Xscj表中,计算出每个同学的五课平均分,若平均分在85分以上的将等级字段设置成“优秀”,并显示出他们的学号、姓名、系别、平均分、等级。
[操作]SET TALK OFF
SELECT 1
USE Xsda
INDEX ON 学号 TAG XH
SELECT 2
USE Xscj
SET RELATION TO 学号 INTO A
REPLACE ALL 平均 WITH 总分/5
REPLACE ALL 等级 WITH,优秀” FOR 平均>85
LIST FOR 平均>85 FIELDS 学号,A.姓名,A.系别,平均,等级
CLOSE ALL
RETURN
【自我测试解答】
从学生表和成绩表中,查找学号为“05011001”的学生,若是团员,入学成绩加5分,并显示其姓名、入学成绩、团员否、所选的课程。
[操作] SET TALK OFF
SELECT 1
USE 学生表
INDEX ON 学号 TAG XH
REPLACE 入学成绩 WITH 入学成绩+5 ;
FOR 团员否 AND 学号=“05011001”
SELECT 2
USE 成绩表
SET RELATION TO 学号 INTO A
LIST FOR 学号=“05011001” A.姓名,A.入学成绩,A.团员否,课程号
CLOSE ALL
RETURN
练习七 数据库表基本操作
【实验目的】
1.熟练掌握建立数据库和打开数据库的操作;
2.熟练掌握在数据库中添加和删除表;
3.熟练掌握建立表的一对一,一对多的永久关系。
【知识要点】
一、数据库
1.创建数据库(进入“数据库设计器”)
(1)“文件/新建”-(类型)选“数据库”-“新建文件”钮-输入库名并确定存放位置
(2)CREATE DATABASE <数据库名>
2.打开、关闭、删除数据库,
(1)打开数据库(进入“数据库设计器”)
① 刚建的数据库,一定是打开的
②“文件/打开”-(类型)选“数据库”-选定数据库 -确定“独占”方式
③ OPEN DATABASE <数据库名>
(2)关闭数据库
① 单击右上角的“关闭”钮
② CLOSE DATABASE [关闭当前打开的数据库]
(3)删除数据库
DELETE DATABASE
3.数据库基本操作(以下操作均要先打开数据库)
(1)“新建”表:(在某数据库中新建表)
①(使用“数据库设计器”的“工具箱”)“新建表”-“新建表”- 确定表名及存放位置
②(“数据库设计器”)“文件/新建”-(“类型”)选“表”-“新建文件”钮-确定表名及
存放位置
③(“数据库设计器”),数据库/新建表”-“新建表”钮-确定表名及存放位置
④(“数据库设计器”)CREATE <表名>
⑤ 右击“数据库设计器”-“新建表”
(2)“添加”表:(在某数据库中添加自由表)
①(使用“数据库设计器”的“工具箱”)“添加”钮-选定表-“确定”
②(“数据库设计器”)“数据库/添加表” -选定表-“确定”
③ 命令格式:ADD TABLE [自由表名/?]
(3)“移出”表和“删除”表
移出表:将数据库表移出,变成自由表删除表:从磁盘上删除表
①(使用“数据库设计器”的“工具箱”)“移出”或“删除”钮-选定表-“确定”
②(“数据库设计器”)“数据库/移出或删除表” -选定表-“确定”
③ 命令格式:
移出:REMOVE TABLE [表名/?]
删除:DROP TABLE[表名/?]
二、建立表与表的一对一、一对多永久关系条件:对关键字段(父表和子表都有的相同字段),父表建主索引(或侯选索引),子表可为普通索引,且设为主控索引。父表和子表必须是数据库中的表。
建立方法:(“数据库设计器”中)将父表中主索引名拖到子表对应索引名上。[子表为主索引(或侯选索引)时,建立“一对一”关联,为普通索引时,可建立“一对多”关联]
临时关联
永久关联
条件:
对关键字段
父表和子表都要有一个相同的字段,叫关键字段
父表可不建索引;
子表建立索引,并设为主控索引
父表建主索引(或侯选索引);
子表可建普通索引,且设为主控索引
表来源
自由表或数据库中的表
数据库中的表
建立方法
1.用命令:SET RELATION
2.用“数据工作期”
用鼠标拖(只能在数据库中建)
不同处
可控制表中记录指针的关系
不可控制记录指针。可在查询或视图设计器中成默认连接条件
【实验内容】
一﹑数据库的操作
1.建立一个以学生档案为名的数据库,并建立名为学生成绩表和学生档案表的两个表。
2.将Xsda和Xscj两表添加到学生档案数据库中,将学生成绩表移出学生档案数据库并将学生档案表从该数据库中删除。
二﹑建立表间一对一、一对多的关系
1,建立“图书管理”数据库,将两个自由表“书库”和“书店”添加到其中,设“书库”为父表,“书店”为子表,建立一对一的关系,再用命令方式建临时关系。
2.将Xsda和Xscj表添加到学生管理数据库中,并建立一对多的关系,再用命令方式建临时关系。
【高手进阶】
对Xsda和Xscj表,编写程序PROG1.PRG。其功能是,
1.统计计算机系的高数总分、平均分、最高分和最低分;
2.并按如下格式显示:
系名 高数总分 高数平均分 高数最高分 高数最低分
…… …… …… …… ……
【自我测试】
将学生表和成绩表添加到学生数据库中,并建立永久关系,再用命令方式建临时关系。
【实验过程】
一﹑数据库的操作
1.一个以学生档案为名的数据库,并建立名为学生成绩表和学生档案表的两个表。
[操作]
(1)建立数据库的方法一:“文件”—“新建”(类型选“数据库”)—“新建文件”—保存名为“学生档案”,就会出现数据库设计器的对话框。如下图:
 
 
方法二:用命令建立数据库:
CREATE DATABASE 学生档案
(2)建表:随意建两个字段,不输入记录,几秒钟搞定建立表的方法一:用数据库设计器的新建按纽。
建立表的方法二:“数据库”—“新建表”。
建立表的方法三:用命令建立,CREATE 表名
2,将Xsda和Xscj两表添加到学生档案数据库中,将学生成绩表移出学生档案数据库并将学生档案表从该数据库中删除。
[操作]
(1)添加表方法一:用菜单操作,用单击数据库设计器中的添加按钮,然后选中要添加的表,再“确定”即可。如下图:
添加表方法二:用命令的方式,先打开该数据库然后用添加命令
OPEN DATABASE 学生档案
ADD TABLE Xsda
ADD TABLE Xscj
 
(2)移去表的方法一:选中要移出的表,然后用数据库设计器中的移出按钮,然后单击“移去”—“确定”即可。如下图:
移去表的方法二:REMOVE TABLE 学生成绩表


(3)删除表的方法一:选中要删除的表,然后用数据库设计器中的移出按钮,然后单击“删除”—“确定”即可。如下图:
删除表的方法二:DROP TABLE 学生档案表

二﹑建立表间一对一、一对多的关系
1.建立“图书管理”数据库,将两个自由表“书库”和“书店”添加到其中,设“书库”为父表,“书店”为子表,建立一对一的关系,再用命令方式建临时关系。
[操作]
(1)建立一个名为图书管理的数据库,打开数据库设计器,如下图:
(2)将书店表和书库表添加到数据库中,如图:

(3)对书库和书店两数据表,按“书号”字段建主索引。选中书库表并右击,在弹出的快捷菜单中选择“修改”选项,进入“表设计器”窗口,选择“索引”标签,设置“书号”为主索引,如图:用相同的方法为书店表按“书号”建立主索引。
(4) 两个数据表建立索引之后的“数据库设计器”窗口内容如图所示

(5)激活父表中的主索引字段,然后单击并拖至与其建立关联的子表中的对应字段处,再松开鼠标左键,数据库中的两个表之间就多了一条“连线”,其一对一关系就建成了,如图所示。

若用命令的方法建立临时关系,如下:
SELECT 1
USE 书店
INDEX ON 书号 TAG SH
SELECT 2
USE 书库
SET RELATION TO 书号 INTO A
RETURN
2.将Xsda和Xscj表添加到学生管理数据库中,并建立一对多的关系,再用命令方式建临时关系。
[操作](1)建立一个名为学生管理的数据库,打开数据库设计器,如下图:

(2)将Xsda和Xscj表添加到数据库中,如图

(3)在两个表中,确定Xsda为子表,Xscj为父表,按“学号”字段建主索引。选中Xscj表并右击,在弹出的快捷菜单中选择“修改”选项,进入“表设计器”窗口,选择“索引”标签,设置“学号”为主索引,如下图。用相同的方法为Xsda按“学号”建立普通索引。
(4) 两个数据表建立索引之后的“数据库设计器”窗口内容如图所示

(5)激活父表中的主索引字段,然后单击并拖至与其建立关联的子表中的对应字段处,再松开鼠标左键,数据库中的两个表之间就多了一条“连线”,其一对多关系就建成了,如下图。

若用命令建立两表的临时关系,命令如下:
SELECT 1
USE Xsda
INDEX ON 学号 TAG XH
SELECT 2
USE Xscj
SET RELATION TO 学号 INTO A
RETURN
【高手进阶解答】
对Xsda和Xscj表,编写程序PROG1.PRG。其功能是,
1.统计计算机系的高数总分、平均分、最高分和最低分;
2.并按如下格式显示:
系名 高数总分 高数平均分 高数最高分 高数最低分
…… …… …… …… ……
[操作]
SET TALK OFF
SET SAFETY OFF
CLEAR
SELECT 1
USE Xsda
INDEX ON 学号 TO XH
SELECT 2
USE Xscj
SET RELATION TO 学号 INTO A
CALCULATE SUM(高数),AVG(高数),MAX(高数),MIN(高数);
FOR A.系别 = "计算机系" TO A1,A2,A3,A4
" 系名 高数总分 高数平均分 高数最高分 高数最低分"
"计算机系",A1,A2,A3,A4
SET TALK ON
RETURN
【自我测试解答】
将学生表和成绩表添加到学生数据库中,并建立永久关系,再用命令方式建临时关系。
[操作]
1.(1)建立一个名为“学生”的数据库,打开数据库设计器;
(2)将学生表和成绩表表添加到学生数据库中;
(3)在两个表中,确定学生表为父表,成绩表为子表,按“学号”字段建索引(父表为主索引,子表可为普通索引)。
(4)将父表中的主索引标记拖至子表中的对应索引处,永久关系就建成了。
2.用命令建立两表的临时关系,命令如下:
SELECT 1
USE 成绩表
INDEX ON 学号 TAG XH
SELECT 2
USE 学生表
SET RELATION TO 学号 INTO A
RETURN
第4章 视图、查询与SQL语句练习一 视图与查询
【实验目的】
1.使用视图向导创建本地视图
2.利用视图设计器创建视图
3.利用查询向导创建查询
【知识要点】
一、视图
1.视图是观察表记录的一个窗口,使用视图可以将表中一组记录提出来组成一个虚拟表,还可改变这些记录的值,并将更新结果送回原表。
视图依赖于某数据库中的表,只有打开此数据库,才能创建和使用视图。
视图有本地视图和远程视图两类。
2.使用本地视图向导创建本地视图
(1) 执行“工具/向导/全部”命令,在“向导选取”对话框中选择“本地视图向导”。
(2) 打开数据库文件,在“数据库设计器”窗口中执行“新建/视图”命令,单击“向导”按钮,进入“本地视图向导”窗口。
(3)使用本地视图向导
① 从“字段选取”窗口中选定一个表及所需字段,将其添加到“选定字段”框中
② 从“筛选记录”窗口中指定记录输出的条件
③ 从“排序记录”窗口中确定视图中记录显示的顺序
④ 从“限制记录”窗口中选择视图中记录显示的数目
⑤ 单击“完成”钮,输入视图名
3.使用远程视图向导创建远程视图(即用当前数据库之外的数据源建立视图)
调用远程视图向导和创建远程视图的方法与创建本地视图差不多,只是在创建时要先选择有效的数据源,它可以是在机器上注册的ODBC(开放式数据库连接)数据源或用连接设计器设计定义的连接。
4.使用视图设计器创建视图(要先打开一个数据库文件)
(1) 执行“文件/新建/视图”命令,单击“新建文件”按钮,进入“视图设计器”窗口。
① 从“添加表或视图”对话框中选定表(或视图)将其添加到“视图设计器”中。可以通过“其它”钮,选择自由表。
②“联接”选项(联接两个表):
若添加了两个表,系统会自动给出两表相应字段,建立联接条件
③“字段”选项(指定输出的字段),
从“可用字段”框中选择字段-“添加”到“选定字段”框
④“筛选”选项(指定记录输出的条件),
在“字段名”栏中选择被筛选的字段(不能选通用型或备注型)
在“条件”栏中选定用于比较的类型
在“实例”栏中输入比较条件
(若查字符型数据时,要忽略大小写)选中“大小写”
(对于多个条件)在“逻辑”栏中添加AND或OR-(若用逻辑取反操作,即与条件相反的操作)选中“否”
⑤“排序依据”选项(确定记录输出时的顺序):
从“选定字段”框中选择字段-“添加”到“排序条件”框-在“排序选项”框中确定升(降)序
⑥“分组依据”选项(按某字段(即某特征)分类,然后对字段中特征相同的数据进行统计计算,如求和、平均值、个数、最大值、最小值等),
在(“字段”选项的“函数与表达式”框中)输入用于对某字段计算的函数表达式-“添加”到“选定字段”框(则多一个存放计算结果的字段);
在(“分组依据”选项)“可用字段”框中选择用于分组的字段-“添加”到“分组字段”框中;
在“分组依据”选项的“满足条件”栏中)输入对字段计算的条件(类似“筛选”设置)
⑦,更新条件”选项(决定视图中修改数据传回数据源中表的方法和要求):
在“字段名”框中选定可更新的字段(“钥匙”表示关键字段,最好不要更新;“铅笔”表示可更新的字段)
选择“发送SQL更新”项(否则修改内容不会传回数据源)
⑧“杂项”选项(对查询记录输出作限制):
选“无重复记录”,则不输出重复记录
选“查询交叉表”,则对三个字段,用列头、行头、数据顶的形式显示查询结果
选“列在前面的记录”,可确定输出记录的个数
5.运行视图(一定要先打开相关的数据库或表)
(1) USE 视图名
BROWSE
(2) 双击数据库设计器中视图的图标
(3) 单击“视图设计器”工具栏中“运行”钮
6.修改视图(修改视图要在“视图设计器”中 进行,因此要先打开相关的数据库)
(1) 右击视图图标,选“修改”
(2) MODIFY VIEW 视图名二、查询
1.查询可从指定表或视图中找出符合条件的记录。它与视图不同的地方在于查询可作为一个文件单独存在,而视图只能存在于数据库中;查询的数据只能观看不能修改,而视图中数据可以修改并传回到原数据源中。
2.启动“查询设计器”
 ,文件/新建”-(类型)选“查询”-“新建文件”-选定表或视图-“添加”到“查询设计器”
3.建立查询:(用“查询设计器”建立查询的操作与用“视图设计器”建立视图类似,它还少一个“更新条件”)
(1)“联接”选项(联接两个表):
(2)“字段”选项(指定输出的字段),
(3)“筛选”选项(指定记录输出的条件),
(4)“排序依据”选项(确定记录输出时的顺序):
(5)“分组依据”选项(按某字段(即某特征)分类,然后对字段中特征相同的数据进行统计计算,如求和、平均值、个数、最大值、最小值等),
(6)“杂项”选项(对查询记录输出作限制):
4.使用查询
 (1)(“查询设计器”)“查询/运行查询”
 (2)“程序/运行”-选定查询文件-“运行”
 (3)DO <查询文件名.QPR >
【实验内容】
1.用本地视图向导为“学生表”建立本地视图“学生表视图”,视图中包含“学号”、“班级”、“姓名”、“性别”、“入学成绩”五个字段内容,并要求只显示男生的记录
2.用视图设计器为“学生表”建立本地视图“学生视图2”,视图中包含“学号”、“班级”、“姓名”、“性别”、“入学成绩”五个字段内容,并要求只显示男生的记录
3.用查询向导建立查询“学生成绩查询”,以查询Xsda和Xscj表中数学系,且没有补考的学生的学号,姓名,系别,各科课程的考试成绩。
4.用“查询设计器”为“学生表”和“成绩表”这两个表建立查询“学生成绩查询2”,以显示计算机班男生的学号、班级、姓名、入学成绩、课程号、成绩
【高手进阶】
1.用“查询设计器”为“学生表”和“成绩表”这两个表建立查询“学生成绩查询3”,以查询各班学生考试平均成绩
2.用“查询设计器”为“学生表”建立姓名、班级和入学成绩的交叉表查询。
【综合测试】( 5分钟 )
根据“学生表”和“成绩表”,建立一个多表查询,完成查询“课程号”为1011的学生成绩信息。
【实验过程】
1.用本地视图向导为“学生表”建立本地视图“学生表视图”,视图中包含“学号”、“班级”、“姓名”、“性别”、“入学成绩”五个字段内容,并要求只显示男生的记录。
[解答]使用视图向导创建视图,要先打开一个数据库文件。
(1)启动本地视图向导执行“工具/向导/全部”命令,在“向导选取”对话框中选择“本地视图向导”。
[或:打开数据库文件,在“数据库设计器”窗口中执行“新建/视图”命令,单击“向导”按钮,进入“本地视图向导”窗口]
(2) 选定数据库“学生成绩管理”中的“学生表”,从“字段选取”窗口中选定所需字段,将其添加到“选定字段”框中
(3)从“筛选记录”窗口中指定记录输出的条件[没有就不指定。这里条件为显示男生]
(4)从“排序记录”窗口中确定视图中记录显示的顺序[没有就不指定。这里按学号升序排列]
(5) 从“限制记录”窗口中选择视图中记录显示的数目(若无特殊要求,就取默认值)
(6)单击“完成”钮,输入视图名“学生视图”,单击“确定”钮。则可将此视图保存到当前数据库中。
2.用视图设计器为“学生表”建立本地视图“学生视图2”,视图中包含“学号”、“班级”、“姓名”、“性别”、“入学成绩”五个字段内容,并要求只显示男生的记录。
[解答]使用视图设计器创建视图,要先打开一个数据库文件。
(1) 执行“文件/新建/视图”命令,单击“新建文件”按钮,进入“视图设计器”窗口。
① 从“添加表或视图”对话框中选定表(或视图)将其添加到“视图设计器”中。这时还可以通过“其它”钮,选择自由表。
②“联接”标签(联接两个表用的,这里只有一个表,因此不必管它):
③“字段”标签(指定输出的字段),
从“可用字段”框中选择“学号”、“班级”、“姓名”、“性别”、“入学成绩”五个字段 →逐一“添加”到“选定字段”框
④“筛选”标签(指定记录输出的条件:只显示男生),
在“字段名”栏中选择被筛选的字段:“性别”(不能选通用型或备注型)
在“条件”栏中选定用于比较的类型:“=”
在“实例”栏中输入比较条件:“男”
⑤“排序依据”标签(确定记录输出时的顺序):
从“选定字段”框中选择字段:如“学号”-“添加”到“排序条件”框-在“排序选项”框中确定升(降)序
⑥“分组依据”标签(按某字段(即某特征)分类,然后对字段中特征相同的数据进行统计计算,如求和、平均值、个数、最大值、最小值等。这里不用,因此不理它),
⑦“更新条件”选项(决定视图中修改数据传回数据源中表的方法和要求):
1)“表”框:指定对哪些表可以更新
2)“字段名”框,(设置关键字段)单击此框中字段旁的“关键”(钥匙)列
(指定可更新字段)单击此框中字段旁的“更新”(笔)列
3)选“发送SQL更新”:决定是否更新源表中数据,至少要设置一个关键字段
4)“使用更新”框,(确定如何进行更新)
选“SQL DELETE 然后 INSERT”:先删除原记录,再插入新记录选“SQL UPDATE”:直接修改原始记录
 5)“SQL WHERE 子句包括”框:(在多用户环境中使用。更新记录前,检测是否其他用户正在修改)
  选“关键字段”:若源表中关键字段已改,则不能更新
选“关键字段和可更新字段”:若源表中关键字段和可更新字段已改,则不能更新
选“关键字段和已修改字段”:若源表中任何字段已改,则不能更新从“钥匙”栏选定“学号”这个关键字段;在“铅笔”栏选定可更新的字段,如“姓名”、“性别”、“入学总分”等。注意还要选定“发送SQL更新”项。
⑧“杂项”标签(对查询记录输出作限制。取默认值,也是不理):
⑨ 用“文件∕保存”命令(或Ctri + W)保存视图,取名“学生视图2”
⑩ 运行视图:双击数据库设计器中视图的图标、或单击“视图设计器”工具栏中“运行”钮。
3.用查询向导建立查询“学生成绩查询”,以查询Xsda和Xscj表中数学系,且没有补考的学生的学号,姓名,系别,各科课程的考试成绩
[解答]
(1)启动“查询设计器”,添加Xsda和Xscj表;
(2)从“字段选取”选项中选择学号、系别、姓名、高数、大语、邓论、英语、计算机等字段;
(3)在“为表建立关系”选项中为两表建立联接:在步骤2中按“添加”钮;
(4)选取匹配字段:因要显示两表中相应记录的值,故选取“仅包含匹配的行“项;
(5)从“筛选记录”选项中指定记录输出的条件,系别=数学系
(6)从“排序记录”选项中指定按学号升序显示
(7)在“限制记录”选项中,取默认值;
(8)按“完成”钮,保存查询文件“学生成绩查询”;
(9)运行查询,用“程序/运行”-选定查询文件“学生成绩查询”-按“运行”钮(或在命令窗口中输入:DO 学生成绩查询.QPR。一定要带扩展名.QPR)
4.用“查询设计器”为“学生表”和“成绩表”这两个表建立查询“学生成绩查询2”,以显示计算机班男生的学号、班级、姓名、入学成绩、课程号、成绩
[解答]
(1) 执行“文件/新建/查询”命令,单击“新建文件”按钮,进入“查询设计器”窗口。
① 在查询设计器中添加两个表:学生表和成绩表,并建立联接;
② 在“字段”标签中,添加要显示的字段:学号、班级、姓名、入学成绩、课程号、成绩;
③ 在“筛选”标签中,确定显示条件:数学系男生(注意:要按下“逻辑”下的“AND”项)
④ 对“排序依据”、“分组依据”和“杂项”,可以暂不理会;
⑤ 保存:用“文件∕保存”或Ctri + W,保存查询文件为“学生成绩查询2”;
⑥ 运行查询:用“程序/运行”-选定查询文件“学生成绩查询2”-按“运行”钮(或在命令窗口中输入:DO 学生成绩查询2.QPR
【高手进阶解答】
1.用“查询设计器”为“学生表”和“成绩表”这两个表建立查询“学生成绩查询3”,以查询各班学生考试平均成绩
[解答]此题目要用“分组论据”。按某字段(即某特征)分类,然后对字段中特征相同的数据进行统计计算,如求和、平均值、计数、最大值、最小值等,它分为以下三步,
①(“字段”选项的“函数与表达式”框中)输入用于对某字段计算的函数表达式-“添加”到“选定字段”框(则多一个存放计算结果的字段)
②(“分组依据”选项)在,可用字段”框中选择用于分组的字段-“添加”到“分组字段”框
③(“分组依据”选项的“满足条件”栏中)输入对字段计算的条件(类似“筛选”的设置)
建立查询时在查询设计器中添加两个表、在“字段”标签中,添加要显示的字段(只要一个字段:班级)、在“筛选”标签中,确定显示条件(这里没有条件)、“排序依据”、“分组依据”和“杂项”等与上一题的操作基本一样;
1)在“分组依据”标签中,指定按班级分组(将“班级”添加到“分组字段”框中;
2)在“字段”选项的“函数与表达式”框中,输入用于对成绩表的成绩字段计算的函数表达式“AVG(成绩)”,按“添加”钮,将其添加到“选定字段”框(则在显示时会多一个存放计算平均成绩的字段)
完成后保存运行(因没有对字段进行计算的条件,所以“分组依据”选项的“满足条件”栏中可不输入筛选条件)。
2.用“查询设计器”为“学生表”建立姓名、班级和入学成绩的交叉表查询。
(1)打开“查询设计器”,向设计器添加“学生表”。
(2)在“字段”标签中,添加要显示的字段:姓名、班级、入学成绩。
注:只能添加三个字段,第一字段为“行”数据源、第二字段为“列”数据源、第三字段为“数据”数据源。
(3)在“杂项”标签中,选择“交叉数据表”项
(4)完成后保存运行,结果如下图。
【综合测试解答】
根据“学生表”和“成绩表”,建立一个多表查询,完成查询“课程号”为1011的学生成绩信息。
[解答]
(1)打开“查询设计器”。将“学生表”、“成绩表”加入到查询设计器。并建立联接;
(2)将学生表中的学号、姓名、班级和成绩表中的课程号、成绩等字段添加到“可用字段”中;
(3)在“筛选”选项卡中设置筛选条件:成绩表的课程号=1011;
(4)在“排序依据”选项卡中,选择“成绩表,成绩”以“降序”方式添加到,排序条件”中。
(5)此题不需要“分组依据”,“杂项”取默认值;
(6)单击鼠标右键,选择“运行查询”,在“浏览”窗口中显示查询结果。
练习二 SQL查询功能(一)
【实验目的】
掌握SQL查询功能语句SELECT的操作;
熟练掌握单表查询;
熟练掌握带条件查询;
熟练掌握多表连接查询。
【知识要点】
 一、关系数据库标准语言SQL
SQL是一个一体化、非过程化、功能强大的关系型数据库应用语言。它包括查询、定义(创建、删除和修改表)、操纵(插入、更新和删除记录)和控制四个方面的功能。
SQL功能
命令动词
数据查询
SELECT
数据定义
CREATE、DROP、ALTER
数据操纵
INSERT、UPDATE、DELETE
数据控制
GRANT、REVOKE
二、SQL查询:
查询是SQL的核心,SQL查询命令称为SELECT命令
1.单表查询
(1)基本查询语句(无条件查询)
SELECT [ALL/DISTINCT] 字段名表 FROM 表名
说明:
用“字段名1,字段名2,…”来指定要显示的字段、若用“*”代替,则表示选取所有字段;
有DISTINCT,则不显示相同的记录、用ALL,则显示全体记录,包括重复记录;
用“FROM 表名”指明要从哪个(些)表中查询数据。
(2)带条件(WHERE)的查询语句
SELECT [ALL/DISTINCT] 字段名表 FROM 表名 WHERE 条件式说明:
用“条件式”选择满足条件的记录,使用条件是查询的关键。
2.多表连接查询
SELECT [ALL/DISTINCT] 字段名表 FROM 表1[,表2…] WHERE 条件式说明:在条件式中一定要输入两表联接条件:“表1.某字段=表2.某字段”
要求这几个表间至少有一个相同的字段,这个相同字段用来作连接条件
【实验内容】
一、SQL查询语句SELECT
1.单表查询
(在“成绩表”中)
(1)显示表中的所有记录;
(2)显示表中的学号、课程号、成绩三个字段;
(3)查询表中有多少个学号(即不显示相同的学号);
(4)查询表中成绩不及格的学生记录;
(在“学生表”表中)
(5)查询表中85年以后出生,且入学成绩大于560分的学生记录;
(6)查询表中85年出生的学生的学号,姓名,出生日期;
2.多表连接查询 [注意连接条件的使用]
(1)从学生表和成绩表中查询学生记录
(2)从学生表和成绩表中查询成绩不及格的学生姓名、课程号、成绩
(3)2002年计算机等级考试[二级(数据库)上机考试试卷(有修改)]
 1.在某商场管理系统中,以下2个数据表反映一个月内有关手机销售、库存情况。
 (1)商品月库存表(Stockll.dbf):
商品代码 品名 型号 单价   库存数量
2011 诺基亚 N8250 2250.00 16
2120 诺基亚 3310 990.00 18
4025 摩托罗拉 8088 2090.00 12
3122 爱立信 T29 1380.00 14
5203 西门子 2118 1470.00 18
(2)销售明细表(Sell.dbf):
商品代码 日期 销售数量 营业员   销售金额
2120 2001-11-12 5 方虹
4025 2001-11-12 6 方虹
3122 2001-11-13 4 李之和
2120 2001-11-14 10 张广河显示营业员方虹本月销售商品、数量(这两个表已经做好,在配套材料“表”文件夹中)。
二、SQL综合练习:
1,下列语句的作用是什么?上机操作后给出答案。
(1)SELECT * FROM 学生表
(2)SELECT 学号,姓名,出生日期 FROM 学生表 WHERE 出生日期;
BETWEEN CTOD("01/01/84") AND CTOD("12/31/84")
(3)SELECT 姓名,课程号,成绩 FROM 学生表,成绩表 ;
WHERE 学生表.学号=成绩表.学号 AND 成绩<60
(4)SELECT 学生表.学号,班级,课程号,成绩 FROM 学生表,成绩表 ;
WHERE 成绩表.学号=学生表.学号 AND 成绩>60 ;
AND ( 班级="计算机" OR 班级="金融")
2.用数据库命令做的题,现在用SQL语句来做:
(1)顺序查询,
① 在学生表中找出85年出生的学生记录
SET TALK OFF
USE 学生表
LOCATE FOR SUBSTR(DTOC(出生日期),7,2) =”85”
DO WHILE NOT EOF()
DISPLAY
CONTINUE
ENDDO
(2)建立关联,
① 将1区中的当前表“Xsda”与2区中的表“Xscj”按关键字段“学号”建立关联,并浏览学号、姓名和英语及计算机的成绩
( 注意:要先在不同的区中打开这两个表,并要对子表建立索引-对关键字“学号”)
SELECT 1 && 指定工作区1为当前工作区
USE Xsda && 在工作区1中打开Xsda表
SELECT 2 && 指定工作区2为当前工作区
USE Xscj && 在工作区2中打开Xscj表
INDEX ON 学号 TAG XH && 为成绩表(对学号)建立索引(名叫XH)
SELECT 1 && 指定工作区1为当前工作区
SET RELATION TO 学号 INTO 2
&& 按“学号”对2区(的成绩表)建立关联
BROWSE FIELDS 学号,姓名,B.英语,B.计算机
&& 子表记录前要加前缀:“别名-->”或“别名.”
【高手进阶】
嵌套查询:
将一个查询的结果,作为另一个查询的条件,这种查询中带查询,就是嵌套查询。
例1:从学生表和成绩表中查学生迪来的成绩和课程号
[解答]SELECT 课程号,成绩 FROM 成绩表 WHERE 学号= ;
(SELECT 学号 FROM 学生表 WHERE 姓名=”迪来”)
先从内层查询“SELECT 学号 FROM 学生表 WHERE 姓名="迪来"”,查出“迪来”的“学号”是05011013 ;然后从外层查询“SELECT 课程号,成绩 FROM 成绩表 WHERE 学号 = 05011013”,查学号是05011013的学生的课程号和成绩。
(1)从Xsda表中,查询所有与“汪洋”籍贯相同的学生姓名
(2)如果不用嵌套查询,可不可以?
例2:从学生表和成绩表中查询成绩不及格的学生姓名。
[解答]SELECT 姓名 FROM 学生表 WHERE 学号 IN (SELECT 学号 FROM 成绩表 WHERE 成绩<60)
内层查询“SELECT 学号 FROM 成绩表 WHERE 成绩<60”,查出成绩不及格的学生的学号,由于这些学号不只一个,所以不能用等号,而必须采用谓词IN,IN的含义是属于,即可等于这许多学号中的任一个,则外层查询就是查询这些学号的学生的姓名。
(1)从学生表和成绩表中查询计算机班的学生的各科成绩。
(2)从学生表和成绩表中查询0502系科学生的学号,课程号和成绩。
2.从键盘输入学号,在“成绩表”、“学生表”表中查询显示该学号学生的姓名及各门课程的成绩。
以前数据库命令,先建立关联,再查询(见下面程序)。现在用SQL语句,该如何写?
SET TALK OFF
SELECT 1
USE 学生表
INDEX ON 学号 TAG Xx
SELECT 2
USE 成绩表
SET RELATION TO 学号 INTO A
ACCEPT,请输入学生学号:” TO Xh
LOCATE FOR 学号 = Xh
DO WHILE NOT EOF()
DISPLAY 学号,学生表.姓名,课程号,成绩
CONTINUE
ENDDO
RETURN
【综合测试】( 5分钟 )
在学生表和成绩表中查找姓名为“王二春”的记录,若他有一科的成绩大于80分,则显示他的学号、姓名、课程号和成绩。
【实验过程】
一、SQL查询语句SELECT
1.单表查询
(在“成绩表”中)
(1)显示表中的所有记录;
[操作]SELECT * FROM 成绩表
(2)显示表中的学号、课程号、成绩三个字段;
[操作]SELECT 学号,课程号,成绩 FROM 成绩表
或:SELECT * FROM 成绩表
(3)查询表中有多少个学号(即不显示相同的学号)
[操作]SELECT DISTINCT 学号 FROM 成绩表
(4)查询表中成绩不及格的学生记录
[操作]SELECT * FROM 成绩表 WHERE 成绩<60
(在“学生表”表中)
(5)查询表中85年以后出生,且入学成绩大于560分的学生记录
[操作]SELECT * FROM 学生表 ;
WHERE 入学成绩>560 AND YEAR(出生日期)>1985
或:
SELECT * FROM 学生表 ;
WHERE 入学成绩>560 AND 出生日期>CTOD("12/31/85")
(6)查询表中85年出生的学生的学号、姓名、出生日期
[操作]SELECT 学号,姓名,出生日期 FROM 学生表 ;
WHERE 出生日期>= CTOD("01/01/85") AND 出生日期 <= CTOD("12/31/85")
或:
SELECT 学号,姓名,出生日期 FROM 学生表 WHERE YEAR(出生日期)= 1985
2.多表连接查询
(1)从学生表和成绩表中查询学生记录
[操作]SELECT * FROM 学生表,成绩表 WHERE 学生表.学号=成绩表.学号或(用数据库操作命令):
SELECT 1
USE 成绩表
INDEX ON 学号 TAG XH
SELECT 2
USE 学生表
SET RELATION TO 学号 INTO A
LIST 学号,姓名,A.课程号,A.成绩
(2)从学生表和成绩表中查询成绩不及格的学生姓名、课程号、成绩
[操作]SELECT 姓名,课程号,成绩 FROM 学生表,成绩表 ;
WHERE 学生表.学号=成绩表.学号 AND 成绩<60
或(用数据库操作命令):
SELECT 1
USE 学生表
INDEX ON 学号 TAG XH
SELECT 2
USE 成绩表
SET RELATION TO 学号 INTO A
LIST A.姓名,课程号,成绩 FOR 成绩<60
(3)2002年计算机等级考试[二级(数据库)上机考试试卷(有修改)]
 1.在某商场管理系统中,以下2个数据表反映一个月内有关手机销售、库存情况。
 (1)商品月库存表(Stockll.dbf),(注:这两个表已经做好,在“表”文件夹中)
商品代码 品名 型号 单价   库存数量
2011 诺基亚 N8250 2250.00 16
2120 诺基亚 3310 990.00 18
4025 摩托罗拉 8088 2090.00 12
3122 爱立信 T29 1380.00 14
5203 西门子 2118 1470.00 18
(2)销售明细表(Sell.dbf):
商品代码 日期 销售数量 营业员   销售金额
2120 2001-11-12 5 方虹
4025 2001-11-12 6 方虹
3122 2001-11-13 4 李之和
2120 2001-11-14 10 张广河显示营业员方虹本月销售商品、数量
[操作]SELECT 营业员,日期,品名,销售数量 FROM Stockll,Sell ;
WHERE Stockll.商品代码= Sell.商品代码 AND 营业员 =“方虹”
或(用数据库操作命令),
SET TALK OFF
SET SAFETY OFF
SET DATE YMD
CLEAR
SELECT 1
USE Stockll
INDEX ON 商品代码 TO SP
SELECT 2
USE Sell
SET RELATION TO 商品代码 INTO A
LIST 营业员,日期,A->品名,销售数量 FOR 营业员 =“方虹”
二、SQL综合练习:
1,下列语句的作用是什么?上机操作后给出答案。
(1)SELECT * FROM 学生表
[解答]显示学生表中的所有记录
(2)SELECT 学号,姓名,出生日期 FROM 学生表 WHERE 出生日期;
BETWEEN CTOD("01/01/84") AND CTOD("12/31/84")
[解答]显示学生表中出生日期在84年的学生的学号,姓名和出生日期
(3)SELECT 姓名,课程号,成绩 FROM 学生表,成绩表 ;
WHERE 学生表.学号=成绩表.学号 AND 成绩<60
[解答]从学生表和成绩表中查询成绩不及格的学生姓名、课程号、成绩
(4)SELECT 学生表.学号,班级,课程号,成绩 FROM 学生表,成绩表 ;
WHERE 成绩表.学号=学生表.学号 AND 成绩>60 ;
AND ( 班级="计算机" OR 班级="金融")
[解答]从学生表和成绩表中,查询并显示成绩在60分以上的计算机班或金融班学生的学号、班级、课程号及成绩
2,用数据库命令做的题,现在用SQL语句来做:
(1)顺序查询,
① 在学生表中找出85年出生的学生记录
SET TALK OFF
USE 学生表
LOCATE FOR YEAR(出生日期)=1985
DO WHILE NOT EOF()
DISPLAY
SKIP
ENDDO
RETURN
[操作]SELECT * FROM 学生表 WHERE YEAR(出生日期) = 1985
(2)多表联结,
① 将1区中的当前表“Xsda”与2区中的表“Xscj”按关键字段“学号”建立关联,并浏览学号、姓名和英语及计算机的成绩
( 注意:要先在不同的区中打开这两个表,并要对子表建立索引-对关键字“学号”)
SELECT 1 && 指定工作区1为当前工作区
USE Xscj && 在工作区1中打开Xscj表
INDEX ON 学号 TAG XH && 为成绩表(对学号)建立索引(名叫XH)
SELECT 2 && 指定工作区2为当前工作区
USE Xsda && 在工作区2中打开Xsdaj表
SET RELATION TO 学号 INTO A
&& 按“学号”对1区(的成绩表)建立关联
BROWSE FIELDS 学号,姓名,A.英语,A.计算机
&& 子表记录前要加前缀:“别名-->”或“别名.”
[操作]SELECT Xsda.学号,姓名,英语,计算机 FROM Xsda,Xscj ;
WHERE Xsda.学号 = Xscj.学号
【高手进阶解答】
1.嵌套查询:
将一个查询的结果,作为另一个查询的条件,这种查询中带查询,就是嵌套查询。
例1:从学生表和成绩表中查学生迪来的成绩和课程号
[解答]SELECT 课程号,成绩 FROM 成绩表 WHERE 学号 = ;
(SELECT 学号 FROM 学生表 WHERE 姓名=”迪来”)
先从内层查询“SELECT 学号 FROM 学生表 WHERE 姓名="迪来"”,查出“迪来”的“学号”是05011013 ;然后从外层查询“SELECT 课程号,成绩 FROM 成绩表 WHERE 学号 = 05011013”,查学号是05011013的学生的课程号和成绩。
(1)从Xsda表中,查询所有与“汪洋”籍贯相同的学生姓名
[解答]
SELECT 姓名 FROM Xsda ;
WHERE 籍贯 = (SELECT 籍贯 FROM Xsda WHERE 姓名="汪洋")
(2)如果不用嵌套查询,可不可以?
[解答]先查出汪洋的籍贯是“重庆”
SELECT 籍贯 FROM Xsda WHERE 姓名="汪洋"
再用一句语句查籍贯是“重庆”的学生姓名
SELECT 姓名 FROM Xsda WHERE 籍贯 = "重庆"
例2:从学生表和成绩表查询成绩不及格的学生姓名。
[解答]
SELECT姓名 FROM 学生表 WHERE 学号 IN ;
(SELECT 学号 FROM 成绩表 WHERE 成绩<60)
内层查询“SELECT 学号 FROM 成绩表 WHERE 成绩<60”,查出成绩不及格的学生的学号,由于这些学号不只一个,所以不能用等号,而必须采用谓词IN,IN的含义是属于,即可等于这许多学号中的任一个,则外层查询就是查询这些学号的学生的姓名。
(1)从学生表和成绩表中查询计算机班的学生的各科成绩。
[解答]
SELECT 学号,课程号,成绩 FROM 成绩表 WHERE 学号 IN ;
(SELECT 学号 FROM 学生表 WHERE 班级="计算机")
(2)从学生表和成绩表中查询0502系科学生的学号,课程号和成绩。
[解答]
SELECT学号,课程号,成绩 FROM 成绩表 WHERE 学号 IN ;
(SELECT 学号 FROM 学生表 WHERE SUBSTR(学号,1,4)= "0502")
2.从键盘输入学号,在“成绩表”、“课程表”表中查询显示该学号学生的各门课程的成绩。
[解答]
ACCEPT,请输入学生学号:” TO Xh
SELECT 成绩表.学号,姓名,课程号,成绩 FROM 成绩表,学生表 ;
WHERE 成绩表.学号 = 学生表.学号 AND成绩表.学号 = Xh
【综合测试解答】
在学生表和成绩表中查找姓名为“王二春”的记录,若他有一科的成绩大于80分,则显示他的学号、姓名、课程号和成绩。
[解答]
(1) SELECT 学生表.学号,姓名,课程号,成绩 FROM 学生表,成绩表 ;
WHERE 学生表.学号=成绩表.学号 AND 姓名="王二春" AND 成绩>80
[这程序只查询王二春80分以上的记录]
(2) SELECT 学生表.学号,姓名,课程号,成绩 FROM 学生表,成绩表 ;
WHERE 学生表.学号=成绩表.学号 AND 姓名="王二春" AND ;
成绩表.学号 IN(SELECT 学号 FROM 成绩表 WHERE 成绩>80)
[从内查询中查出所有成绩在80分以上的学号,在外查询中若王二春的学号在其中的话,则显示他的所有科目和成绩(含80分以下的)]
(3) ACCEPT,请输入学生姓名:” TO Xm
SELECT 学生表.学号,姓名,课程号,成绩 FROM 学生表,成绩表 ;
WHERE 学生表.学号=成绩表.学号 AND 姓名=Xm AND ;
成绩表.学号 IN(SELECT 学号 FROM 成绩表 WHERE 成绩>80)
[这程序可查任意输入姓名的满足条件(只要有一科在80分以上)的学生所有记录。王双春三科成绩均在80分以下,你看看能不能显示他的记录]
练习三 SQL查询功能(二)
【实验目的】
1.熟练掌握SQL查询功能语句SELECT的操作;
2.熟练掌握简单计算功能;
3.熟练掌握几个特殊的运算符。
【知识要点】
一、关系数据库标准语言SQL
3.简单的计算查询
SQL可以计算方式进行查询,常用的计算函数有:
① COUNT:计数
② SUM:求和
③ AVG:求平均值
④ MAX:求最大值
⑤ MIN:求最小值
4.几个特殊的运算符
① BETWEEN……AND …… 表示在“……和……之间”
② LIKE 表示与……匹配,用于“模糊”查询
它有两种匹配方式:“_”(下划线)表示一个字符;“%”表示任意多个字符
5.排序子句
 ORDER BY 字段 [ASC/DESC] 将查询结果排序输出
将记录按升序(ASC)[默认]或降序(DESC)排序
【实验内容】
一、SQL查询语句SELECT
1.简单的计算查询
(1)查询学生表中男学生的人数
(2)查询成绩表中课程号为1021的成绩总和
(3)查询Xscj表中计算机成绩在80分以上的人数、总分和平均分
(4)显示Xsda表中姓“张”学生的平均年龄
(5)从Xsda表和Xscj表查询英语系学生计算机考试的总分、平均分、最高分和参考人数
[要用Xsda表,取系别、Xscj表,取成绩]
2.几个特殊的运算符 ① BETWEEN……AND …… ;② LIKE ;③ ORDER BY
(1)查询学生表中83年出生的学生的学号,姓名,出生日期
(2)查询学生表中83到84年出生的学生的学号、姓名、出生日期
(3)查询学生表中入学成绩在500到600分的学生
(4)显示学生表中姓“王”的学生
(5)显示学生表中叫“王X”的学生
(6)显示学生表中叫“王XX”的学生
(7)显示学生表中姓名中含“王”字的学生(比较一下,这四题有何不同?理解%与_的区别)
(8)按入学成绩分数升序显示学生表的学生记录
(9)按入学成绩分数降序显示学生表中学生的学号、姓名和入学成绩记录
(10)按入学成绩分数降序显示学生表中500分以上的学生的学号、姓名和入学成绩二、SQL综合练习:
1.综合运用SELECT语句
(1)从学生表和成绩表中查询84年出生的学生的学号、姓名、出生日期、入学成绩、课程号和考试成绩
(2)从学生表和成绩表中查询姓张的学生的学号、姓名、入学成绩
(3)从学生表和成绩表中查询成绩在80到90分的学生的学号、姓名、课程号和成绩
(4)查询并显示学生表和成绩表中05级各个学生的学号、姓名、课程号及成绩
(5)查询并显示学生表和成绩表中“信息工程系”的各个学生的学号、姓名、各科课程的成绩(学号中第3到5位是011,则表示该生是“信息工程系”的)
(6)查询并显示学生表和成绩表中姓张和姓李的学生的学号、姓名、各科课程号及成绩
(7) 从学生表查询所有记录的学号、姓名、班级、入学成绩等内容,并按入学成绩降序排列
(8) 从学生表查询入学成绩在480分以上的学号、姓名、性别、团员否、入学成绩等内容,并按入学成绩升序排列
(9) 用两种方法从成绩表查询成绩在85至95分之间学号、课程号、成绩等内容,并按成绩降序排列
(10)从学生表和成绩表中查询姓王的学生的人数和考试平均成绩
2.下列语句的作用是什么?
(1)SELECT * FROM 学生表 WHERE 姓名 LIKE "李_"
(2)SELECT * FROM 学生表 ORDER BY 入学成绩 DESC
(3)SELECT 姓名,课程号,成绩 FROM 学生表,成绩表 ;
WHERE 学生表.学号= 成绩表.学号 AND 成绩<60
(4)SELECT * FROM 学生表 WHERE 姓名 LIKE "%李% "
(5)SELECT 学号,课程号,成绩 FROM 成绩表 ;
WHERE 成绩>80 ORDER BY 成绩
3.以前的题,现在用SQL语句来做:
(1)顺序查询,
在Xsda表中找出姓“张”的大于20岁的男生记录
USE Xsda
LOCATE ALL FOR SUBSTR(姓名,1,2) =”张” AND 年龄>20 AND 性别=”男”
DISPLAY
CONTINUE
DISPLAY
……
(2)数据统计:
① 统计学生表中入学成绩的最大值、最小值、总和、平均值
USE 学生表
CALCULATE MAX(入学成绩),MIN(入学成绩),SUM(入学成绩),AVG(入学成绩)
② 统计成绩表中1021课程的最大值、最小值、总和、平均值
USE 成绩表
CALCULATE MAX(成绩),MIN(成绩),SUM(成绩),AVG(成绩) ;
FOR 课程号=”1021”
【高手进阶】
1.从学生表查询所有记录的学号、姓名、班级、入学成绩等内容,并按班级入学成绩升序排列,同班同学按入学成绩降序排列
2.查询 Xscj表中计算机成绩在80分以上的人数和总分,并使用AS指定列标题
3.分组查询:GROUP BY子句将查询的结果进行分组,可进行分组汇总。
例1:从学生表中按班级统计各班学生的人数。
[解答]SELECT COUNT(*) FROM 学生表 GROUP BY 班级
(1)上题中,如果同时要显示班级名称,如何做?
(2)在成绩表中,按课程号统计各科的课程号、总分、平均分和参考人数
【自我测试】( 5分钟 )
1.在学生表中统计姓“张”学生的人数。
2.从学生表和成绩表中查询姓张的学生的人数和考试平均成绩
【实验过程】
一、SQL查询语句SELECT
1.简单的计算查询
(1)查询学生表中男学生的人数
[解答]SELECT COUNT(学号) FROM 学生表 WHERE 性别=”男”
或:
SELECT COUNT(*) FROM 学生表 WHERE 性别= "男"
注:COUNT(*)是COUNT的特殊形式,用于统计WHERE子句中逻辑表达式的记录的个数。
(2)查询成绩表中课程号为1021的成绩总和
[解答]SELECT SUM(成绩) FROM 成绩表 WHERE 课程号=”1021”
(3)查询 Xscj表中计算机成绩在80分以上的人数、总分和平均分
[解答]SELECT COUNT(*),SUM(计算机),AVG(计算机) FROM Xscj WHERE 计算机>=80
(4)显示 Xsda表中姓“张”学生的平均年龄
[解答]SELECT AVG(年龄) FROM Xsda WHERE SUBSTR(姓名,1,2)="张"
(5)从Xsda表和Xscj表查询英语系学生计算机考试的总分、平均分、最高分和参考人数
[要用Xsda表取系别、Xscj表取成绩]
[解答]SELECT COUNT(*),SUM(计算机),AVG(计算机),MAX(计算机) FROM Xsda,Xscj;
WHERE Xsda.学号= Xscj.学号 AND 系别= "英语系"
2.几个特殊的运算符 ① BETWEEN……AND …… ;② LIKE ;③ ORDER BY
(1)查询学生表中83年出生的学生的学号,姓名,出生日期
[解答]SELECT 学号,姓名,出生日期 FROM 学生表 ;
WHERE 出生日期 BETWEEN CTOD("01/01/83") AND CTOD("12/31/83")
(2)查询学生表中83到84年出生的学生的学号、姓名、出生日期
[解答]SELECT 学号,姓名,出生日期 FROM 学生表 ;
WHERE YEAR(出生日期) BETWEEN 1983 AND 1984
(3)查询学生表中入学成绩在500到600分的学生
[解答]SELECT * FROM 学生表 WHERE 入学成绩>500 AND 入学成绩<600
或:(比较一下,两者有何不同?)
SELECT * FROM 学生表 WHERE 入学成绩 BETWEEN 500 AND 600
(4)显示学生表中姓“王”的学生
[解答]SELECT * FROM 学生表 WHERE SUBSTR(姓名,1,2)="王"
或:SELECT * FROM 学生表 WHERE 姓名 LIKE "王%"
(5)显示学生表表中叫“王X”的学生
[解答]SELECT * FROM 学生表 WHERE 姓名 LIKE "王_"
(6)显示学生表表中叫,王XX”的学生
[解答]SELECT * FROM 学生表 WHERE 姓名 LIKE "王__"
(7)显示学生表表中姓名中含,王”字的学生(比较一下,这四题有何不同?理解%与_的区别)
[解答]SELECT * FROM 学生表 WHERE 姓名 LIKE "%王%"
(8)按入学成绩分数升序显示学生表的学生记录
[解答]SELECT * FROM 学生表 ORDER BY 入学成绩 ASC
(9)按入学成绩分数降序显示学生表中学生的学号、姓名和入学成绩记录
[解答]SELECT 学号,姓名,入学成绩 FROM 学生表 ORDER BY 入学成绩 DESC
(10)按入学成绩分数降序显示学生表中500分以上的学生的学号、姓名和入学成绩
[解答] SELECT 学号,姓名,入学成绩 FROM 学生表 ;
ORDER BY 入学成绩 DESC WHERE 入学成绩>500
二、SQL综合练习:
1.综合运用SELECT语句
(1)从学生表和成绩表中查询84年出生的学生的学号、姓名、出生日期、入学成绩、课程号和考试成绩
[解答]SELECT 学生表.学号,姓名,出生日期,入学成绩,课程号,成绩 ;
FROM 学生表,成绩表 ;
WHERE 学生表.学号=成绩表.学号 ;
AND 出生日期 BETWEEN CTOD("01/01/84") AND CTOD("12/31/84")
(2)从学生和成绩表中查询姓张的学生的学号、姓名、入学成绩
[解答]SELECT 学生表.学号,姓名,入学成绩 FROM 学生表,成绩表 ;
WHERE 学生表.学号=成绩表.学号 AND SUBSTR(姓名,1,2) = "张"
或:
SELECT 学生表.学号,姓名,入学成绩 FROM 学生表,成绩表 ;
WHERE 学生表.学号=成绩表.学号 AND 姓名 LIKE "张%"
(3)从学生表和成绩表中查询成绩在80到90分的学生的学号、姓名、课程号和成绩
[解答]SELECT 学生表.学号,姓名,课程号,成绩 FROM 学生表,成绩表 ;
WHERE 学生表.学号=成绩表.学号 AND 成绩 BETWEEN 80 AND 90
(4)查询并显示学生表和成绩表中05级各个学生的学号、姓名、课程号及成绩
[解答]SELECT 学生表.学号,姓名,课程号,成绩 FROM 学生表,成绩表 ;
WHERE 学生表.学号=成绩表.学号 AND 学生表.学号 LIKE "05%"
或:
SELECT 学生表.学号,姓名,课程号,成绩 FROM 学生表,成绩表 ;
WHERE 学生表.学号=成绩表.学号 AND SUBSTR(学生表.学号,1,2)= "05"
(5)查询并显示学生表和成绩表中“信息工程系”的各个学生的学号、姓名、各科课程的成绩(学号中第3到5位是011,则表示该生是“信息工程系”的)
[解答]SELECT 学生表.学号,姓名,课程号,成绩 FROM 学生表,成绩表 ;
WHERE 学生表.学号=成绩表.学号 AND 学生表.学号 LIKE "__011%"
或:
SELECT 学生表.学号,姓名,课程号,成绩 FROM 学生表,成绩表 ;
WHERE 学生表.学号=成绩表.学号 AND SUBSTR(学生表.学号,3,3)= "011"
(6)查询并显示学生表和成绩表中姓张和姓李的学生的学号、姓名、各科课程号及成绩
[解答]SELECT 学生表.学号,姓名,课程号,成绩 FROM 学生表,成绩表 ;
WHERE 学生表.学号=成绩表.学号 ;
AND ( 姓名 LIKE "张%" OR 姓名 LIKE "李%" )
(7) 从学生表查询所有记录的学号、姓名、班级、入学成绩等内容,并按入学成绩降序排列
[解答]SELECT 学号,姓名,班级,入学成绩 FROM 学生表 ORDER BY 入学成绩 DESC
(8) 从学生表查询入学成绩在480分以上的学号、姓名、性别、团员否、入学成绩等内容,并按入学成绩升序排列
[解答]SELECT 学号,姓名,性别,团员否,入学成绩 FROM 学生表 ;
WHERE 入学成绩>=480 ORDER BY 入学成绩
(9) 用两种方法从成绩表查询成绩在85至95分之间学号、课程号、成绩等内容,并按成绩降序排列
[解答]
① SELECT 学号,课程号,成绩 FROM 成绩表 ;
WHERE 成绩>=85 AND 成绩<=95 ORDER BY 成绩 DESC
② SELECT 学号,课程号,成绩 FROM 成绩表 ;
WHERE 成绩 BETWEEN 85 AND 95 ORDER BY 成绩 DESC
(10)从学生表和成绩表中查询姓王的学生的人数和考试平均成绩
[解答]SELECT COUNT(*),AVG(成绩) FROM 学生表,成绩表 ;
WHERE 学生表.学号= 成绩表.学号 AND姓名 LIKE "王%"
2.下列语句的作用是什么?
(1)SELECT * FROM 学生表 WHERE 姓名 LIKE "李_"
[解答]显示学生表中叫“李X”的学生
(2)SELECT * FROM 学生表 ORDER BY 入学成绩 DESC
[解答]显示学生表的学生记录,并按入学成绩分数降序显示
(3)SELECT 姓名,课程号,成绩 FROM 学生表,成绩表 ;
WHERE 学生表.学号= 成绩表.学号 AND 成绩<60
[解答]从学生表和成绩表中查询考试成绩不及格的学生姓名、课程号和考试成绩
(4)SELECT * FROM 学生表 WHERE 姓名 LIKE "%李% "
[解答]显示学生表表中姓名中有“李”字的学生
(5)SELECT 学号,课程号,成绩 FROM 成绩表 ;
WHERE 成绩>80 ORDER BY 成绩
[解答]按考试成绩升序显示成绩表中80分以上学生的学号、课程号和成绩
3.以前的题,现在用SQL语句来做:
(1)顺序查询,
在学生表中找出姓“张”的大于20岁的男生记录
USE Xsda
LOCATE ALL FOR SUBSTR(姓名,1,2) =”张” AND 年龄>20 AND 性别=”男”
DISPLAY
CONTINUE
DISPLAY
……
[解答]
SELECT * FROM Xsda ;
WHERE 性别 = "男" AND 年龄 > 20 AND 姓名 LIKE "张%"
(2)数据统计:
① 统计学生表中入学成绩的最大值、最小值、总和、平均值
USE 学生表
CALCULATE MAX(入学成绩),MIN(入学成绩),SUM(入学成绩),AVG(入学成绩)
[解答]
SELECT MAX(入学成绩),MIN(入学成绩),SUM(入学成绩),AVG(入学成绩) FROM 学生表
② 统计成绩表中1021课程的最大值、最小值、总和、平均值
USE 成绩表
CALCULATE MAX(成绩),MIN(成绩),SUM(成绩),AVG(成绩) ;
FOR 课程号=”1021”
[解答]
SELECT MAX(成绩),MIN(成绩),SUM(成绩),AVG(成绩) FROM 成绩表;
WHERE 课程号=”1021”
【高手进阶解答】
1.从学生表查询所有记录的学号、姓名、班级、入学成绩等内容,并按班级入学成绩升序排列,同班同学按入学成绩降序排列
[解答]
SELECT 学号,姓名,班级,入学成绩 FROM 学生表 ORDER BY 班级,入学成绩 DESC
2.查询 Xscj表中计算机成绩在80分以上的人数和总分,并使用AS指定列标题
[解答]短语AS,可以指定输出的列标题,使输出更容易被人理解
SELECT COUNT(*) AS 人数,SUM(计算机) AS 总分 FROM Xscj WHERE 计算机>=80
3.分组查询:GROUP BY子句将查询的结果进行分组,可进行分组汇总。
例1:从学生表中按班级统计各班学生的人数。
[解答]SELECT COUNT(*) FROM 学生表 GROUP BY 班级
(1)上题中,如果同时要显示班级名称,如何做?
[解答]
SELECT 班级,COUNT(*) FROM 学生表 GROUP BY 班级
(2) 在成绩表中,按课程号统计各科的课程号、总分、平均分和参考人数
[解答]
SELECT 课程号,SUM(成绩) AS 总分,AVG(成绩) AS 平均分,COUNT(*) AS 参考人数;
FROM 成绩表 GROUP BY 课程号
【自我测试解答】( 5分钟 )
1.在学生表中统计姓“张”学生的人数。
[解答]SELECT COUNT(*) FROM 学生表 WHERE 姓名 LIKE "张%"
2.从学生表和成绩表中查询姓张的学生的人数和考试平均成绩
[解答]SELECT COUNT(*),AVG(成绩) FROM 学生表,成绩表 ;
WHERE 学生表.学号=成绩表.学号 AND 姓名 LIKE "张%"
练习四 SQL定义功能
【实验目的】
1.掌握SQL定义功能语句的操作;
2.熟练掌握表的定义(CREATE);
3.熟练掌握表的删除(DROP);
4.熟练掌握表结构的修改、添加和修改字段(ALTER)。
【知识要点】
表的定义:创建一个新表
CREATE TABLE 表名(字段名 类型[,字段名 类型]……)
说明:
(1)常用数据类型有字符型:C(n);:数值型:N(n,d);日期型:D(默认为8位);逻辑型:L(默认为1位)等;
(2)建表前应对此表的结构、内容,做到心中有数,即清楚要有几列、取什么名字、什么类型、宽度多大;
(3)在建立表之前,应先建立一个数据库。在此库中定义表。
建立数据库:CREATE DATABASE 数据库名
(4)以前的数据库操作命令:CREATE 表名 → 进入“表设计器”
2.表的删除:删除一个表
DROP TABLE 表名说明:
(1)直接从磁盘上删除表名所对应的.dbf文件;
(2)如果表是数据库中的表,则从数据库中删除此表(对数据库中的表,应先打开数据库,再删除表,否则以后会出现错误信息)。
3.表结构的修改:类似“表设计器”的操作
(1)添加∕修改字段
ALTER TABLE 表名 ADD/ALTER 字段名 类型(宽度[,小数])
说明:
① 可添加(ADD)字段或修改字段(ALTER),字段名后应带类型和宽度;
② 不能修改字段名和删除字段。
(2)删除字段、更改字段名
ALTER TABLE 表名 DROP 字段名 RENAME 字段名1 TO 字段名2
说明:
① DROP 字段名 从指定表中删除指定字段。
② RENAME 字段名1 TO 字段名2 从指定表中将字段名1改为字段名2
③ 或,
ALTER TABLE 表名 DROP 字段名 删除字段
ALTER TABLE 表名 RENAME 字段名1 TO 字段名2  修改字段名
注:表结构修改的操作在第3章中修改表结构中是用“表设计器”和命令“MODIFY STRUCTURE”进行的
【实验内容】
二、SQL定义语句
1.表的定义(CREATE)
(1)创建“学生表A”:学号(C,8)、姓名(C,6)、、入学成绩(N,3)
(2)在D盘根目录下创建“学生表B”:学号(C,8)、姓名(C,6)、入学成绩(N,5,1)、简历(M)、相片(G)
(3)在D盘根目录下先创建一个数据库“学生管理”,在此数据库中创建“学生表C”:学号(C,8)、姓名(C,6)、出生日期(D)、入学成绩(N,5,1)
2.表的删除:(DROP)
(1)删除D 盘根目录中的“学生表A”
(2)删除D 盘根目录的数据库“学生管理”中的“学生表C”
3.表结构的修改(ALTER)
(1)添加∕修改字段
1)添加字段
① 在D盘根目录的“学生表B”中添加一个N(2)类型的字段:年龄
② 在D盘根目录的“学生表B”中添加两个字段:班级(C,8)、团员否(L)
2)修改字段
① 将D盘根目录的“学生表B”中姓名字段的宽度由原来的6改为8
② 将D盘根目录的“学生表B”中学号字段的类型改成N型、宽度改为6(1位小数)
(2)删除字段、更改字段名
1)删除字段
① 将Xscj表中的“等级”字段删除
② 将D盘根目录的“学生表B”的“年龄”字段删除
2)更改字段名
① 将Xscj表中的“平均”字段改名为“平均分”
② 将D盘根目录的“学生表B”中字段“相片”改名为“像片”
4.综合练习
(1)在D盘根目录中创建如下表的“学生表A”(见P43)
字段名
字段类型
字段宽度
小数点
学号
字符型
8
姓名
字符型
8
性别
字符型
2
出生日期
日期型
8
团员否
逻辑型
1
入学成绩
数值型
6
2
班级
字符型
10
照片
通用型
4
简历
备注型
4
(2)为“学生表A”中添加一个字符型字段“系别”(宽度:10)
(3)将“学生表A”的字段“出生日期”改成“出生年月”
(4)将“学生表A”的“入学成绩”字段的宽度改为3,小数去掉
(5)将“学生表A”的“团员否”字段改为字符型,宽度改为2
(6)将“学生表A”的“班级”字段删除
(7)删除“学生表A”
【高手进阶】
(1)在D盘根目录中创建如下表的“学生表B”
字段名
字段类型
字段宽度
学号
字符型
7
专业
字符型
4
姓名
字符型
6
性别
字符型
2
出生年月
日期型
8
团员
逻辑型
1
(2)用“INSERT”命令为“学生表B”添加如下三条记录学号
专业
年级
姓名
性别
出生年月
团员
9103001
通讯
91
张佳
女
09/23/82
.T.
9101016
软件
91
陈莉
男
11/03/83
.T.
9102015
应用
91
王磊
男
04/26/82
.F.
注:用“INSERT”命令可对当前表插入记录
INSERT INTO 表名 VALUES(对应列名1的值,...,对应列名n的值)
【自我测试】( 5分钟 )
(1)在D盘根目录中创建如下表的“学生表C”
字段名
字段类型
字段宽度
小数点
学号
字符型
6
班级
字符型
6
姓名
字符型
6
出生年月
日期型
8
入学成绩
数值型
5
2
(2)为“学生表C”中添加一个字符型字段“性别”(宽度:2)
(3)将“学生表C”的“班级”字段删除
【实验过程】
二、SQL定义语句
1.表的定义(CREATE)
(1)创建“学生表A”:学号(C,8)、姓名(C,6)、、入学成绩(N,3)
[解答]
CREATE TABLE 学生表A (学号 C(8),姓名 C(6),出生日期 D,入学成绩 N(3))
注意:
字段名后加一空格再输入数据类型后用括号输入宽度,系统默认的宽度就不输入;
所有字段内容用一括号括起紧接在表名的后面。
(2)在D盘根目录下创建“学生表B”:学号(C,8)、姓名(C,6)、入学成绩(N,5,1)、简历(M)、相片(G)
[解答]
CREATE TABLE D:\学生表B (学号 C(8),姓名 C(6),入学成绩 N(5,1),简历 M,相片 G)
(3)在D盘根目录下先创建一个数据库“学生管理”,在此数据库中创建“学生表C”:学号(C,8)、姓名(C,6)、出生日期(D)、入学成绩(N,5,1)
[解答]
CREATE DATABASE D:\学生管理 先建立数据库
CREATE TABLE 学生表C (学号 C(8),姓名 C(6),出生日期 D,入学成绩 N(5,1))
2.表的删除(DROP)
(1)删除D 盘根目录中的“学生表A”
[解答]
DROP TABLE D:\学生表A
(2)删除D 盘根目录的数据库“学生管理”中的“学生表C”
[解答]
OPEN DATABASE D:\学生管理 先打开数据库
DROP TABLE 学生表C
另类删除:可通过Windows的删除命令进行删除。但对数据库中的表最好移出去再删除。
3.表结构的修改(ALTER)
(1)添加∕修改字段
1)添加字段
① 在D盘根目录的“学生表B”中添加一个N(2)类型的字段:年龄
ALTER TABLE D:\学生表B ADD 年龄 N(2)
注:字段名后加一空格再带类型和宽度
② 在D盘根目录的“学生表B”中添加两个字段:班级(C,8)、团员否(L)
[解答]
ALTER TABLE D:\学生表B ADD 班级 C(8) ADD 团员否 L
注:添加两个字段,要用两个ADD语句
2)修改字段(类型和宽度)
① 将D盘根目录的“学生表B”中姓名字段的宽度由原来的6改为8
[解答]
ALTER TABLE D:\学生表B ALTER 姓名 C(8)
注:表名后用ADD 字段名 类型(宽度)是添加一个字段;
用ALTER字段名 类型(宽度)可修改字段的类型、宽度,但不能修改字段名。
② 将D盘根目录的“学生表B”中学号字段的类型改成N型、宽度改为6(1位小数)
[解答]
ALTER TABLE D:\学生表B ALTER 学号 N(6,1)
注:① 只要直接写入新的字段类型或宽度即可;② 不能修改字段名和删除字段。
(2)删除字段、更改字段名
1)删除字段
① 将Xscj表中的“等级”字段删除
[解答]
ALTER TABLE Xscj DROP 等级
② 将D盘根目录的“学生表B”的“年龄”字段删除
[解答]
ALTER TABLE D:\学生表B DROP 年龄
2)更改字段名
① 将Xscj表中的“平均”字段改名为“平均分”
[解答]
ALTER TABLE Xscj RENAME 平均 TO 平均分
② 将D盘根目录的“学生表B”中字段“相片”改名为“像片”
[解答]
ALTER TABLE D:\学生表B RENAME 相片 TO像片
4.综合练习
(1)在D盘根目录中创建如下表的“学生表A”(见P43)
字段名
字段类型
字段宽度
小数点
学号
字符型
8
姓名
字符型
8
性别
字符型
2
出生日期
日期型
8
团员否
逻辑型
1
入学成绩
数值型
6
2
班级
字符型
10
照片
通用型
4
简历
备注型
4
[解答]
CREATE TABLE 学生表A (学号 C(8),姓名 C(8),性别 C(2),出生日期 D,;
团员否 L,入学成绩 N(6,2),班级 C(10),照片 G,简历 M)
(2)为“学生表A”中添加一个字符型字段“系别”(宽度:10)
[解答]
ALTER TABLE 学生表A ADD 系别 C(10)
(3)将“学生表A”的字段“出生日期”改成“出生年月”
[解答]
ALTER TABLE 学生表A RENAME 出生日期 TO 出生年月
(4)将“学生表A”的“入学成绩”字段的宽度改为3,小数去掉
[解答]
ALTER TABLE 学生表A ALTER 入学成绩 N(3)
(5)将“学生表A”的“团员否”字段改为字符型,宽度改为2
[解答]
ALTER TABLE 学生表A ALTER 团员否 C(2)
(6)将“学生表A”的“班级”字段删除
[解答]
ALTER TABLE 学生表A DROP 班级
(7)删除“学生表A”
[解答]
DROP TABLE 学生表A
【高手进阶解答】
(1)在D盘根目录中创建如下表的“学生表B”
字段名
字段类型
字段宽度
学号
字符型
7
专业
字符型
4
姓名
字符型
6
性别
字符型
2
出生年月
日期型
8
团员
逻辑型
1
[解答]
CREATE TABLE 学生表B (学号 C(7),专业 C(4),姓名 C(6),性别 C(2),;
出生年月 D,团员 L
(2)用“INSERT”命令为“学生表B”添加如下三条记录学号
专业
年级
姓名
性别
出生年月
团员
9103001
通讯
91
张佳
女
09/23/82
.T.
9101016
软件
91
陈莉
男
11/03/83
.T.
9102015
应用
91
王磊
男
04/26/82
.F.
INSERT INTO 学生表B VALUES(“9103001”,”通讯”,”91”,”张佳”,”女”,{^1982-09-23},.T.)
INSERT INTO 学生表B VALUES(“9101016”,”软件”,”91”,”陈莉”,”男”,{^1983-11-03},.T.)
INSERT INTO 学生表B VALUES(“9102015”,”应用”,”91”,”王磊”,”男”,{^1982-04-26},.F.)
注:一条命令只能添加一条记录
【自我测试解答】( 5分钟 )
(1)在D盘根目录中创建如下表的“学生表C”
字段名
字段类型
字段宽度
小数点
学号
字符型
6
班级
字符型
6
姓名
字符型
6
出生年月
日期型
8
入学成绩
数值型
5
2
[解答]
CREATE TABLE 学生表C (学号 C(6),班级 C(6),姓名 C(6),;
出生年月 D,入学成绩 N(5,2)
(2)为“学生表C”中添加一个字符型字段“性别”(宽度:2)
[解答]
ALTER TABLE 学生表C ADD 性别 C(2)
(3)将“学生表C”的“班级”字段删除
[解答]
ALTER TABLE 学生表C DROP 班级
练习五 SQL操作功能
【实验目的】
1.掌握SQL操作功能语句的操作;
2.熟练掌握表记录的更新(UPDATE);
3.熟练掌握表记录的插入(INSERT);
4.熟练掌握表记录的删除(DETELE)。
【知识要点】
1.表记录的更新:更新满足条件的记录的字段值,类似替换命令REPLACE
UPDATE 表名 SET 字段名1 = 表达式1 [,字段名2 = 表达式2,… ];
WHERE 条件式说明:
(1)该语句一次可更新多个字段的值;
(2)不使用WHERE子句,则更新所有记录;
(3)此语句类似REPLACE命令。
2.表记录的插入:按指定字段名顺序在表末尾插入用表达式表示字段值的一条记录
INSERT INTO 表名 [字段名1,字段名2,……] VALUES[表达式1,表达式2,……]
说明:
(1)[字段名1,字段名2,……]是用来指定表中的(部分)字段名;[表达式1,表达式2,……]为指定字段的具体记录值,它要与前面的字段名一一对应;
(2)若无[字段名1,字段名2,……],则是对所有字段追加记录,这时的记录必须与表结构中的字段名一一对应;
(3)此命令是用以编程方式在表末尾追加一条记录。
3.表记录的删除:为表中满足条件的记录作删除标记
DELETE FORM 表名 WHERE 条件式说明:
(1)删除表中满足条件的记录。若无条件项,则删除所有记录;
(2)此语句类似DELETE命令,只对记录作删除标记;
(3)要彻底删除记录,必须使用PACK命令(也可用RECALL命令撤消标记)。
【实验内容】
三、SQL操作语句
1.表记录更新(UPDATE)
修改数据后,用“查询”语句“SELECT * FROM 表名”观看修改后的结果
(1)计算Xscj表的总分
(2)在Xscj表中将总分在330分以上(含330)的等级设置为合格,330分以下的为不合格。
(3)将Xscj表中学号为“10100116”的“计算机”成绩增加20分
(4)将Xscj表中“英语”成绩>80分的增加10%
(5)将成绩表中,学“1011”号课及学“2020”号课的,成绩增加10分
(6)将成绩表中学号为“05031003”的“3002”号课成绩增加20分
(7)将成绩表中学号3、4位是“02”的“成绩”增加20分
(8)将学生表中班级是“金融”的前面加上“经贸”二字
(9)将学生表中学生“王大发”的入学成绩增加10分,并把性别改为“女”
2.表记录的插入(INSERT)
(1)在成绩表插入下面两条记录学号
课程号
成绩
05011001
1031
91
05021012
2020
76
(2)在学生表插入下面两条记录学号
班级
姓名
性别
出生日期
团员否
05031015
会计
张三风
女
03/28/86
.T.
05021018
金融
段誉
男
04/01/85
.F.
3.表记录的删除(DELETE)此语句仅对记录作删除标记
(1)删除学生表中入学成绩低于500分的男生记录
(2)从Xsda表中删除计算机系的重庆学生的记录。
(3)将Xscj表中“计算机”成绩在60到79分之间的记录删除
(4)将学生表中姓“张”的学生记录删除
(5)将学生表中不是“团员”的学生记录删除
4.综合运用:06计算机等级考试模拟试卷[二级(数据库)上机考试]
1、建立一个图书交易管理数据库,文件名为SJY.DBC,并输入数据(30分)该数据库有两个数据表:书籍表SJ.DBF和交易表JY.DBF。其数据形式如下:
书号
书名
2030
计算机原理
4644
离散数学
6426
软件工程
3535
高等数学
3376
经济法
3679
大学语文
4636
大学英语
5675
基础会计
书籍表SJ.DBF
交易表JY.DBF
书号
已售
定价
册数
总金额
2030
.T.
21.20
134
4644
.F.
17.60
128
6426
.T.
30.00
69
3535
.F.
18.80
306
3376
.T.
22.30
238
3679
.T.
19.00
112
4636
.F.
25.40
168
5675
.F.
18.50
280
要求:将数据库(SJY.DBC)中的SJ.DBF和JY.DBF两表以”书号”建立一对多的永久关系。[注:已售为真(,T.),即此书已销售 ]
2、操作数据库表。要求将相关命令保留到程序文件CQEEC61.PRG中(40分)。
注:使用VFP数据表操作命令或者VFP-SQL命令,一个任务可由若干个命令组成,请用注释语句标注题号。
(1)根据股份和册数计算每次交易的总金额,并将计算结果写入JY.DBF表中;
(2)查询已经交易的股票信息,要求显示书名,册数,股份及交易总金额,已经交易的为.T.
(3)按已售汇总册数和交易总金额,并显示已售和汇总后的册数和交易总金额
(4)将JY.DBF中还没有交易的股票逻辑删除。
3、程序填空,要求输入并完善程序,程序文件名为PROG061.PRG(30分)
注:在程序开头,必须用注释语句输入学校名,准考证号,姓名以下程序的功能是能反复输入书号(按‘Q’键退出),并输出该书籍的销售情况,格式为:“书名,已售,销售总金额”最后输出该书籍已经销售的总数量和总金额。
程序代码:
SELECT 1
USE SJ
INDEX ON 书号 TAG SH
SELECT 2
USE JY
SET RELATION TO 书号 INTO A
X=.T.
DO WHILE X
ACCEPT "请输入书号:" TO DM
IF UPPER(ALLTRIM(DM))="Q"

LOOP
ENDIF
"书名 已售 册数 销售金额"
SCAN FOR ②
A.书名,已售,册数,总金额
ENDSCAN
CALCULATE ③ TO S1,S2 FOR NOT 已售 AND 书号=DM
"该书籍已经销售的总数量 总金额"
S1,S2
ENDDO
CLOSE ALL
SET TALK ON
RETURN
【高手进阶】
(1)将学生表中学生“章立新”的各科成绩全更新为0(要用两个表,从学生表中找章立新的学号,从成绩表中将此学号的成绩更新为0)
(2)将学生表中学生“迪来”的各科成绩从成绩表中删去
【自我测试】( 5分钟)
对Xsda表和Xscj表,使用VFP-SQL命令和VFP数据表操作命令,完成下列操作。
(1)显示学号是“101”开头的学生学号、姓名、性别和年龄;
(2)计算学生的总分和平均分,并显示结果;
(3)计算英语和计算机的总分和平均分,并显示结果;
(4)显示计算机系学生的高数、英语、计算机成绩及这三科的总分。
【实验过程】
三、SQL操作语句
1.表记录更新(UPDATE)
修改数据后,用“查询”语句“SELECT * FROM 表名”观看修改后的结果
(1)计算Xscj表的总分
[解答]
UPDATE Xscj SET 总分 = 高数+大语+邓论+英语+计算机
或:(使用VFP数据表操作命令。注意看看有什么地方不同)
USE Xscj
REPLACE 总分 WITH高数+大语+邓论+英语+计算机 ALL
(2)在Xscj表中将总分在330分以上(含330)的等级设置为合格,330分以下的为不合格。
[解答]
UPDATE Xscj SET 等级="合格" WHERE 总分 >= 330
UPDATE Xscj SET 等级="不合格" WHERE 总分 < 330
[因条件不一样,所以用两条更新语句]
(3)将Xscj表中学号为“10100116”的“计算机”成绩增加20分
[解答]
UPDATE Xscj SET 计算机=计算机+20 WHERE 学号=”10100116”
(4)将Xscj表中“英语”成绩>80分的增加10%
[解答]
UPDATE Xscj SET 英语=英语*1.1 WHERE 英语>80
(5)将成绩表中,学“1011”号课及学“2020”号课的,成绩增加10分
[解答]
UPDATE 成绩表 SET 成绩=成绩+10 WHERE 课程号=”1011” or 课程号=”2020”
(6)将成绩表中学号为“05031003”的“3002”号课成绩增加20分
[解答]
UPDATE 成绩表 SET 成绩=成绩+20 WHERE 学号=”05031003” and 课程号=”3002”
(7)将成绩表中学号3、4位是“02”的“成绩”增加20分
[解答]
UPDATE 成绩表 SET 成绩=成绩+20 WHER 学号LIKE,__02%”
或:UPDATE 成绩表 SET 成绩=成绩+20 WHERE SUBSTR(学号,1,2)=”02”
(8)将学生表中班级是“金融”的前面加上“经贸”二字
UPDATE 学生表 SET 班级=”经贸金融” WHERE 班级=”金融”
(9)将学生表中学生“王大发”的入学成绩增加10分,并把性别改为“女”
[解答]
UPDATE 学生表 SET 入学成绩=入学成绩+10,性别=”女” WHERE 姓名=”王大发”
2.表记录的插入(INSERT)
(1)在成绩表插入下面两条记录学号
课程号
成绩
05011001
1031
91
05021012
2020
76
[解答]注意:一条命令只能插入一条记录
INSERT INTO 成绩表 VALUES(“05011001”,”1031”,91)
INSERT INTO 成绩表 VALUES(“05021012”,”2020”,76)
(2)在学生表插入下面两条记录学号
班级
姓名
性别
出生日期
团员否
05031015
会计
张三风
女
03/28/86
.T.
05021018
金融
段誉
男
04/01/85
.F.
[解答]注意:不是对表中所有字段进行操作
INSERT INTO 学生表(学号,班级,姓名,性别,出生日期,团员否) ;
VALUES(“05031015”,”会计”,”张三风”,”女”,{^1986-03-28},.T.)
INSERT INTO 学生表(学号,班级,姓名,性别,出生日期,团员否) ;
VALUES(“05021018”,”金融”,”段誉”,”男”,CTOD(“04/01/85”),.F.)
注意:对字段名要用括号括起;字段内容的顺序要与字段名对齐;两种不同的日期语句
3.表记录的删除(DELETE)此语句仅对记录作删除标记
(1)删除学生表中入学成绩低于500分的男生记录
[解答]
DELETE FROM 学生表 WHERE 入学成绩<500 AND 性别="男"
或:(使用VFP数据表操作命令)
USE 学生表
DELETE FOR 入学成绩<500 AND 性别="男"
(2)从Xsda表中删除计算机系的重庆学生的记录。
[解答]
DELETE FROM 学生表 WHERE 系别 ="计算机系" AND 籍贯="重庆"
(3)将Xscj表中“计算机”成绩在60到79分之间的记录删除
[解答]
DELETE FROM Xscj WHERE 计算机 BETWEEN 60 AND 79
或:DELETE FROM Xscj WHERE 计算机>=60 and 计算机<=79
(4)将学生表中姓“张”的学生记录删除
[解答]
DELETE FROM 学生表 WHERE 姓名 LIKE,张%”
或:DELETE FROM 学生表 WHERE SUBSTR(姓名,1,2) =,张”
(5)将学生表中不是“团员”的学生记录删除
[解答]
DELETE FROM 学生表 WHERE 团员=.F.
或:DELETE FROM 学生表 WHERE NOT 团员注:“NOT 团员”表示不是团员;或用“团员=.F.”(“团员”字段为假)表示
4.综合运用,06计算机等级考试模拟试卷[二级(数据库)上机考试]
1、建立一个图书交易管理数据库,文件名为SJY.DBC,并输入数据(30分)
该数据库有两个数据表:书籍表SJ.DBF和交易表JY.DBF。其数据形式如下:
书号
书名
2030
计算机原理
4644
离散数学
6426
软件工程
3535
高等数学
3376
经济法
3679
大学语文
4636
大学英语
5675
基础会计
书籍表SJ.DBF
交易表JY.DBF
书号
已售
定价
册数
总金额
2030
.T.
21.20
134
4644
.F.
17.60
128
6426
.T.
30.00
69
3535
.F.
18.80
306
3376
.T.
22.30
238
3679
.T.
19.00
112
4636
.F.
25.40
168
5675
.F.
18.50
280
要求:将数据库(SJY.DBC)中的SJ.DBF和JY.DBF两表以”书号”建立一对多的永久关系,[注:已售为真(,T.),即此书已销售 ]
[解答]
两表已建好,自己在数据库(SJY.DBC)中建一对多的永久关系(在数据库中,先建索引,父表要设为主索引,然后用鼠标拖索引标记到子表)
2、操作数据库表。要求将相关命令保留到程序文件CQEEC61.PRG中(40分)。
注:使用VFP数据表操作命令或者VFP-SQL命令,一个任务可由若干个命令组成,请用注释语句标注题号。
(1)根据股份和册数计算每次交易的总金额,并将计算结果写入JY.DBF表中;
[解答]
SQL语句:
UPDATE JY SET 总金额 = 册数*定价
VFP数据表操作命令
USE JY
REPLACE ALL 总金额 WITH 册数*定价
(2)查询已经交易的股票信息,要求显示书名,册数,股份及交易总金额,已经交易的为.T.
[解答]
SQL语句:
SELECT 书名,册数,定价,总金额 FROM SJ,JY ;
WHERE SJ.书号=JY.书号 AND 已售
VFP数据表操作命令
SELECT 1
USE SJ
INDEX ON 书号 TAG DM
SELECT 2
USE JY
SET RELATION TO 书号 INTO SJ
LIST SJ.书名,册数,定价,总金额 FOR 已售 OFF
(3)按已售汇总册数和交易总金额,并显示已售和汇总后的册数和交易总金额
[解答]
SQL语句:
SELECT 已售,SUM(册数),SUM(总金额) ;
FROM JY GROUP BY 已售
VFP数据表操作命令
USE JY
INDEX ON 已售 TAG LX
TOTAL ON 已售 TO HZ
USE HZ
LIST 已售,册数,总金额 OFF
(4)将JY.DBF中还没有交易的股票逻辑删除。
[解答]
SQL语句:
DELETE FROM JY WHERE NOT 已售
[注:“NOT 已售”,表示已售为假(,F.),即此书没销售]
VFP数据表操作命令
USE JY
DELETE FOR NOT 已售
3、程序填空,要求输入并完善程序,程序文件名为PROG0621.PRG(30分)
注:在程序开头,必须用注释语句输入学校名,准考证号,姓名以下程序的功能是能反复输入书号(按‘Q’键退出),并输出该股票的交易情况,格式为:“书名,已售,交易总金额”最后输出该股票已经交易的总数量和总总金额。
程序代码:
[解答]
① X=.F,
② 书号=DM
③ SUM(册数),SUM(总金额)
【高手进阶解答】
(1)将学生表中学生“章立新”的各科成绩全更新为0(要用两个表,从学生表中找章立新的学号,从成绩表中将此学号的成绩更新为0)
[解答]
UPDATE 成绩表 SET 成绩= 0 WHERE 学号 = ;
(SELECT学号 FROM 学生表 WHERE 姓名= "章立新")
(2)将学生表中学生“迪来”的各科成绩从成绩表中删去
[解答]
DELETE FROM 成绩表 WHERE 学号 = ;
(SELECT 学号 FROM 学生表 WHERE 姓名="迪来")
【自我测试解答】( 5分钟 )
对Xsda表和Xscj表,使用VFP数据表操作命令和VFP-SQL命令,完成下列操作。
(1)显示学号是“101”开头的学生学号、姓名、性别和年龄;
[解答]
SQL语句:
SELECT 学号,姓名,性别,年龄 FROM Xsda WHERE 学号 LIKE "101%"
VFP数据表操作命令
USE Xsda
LIST学号,姓名,性别,年龄 FOR SUBSTR(学号,1,3) = "101"
(2)计算学生的总分和平均分,并显示结果;
[解答]
SQL语句:
UPDATE Xscj SET 总分=高数+大语+邓论+英语+计算机,平均=总分/5
注:也可写成两句,分别计算
VFP数据表操作命令
USE Xscj
REPLACE 总分 WITH 高数+大语+邓论+英语+计算机,平均 WITH 总分/5 ALL
(3)计算英语和计算机的总分和平均分,并显示结果;
[解答]
SQL语句:
SELECT SUM(英语),SUM(计算机),AVG(英语),AVG(计算机) FROM Xscj
VFP数据表操作命令
USE Xscj
SUM 英语,计算机 TO F1,F2
AVERAGE 英语,计算机TO E1,E2
或:CALCULATE SUM(英语),SUM(计算机),AVG(英语),AVG(计算机) TO F1,F2,E1,E2
" 英语总分 计算机总分 英语平均分 计算机平均分"
F1,F2,E1,E2
注意:这两个总分和平均分是不同的,(3)题是对字段计算(按列),而(2)题是对每条记录计算(按行)。它们所用的命令是完全不同的。
(4)显示计算机系学生的高数、英语、计算机成绩及这三科的总分。
[解答]
SQL语句:
SELECT 系别,姓名,高数,英语,计算机 FROM Xsda,Xscj ;
WHERE Xsda.学号 = Xscj.学号 AND 系别=,计算机系”
VFP数据表操作命令
SELECT 1
USE Xsda
INDEX ON 学号 TAG XH
SELECT 2
USE Xscj
SET RELATION TO 学号 INTO A
LIST FIELDS A.系别,A.姓名,高数,英语,计算机FOR A.系别=“计算机系”
CLOSE ALL
RETURN
第5章 项目管理器的使用练习一 项目管理器基本操作和程序文件的建立
【实验目的】
1.掌握项目管理器基本操作;
2.熟练掌握程序文件的建立、修改、运行;
3.熟练掌握键盘输入命令;
4.熟练掌握顺序结构基本操作。
【知识要点】
一、项目管理器简介在Visual FoxPro系统中,使用项目组织、集成数据库应用系统中所有相关的文件,形成一个完整的应用系统。所谓项目是Visual FoxPro中相关数据、文档和各类文件、对象的集合,也即项目是与一个应用有关的所有文件的集合。项目管理器是Visual FoxPro系统创建、管理项目的工具,用来创建、修改、组织项目中各种文件,对项目中程序进行编译和连编,形成一个可以运行的应用程序系统。
1.创建项目创建项目就是创建一个项目文件(扩展名为.PJX)
(1)“文件/新建”-(类型)选“项目” -,新建文件”钮 - 输入项目文件名并确定存放位置。
(2)CREATE PROJECT <项目文件名>
2.打开项目打开项目就是打开项目管理器
(1)创建项目后,系统自动进入项目管理器
(2)”文件/打开” -(类型)选,项目” - 选定文件 -,确定”钮
3.项目管理器的选项卡
 
项目管理器有6个选项卡
(1)数据:数据库(视图),自由表、查询
(2)文档:表单、报表、标签
(3)类库:
(4)代码:程序、API库、应用程序
(5)其它:文本文件、菜单、其它文件
(6)全部:以上五类
4.使用项目管理器
(1)创建文件
① 选定类型-,新建”钮-进入相应的设计器
② 选定类型-,项目/新建文件” -进入相应的设计器
(2)添加文件
① 选定类型-,添加”钮-选择要添加的文件-“确定”
② 选定类型-,项目/添加文件” -选择要添加的文件-“确定”
注意:新建和添加的文件并不是成为“项目”的一部分,而是此文件与项目间建立了一种“关联”。
(3)修改文件
① 选定文件-,修改”钮-进入相应的设计器,进行修改
② 选定文件-,项目/修改文件” -进入相应的设计器
(4)移去文件
① 选定文件-,移去”钮-选择“移去”(或“删除”)
② 选定文件-,项目/移去文件” -选择“移去”(或“删除”)
移去:将文件从“项目管理器”中移出
删除:将文件从磁盘中删除,要谨慎操作
(5)其它按钮
①,浏览” 显示选定“表”的内容
②,运行” 运行选定的“程序”或“表单”
③,预览” 显示选定的“报表”或“标签”
二、程序文件的建立、修改和运行
1.建立程序:
(1)MODIFY COMMAND 程序名
(2)“文件/新建”-(类型)选“程序”-“新建文件”-输入程序内容
2.修改程序:
(1)MODIFY COMMAND 程序名
(2)“文件/打开”- (类型)选“程序”- 选定程序
3.运行程序:
(1)DO 程序名
(2)“程序/运行”- 选定程序
(3)(程序编辑状态中)单击“运行”钮三、交互式输入命令:
1.ACCEPT命令:
格式:ACCEPT[提示信息]TO 内存变量功能:先显示提示信息,然后等待键盘上录入的字符型数据并存入内存变量说明:输入的字符型数据可不用加引号。只能输入字符型数据。
2.INPUT命令:
格式:INPUT[提示信息]TO 内存变量功能:先显示提示信息,然后等待从键盘上录入的数据(C、N、L、D型)并存入指定的内存变量。常用于输入数值型数据。输入的字符型数据要加引号。
3.WAIT命令:
格式:WAIT[提示信息][TO 内存变量]
功能:暂停程序的运行,在屏幕上显示提示信息,然后等待从键盘上录入的任一字符并存入指定的内存变量。常用于暂停。
四、顺序结构
1.功能:顺次、逐条地执行程序中的命令。
2.要点:
(1)弄清要解决的问题
(2)设计出解决问题的方法、步骤
(3)针对每个步骤选择适当的命令
(4)严格按照次序把命令记录下来
3.程序中常用的开头部分:
CLEAR 清屏
SET DATE YMD 设置日期格式为年月日
SET TALK OFF 关闭人机对话
SET DEFAULT TO [盘符:\路径] 设置默认路径
SET SAFETY OFF 关闭文件或数据重写时出现的对话框
4.程序中常用的结尾部分:
SET TALK ON 打开人机对话
CANCEL 清除变量,返回到交互方式状态
RETURN 返回调用程序处
QUIT 退出VFP
USE 关闭已打开的表
【实验内容】
一、项目管理器基本操作
1.新建一个项目DEMO.PJX:
(1)在里面新建一个自由表DEMO.DBF(学号,C,6;姓名,C,6);
(2)新建一个数据库学生基本信息.DBC;
(3)将学生表和成绩表添加到学生基本信息.DBC里;
(4)新建一个程序文件:在屏幕上输出“你好,欢迎学习VF程序设计!”。
二、程序文件的建立、修改和运行
1.编写一个程序:从键盘输入一个正数,求以此数为半径的圆面积。
2.编一个程序:任意输入两个数,计算它们的和、差、积、商并输出到屏幕上。
3.在学生表.DBF中,输入学号,查找该学号的记录,并为该记录做上删除标记。
【高手进阶】
在“学生表”和“成绩表”中,输入学生姓名,则可查出该生的成绩。
编一个根据学生的计算机分数自动确定其等级的程序。
【自我测试】( 5分钟 )
1.为程序中每条语句加以注释,说明该语句的的作用。
SET TALK OFF
SET DEFAULT TO D:\VFP程序设计\表
CLEAR
SELECT 1
USE 成绩表
INDEX ON 学号 TAG XH
SELECT 2
USE 学生表
SET RELATION TO 学号 INTO 1
GO 4
DISPLAY 学号,姓名,成绩.英语,成绩.计算机
第6章 Visual FoxPro程序设计练习一 项目管理器基本操作和程序文件的建立
【实验目的】
掌握项目管理器基本操作;
熟练掌握程序文件的建立、修改、运行;
熟练掌握键盘输入命令;
熟练掌握顺序结构基本操作。
【知识要点】
一、项目管理器简介在Visual FoxPro系统中,使用项目组织、集成数据库应用系统中所有相关的文件,形成一个完整的应用系统。所谓项目是Visual FoxPro中相关数据、文档和各类文件、对象的集合,也即项目是与一个应用有关的所有文件的集合。项目管理器是Visual FoxPro系统创建、管理项目的工具,用来创建、修改、组织项目中各种文件,对项目中程序进行编译和连编,形成一个可以运行的应用程序系统。
1.创建项目创建项目就是创建一个项目文件(扩展名为.PJX)
(1)“文件/新建”-(类型)选“项目” -,新建文件”钮 - 输入项目文件名并确定存放位置。
(2)CREATE PROJECT <项目文件名>
2.打开项目打开项目就是打开项目管理器
(1)创建项目后,系统自动进入项目管理器
(2)”文件/打开” -(类型)选,项目” - 选定文件 -,确定”钮
3.项目管理器的选项卡
 
项目管理器有6个选项卡
(1)数据:数据库(视图),自由表、查询
(2)文档:表单、报表、标签
(3)类库:
(4)代码:程序、API库、应用程序
(5)其它:文本文件、菜单、其它文件
(6)全部:以上五类
4.使用项目管理器
(1)创建文件
① 选定类型-,新建”钮-进入相应的设计器
② 选定类型-,项目/新建文件” -进入相应的设计器
(2)添加文件
① 选定类型-,添加”钮-选择要添加的文件-“确定”
② 选定类型-,项目/添加文件” -选择要添加的文件-“确定”
注意:新建和添加的文件并不是成为“项目”的一部分,而是此文件与项目间建立了一种“关联”。
(3)修改文件
① 选定文件-,修改”钮-进入相应的设计器,进行修改
② 选定文件-,项目/修改文件” -进入相应的设计器
(4)移去文件
① 选定文件-,移去”钮-选择“移去”(或“删除”)
② 选定文件-,项目/移去文件” -选择“移去”(或“删除”)
移去:将文件从“项目管理器”中移出
删除:将文件从磁盘中删除,要谨慎操作
(5)其它按钮
①,浏览” 显示选定“表”的内容
②,运行” 运行选定的“程序”或“表单”
③,预览” 显示选定的“报表”或“标签”
二、程序文件的建立、修改和运行
1.建立程序:
(1)MODIFY COMMAND 程序名
(2)“文件/新建”-(类型)选“程序”-“新建文件”-输入程序内容
2.修改程序:
(1)MODIFY COMMAND 程序名
(2)“文件/打开”- (类型)选“程序”- 选定程序
3.运行程序:
(1)DO 程序名
(2)“程序/运行”- 选定程序
(3)(程序编辑状态中)单击“运行”钮三、交互式输入命令:
1.ACCEPT命令:
格式:ACCEPT[提示信息]TO 内存变量功能:先显示提示信息,然后等待键盘上录入的字符型数据并存入内存变量说明:输入的字符型数据可不用加引号。只能输入字符型数据。
2.INPUT命令:
格式:INPUT[提示信息]TO 内存变量功能:先显示提示信息,然后等待从键盘上录入的数据(C、N、L、D型)并存入指定的内存变量。常用于输入数值型数据。输入的字符型数据要加引号。
3.WAIT命令:
格式:WAIT[提示信息][TO 内存变量]
功能:暂停程序的运行,在屏幕上显示提示信息,然后等待从键盘上录入的任一字符并存入指定的内存变量。常用于暂停。
四、顺序结构
1.功能:顺次、逐条地执行程序中的命令。
2.要点:
(1)弄清要解决的问题
(2)设计出解决问题的方法、步骤
(3)针对每个步骤选择适当的命令
(4)严格按照次序把命令记录下来
3.程序中常用的开头部分:
CLEAR 清屏
SET DATE YMD 设置日期格式为年月日
SET TALK OFF 关闭人机对话
SET DEFAULT TO [盘符:\路径] 设置默认路径
SET SAFETY OFF 关闭文件或数据重写时出现的对话框
4.程序中常用的结尾部分:
SET TALK ON 打开人机对话
CANCEL 清除变量,返回到交互方式状态
RETURN 返回调用程序处
QUIT 退出VFP
USE 关闭已打开的表
【实验内容】
一、项目管理器基本操作
1.新建一个项目DEMO.PJX:
(1)在里面新建一个自由表DEMO.DBF(学号,C,6;姓名,C,6);
(2)新建一个数据库学生基本信息.DBC;
(3)将学生表和成绩表添加到学生基本信息.DBC里;
(4)新建一个程序文件:在屏幕上输出“你好,欢迎学习VF程序设计!”。
二、程序文件的建立、修改和运行
1.编写一个程序:从键盘输入一个正数,求以此数为半径的圆面积。
2.编一个程序:任意输入两个数,计算它们的和、差、积、商并输出到屏幕上。
3.在学生表.DBF中,输入学号,查找该学号的记录,并为该记录做上删除标记。
【高手进阶】
在“学生表”和“成绩表”中,输入学生姓名,则可查出该生的成绩。
编一个根据学生的计算机分数自动确定其等级的程序。
【自我测试】( 5分钟 )
1.为程序中每条语句加以注释,说明该语句的的作用。
SET TALK OFF
SET DEFA TO D:\VFP程序设计\表
CLEAR
SELECT 1
USE 成绩表
INDEX ON 学号 TAG XH
SELECT 2
USE 学生表
SET RELATION TO 学号 INTO 1
GO 4
DISPLAY 学号,姓名,成绩.英语,成绩.计算机
【实验过程】
一、项目管理器基本操作
1.新建一个项目DEMO.PJX:
(1)在里面新建一个自由表DEMO.DBF(学号,C,6;姓名,C,6);
(2)新建一个数据库:学生基本信息.DBC;
(3)将学生表和成绩表添加到学生基本信息.DBC里;
(4)新建一个程序文件:在屏幕上输出“你好,欢迎学习VF程序设计!”。
[解答]
新建项目:
① 命令方式:CREATE PROJECT DEMO.PJX
② 菜单方式:“新建”-“文件类型”选择“项目”-“新建文件”
(1)在里面新建一个自由表DEMO.DBF(学号,C,6;姓名,C,6);
在“数据”里选择“自由表”-单击“新建”
(2)新建一个数据库:学生基本信息.DBC;
,数据”-“数据库”-单击“新建”
(3)将学生表和成绩表添加到学生基本信息.DBC里;
展开“数据库”-单击“表”-选择“添加”
(4)新建一个程序文件:在屏幕上输出“你好,欢迎学习VF程序设计!”。
在“代码”里选择“程序”-选择“新建”
代码:SET TALK OFF
CLEAR
“你好,欢迎学习VF程序设计!”
SET TALK ON
RETURN
二、程序文件的建立、修改和运行
1.编写一个程序:从键盘输入一个正数,求以此数为半径的圆面积。
[解答]
CLEAR
SET TALK OFF
INPUT,请输入一个正数:” TO R
S=R*R*3.14
,以”+R+”为半径的圆的面积为:”,S
SET TALK ON
RETURN
2.编一个程序:任意输入两个数,计算它们的和、差、积、商并输出到屏幕上。
[解答]
CLEAR
SET TALK OFF
INPUT,请输入第一个数:” TO A && 用户从键盘输入一个数到变量A
INPUT,请输入第二个数:” TO B && 用户从键盘输入一个数到变量B
S1=A+B
S3=A-B
S3=A*B
S4=A/B
,此两个数的和为:”+STR(S1,7,2) && 函数STR()是将数值型转为字符型
,此两个数的差为:”+STR(S2,7,2) && 限定只有4位数,及2位小数
,此两个数的积为:”+STR(S3)
,此两个数的商为:”+STR(S4,7,2)
SET TALK ON
RETURN
3.在学生表.DBF中,输入学号,查找该学号的记录,并为该记录做上删除标记。
[解答]
CLEAR
SET TALK OFF
CLOSE ALL
USE 学生
ACCEPT,请输入学生学号:” TO XH
LOCATE FOR 学号=XH
DISPLAY
DELETE
USE
SET TALK ON
RETURN
【高手进阶解答】
在“学生”和“成绩”表中,输入学生姓名,则可查出该生的成绩。
[解答] 因要用两个表,故要建关联
CLEAR
SET TALK OFF
SELECT 1
USE 成绩
INDEX ON 学号 TAG XH && 为成绩表(对学号)建立索引(名叫XH)
SELECT 2
USE 学生
*INDEX ON 学号 TAG XH && 父表可不建索引
*SET ORDER TO XH
SET RELATION TO 学号 INTO 1 && 按“学号”对1区的成绩表建立关联
ACCEPT,请输入学生的姓名:” TO AA
BROWSE FIELDS 学号,姓名,成绩.高数,成绩.大语,;
成绩.邓论,成绩.英语,成绩.计算机,成绩.总分 FOR 姓名=AA
&&子表记录前要加前缀:“别名->”或“别名.”
  RETURN
编一个根据学生的计算机分数自动确定其等级的程序。
[解答]
CLEAR
SET TALK OFF
SET DEFA TO C:\VFP程序设计\表
USE 成绩
REPLACE ALL 等级 WITH,不及格” FOR 计算机<60 && 替换操作
REPLACE ALL 等级 WITH,及格” FOR计算机>=60 AND计算机<75
REPLACE ALL 等级 WITH,良” FOR计算机>=75 AND计算机<90
REPLACE ALL 等级 WITH,优” FOR S计算机>=90 AND计算机<=100
LIST
RETURN
【自我测试解答】
1.为程序中每条语句加以注释,说明该语句的的作用。
[解答]
SET TALK OFF && 关闭人机对话
SET DEFA TO D:\VFP程序设计\表 && 设置默认路径
CLEAR && 清屏
SELECT 1 && 指定工作区1为当前工作区
USE 成绩 && 在工作区1中打开表成绩
INDEX ON 学号 TAG XH && 为表成绩(对学号)建立索引
SELECT 2 && 指定工作区2为当前工作区
USE 学生 && 打开父表“学生”
SET RELATION TO 学号 INTO A && 按“学号”对1区的表建立关联
GO 4 && 在“学生”表中移指针到第4条记录
DISP 学号,姓名,成绩.英语,成绩.计算机 && 显示当前记录(两个表中的值)
练习二 程序基本结构:分支结构(一)
【实验目的】
掌握单分支语句的使用;
重点掌握双分支语句的使用。
【知识要点】
分支结构,根据一定的条件,来判断程序的执行方向
1.单分支语句:
(1)格式:IF 条件
命令序列 &&满足条件,则执行命令序列
ENDIF &&不满足条件,则执行ENDIF后面的语句
(2)功能:满足条件,执行“命令序列”。
(3)说明:IF与ENDIF必须配对出现。
2.双分支语句
(1)格式:IF 条件
命令序列1 &&满足条件,则执行命令序列1
[ELSE
命令序列2] &&不满足条件,则执行命令序列2
ENDIF
(2)功能:满足条件,执行“命令序列1”;不满足条件,则执行“命令序列2”
(3)说明:
① 若省略ELSE项,则成为单分支(不满足条件就退出分支语句);
② IF与ENDIF必须配对出现。
3.几种常用条件
(1)FOUND():测试用LOCATE、CONTINUE、FIND、SEEK等命令查找是否成功(常用于“IF┉ENDIF”中)。
(2)NOT EOF():测试是否未到文件尾。即要对所有记录进行操作,一般应加“SKIP”以移动指针。
【实验内容】
编写程序:输入一个数,如果是正数,计算以该正数为半径的圆面积,否则退出程序。
在“学生表”里,编写一个输入姓名,就可显示该记录(若查不到,则显示“查无此人”
的程序。
3.编写一密码校验程序(假设密码为ABC)。[密码正确,显示“欢迎使用本系统!”;不正确,显示“密码错误!”,并退出]
4.编程求Z的值(X、Y的值由键盘输入)
X + Y (当 x > y 时 )
z = X * Y (当 x = y 时 )
X-Y (当 x < y 时 )
5.编写程序:从键盘输入一个数,如果能被3整除,则输出,否则输出“该数不能被3整除!”
【高手进阶】
编写程序,求ax2+bx+c=0的根。
编写程序,其功能是根据键盘输入a、b、c的值,判断它们能否构成三角形的三条边,
若能构成一个三角形,则计算三角形的面积。
【自我测试】( 5分钟 )
1,判断某年是否是闰年,如果是闰年则能被4整除但不能被100整除,或能被400整除。
【实验过程】
1.输入一个数,如果是正数,计算以该正数为半径的圆面积,否则退出程序。
[解答]
CLEAR
SET TALK OFF
INPUT,请输入一个数:” TO R
IF R>0
S=R*R*3.14
ENDIF
SET TALK ON
RETURN
2.学生表”里,编写一个输入姓名,就可显示该记录(若查不到,则显示“查无此人”)的程序。
[解答]
CLEAR
SET TALK OFF
USE 学生
ACCEPT "请输入姓名:" TO NA
LOCATE FOR 姓名=NA
IF FOUND() && 条件:找到此记录
DISPLAY
ELSE && 不满足条件,执行ELSE后面的语句
"查无此人!"
ENDIF
RETURN
编写一密码校验程序(假设密码为ABC)。[密码正确,显示“欢迎使用本系统!”;不正确,显示“密码错误!”,并退出]
[解答]
SET TALK OFF
CLEAR
ACCEPT "请输入您的密码:" TO AAA
IF AAA="ABC"
"欢迎使用本系统!"
ELSE
WAIT "密码错误!"
QUIT
ENDIF
SET TALK ON
RETURNL
编程求Z的值(X、Y的值由键盘输入)
X + Y (当 x > y 时 )
z = X * Y (当 x = y 时 )
X-Y (当 x < y 时 )
[解答]
SET TALK OFF
CLEAR
INPUT "请输入X的值:" TO X
INPUT "请输入Y的值:" TO Y
IF X>Y
Z=X+Y
ELSE
IF X<Y
Z=X*Y
ELSE
Z=X-Y
ENDIF
ENDIF
Z
RETURN
编写程序:从键盘输入一个数,如果能被3和7整除,则输出,否则输出“该数不能被3
和7整除!”
[解答]
SET TALK OFF
CLEAR
INPUT "请输入A的值:" TO A
IF MOD(A,3)=0 AND MOD(A,7)=0
&& 能被N整除的数M的表示方法一共有三种:
&&MOD(M,N)=0;INT(M/N)=M/N;M%N=0
A
ELSE
"该数不能被3和7整除!"
ENDIF
RETURN
【高手进阶解答】
编写程序,求ax2+bx+c=0的根。
[解答]
本题是求方程的根的问题。a、b、c的值是由键盘输入的,可用INPUT命令来实现;另一个问题是求方程的根的问题,涉及到算法的设计。当a=0时,方程是一次根,x=-c/b;当a<>0时,方程是二次方程,及b^2-4*a*c>=0时,方程有实根x=(-b±aqrt(b^2-4*a*c))/(2*a);当b^2-4*a*c<0时,方程有实根x=(-b±aqrt(4*a*c- b^2))/(2*a)。这些判断可用IF…ELSE…ENDIF语句来实现。
SET TALK OFF
CLEAR
INPUT "请输入方程的系数a:" TO a
INPUT "请输入方程的系数b:" TO b
INPUT "请输入方程的系数c:" TO c
IF a=0 AND b<>0
x=-c/b
ELSE
disc=b^2-4*a*c
IF disc>0
x1=(-b+sqrt(disc))/(2*a)
x2=(-b-sqrt(disc))/(2*a)
"方程的根x1、x2分别是",x1,x2
ELSE
xx=-b/(2*a)
xy=sqrt(abs(disc))/(2*a)
"方程的根x1是:",str(xx,4)+ "+i+"+str(xy,2)
"方程的根x1是:",str(xx,4)+ "-i+"+str(xy,2)
ENDIF
ENDIF
RETURN
编写程序,其功能是根据键盘输入a、b、c的值,判断它们能否构成三角形的三条边,若能构成一个三角形,则计算三角形的面积。
[解答]
题目要求三角形的面积由a、b、c的值来决定,并且a、b、c的值又是通过键盘输入的,即要用到INPUT命令;要构成三角形,必须满足两边之和大于第三边的条件,可通过IF…ELSE…ENDIF语句来实现;另一个知识点就是三角形面积的计算s=sqrt(p*(p-a)*(p-b)*(p-c)),p=(a+b+c)/2。
SET TALK OFF
CLEAR
INPUT "请输入三角形的边长a:" TO a
INPUT "请输入三角形的边长b:" TO b
INPUT "请输入三角形的边长c:" TO c
IF a+b>c AND a+c>b AND b+c>a
p=1.0/2*(a+b+c)
area=sqrt(p*(p-a)*(p-b)*(p-c))
"三角形的面积是:"+str(area)
ELSE
"不能构成三角形!"
ENDIF
RETURN
【自我测试解答】
1,判断某年是否是闰年,如果是闰年则能被4整除但不能被100整除,或能被400整除。
[解答]
SET TALK OFF
CLEAR
INPUT "请输入年份:" TO Y
IF Y/4=INT(Y/4),AND,Y/100<>INT(Y/100),OR,Y/400=INT(Y/400)
*IF Y%4=0,AND,Y%100<>0,OR,Y%400=0
*IF MOD(Y,4)=0,AND,MOD(Y,100)<>0,OR,MOD(Y,400)=0
Y,"是闰年!"
ELSE
Y,"不是闰年!"
ENDIF
SET TALK ON
RETURN
练习三 程序基本结构:分支结构(二)
【实验目的】
1.掌握多分支选择语句的使用
【知识要点】
多路分支语句:
(1)格式:DO CASE <变量>
  CASE 条件1
命令系列1 &&满足条件1时,则执行命令系列1
CASE 条件2
命令系列2 &&满足条件2时,则执行命令系列2
  ……
[OTHERWISE
命令系列N+1] &&条件都不满足时,则执行语句系列N+1;
ENDCASE &&分支结束
(2)功能:满足什么条件,就执行其后的“命令系列”;所有条件都不满足,则执行“命令系列n+1”;
(3)说明:
① 若省略OTHERWISE项,则退出分支语句;
② 使用多分支语句,比用多个IF语句更有效。
【实验内容】
1.编程求Z的值(X、Y的值由键盘输入)
X + Y (当 x>y 时 )
z = X * Y (当 x=y 时 )
X-Y (当 x<y 时 )
2.建一个多分支语句的程序,当输入一个学生成绩时,当分数在90以上,则评为“优等”;75-89为“良好”;60-74为“及格”;60分以下为“不及格”。
3.假设收入(P)与税率(R)的关系如下表,编程求税金(=P*R)。
0 P<800
R= 0.05 800 ≤ P<2000
0.08 2000≤P<5000
0.1 P≥5000
【高手进阶】
1.编程计算:
X(X+5) X≥6
(X+5)2 5≤X<6
Y = 1-X 2≤X<5
X*X 0≤X<2
2X X<0
【自我测试】( 5分钟 )
1.执行下程序后Y的值为多少。
SET TALK OFF
CLEAR
STORE 0 TO X,Y
DO WHILE,T.
X = X+1
DO CASE
CASE INT(X/2)=X/2
LOOP
CASE X>=10
EXIT
OTHERWISE
Y=Y+X
ENDCASE
ENDDO
Y
SET TALK ON
RETURN
【实验过程】
1.编程求Z的值(X、Y的值由键盘输入)
X + Y (当 x>y 时 )
z = X * Y (当 x=y 时 )
X-Y (当 x<y 时 )
[解答]
SET TALK OFF
CLEAR
INPUT,请输入X的值:” TO X
INPUT,请输入Y的值:” TO Y
DO CASE
CASE X > Y
Z = X + Y
CASE X = Y
Z = X*Y
CASE X < Y
Z = X-Y
ENDCASE
Z
RETURN
2.建一个多分支语句的程序,当输入一个学生成绩时,当分数在90以上,则评为“优等”;75-89为“良好”;60-74为“及格”;60分以下为“不及格”。
[解答]
CLEAR
SET TALK OFF
INPUT,请输入学生的成绩:” TO GR
DO CASE
CASE GR>=90
,优秀”
CASE GR>=75 AND GR<90
,良好”
CASE GR>=60 AND GR<74
,及格”
CASE GR<60
,不及格”
ENDCASE
RETURN
3.假设收入(P)与税率(R)的关系如下表,编程求税金(=P*R)。
0 P<800
R= 0.05 800 ≤ P<2000
0.08 2000≤P<5000
0.1 P≥5000
[解答]
SET TALK OFF
CLEAR
INPUT,请输入收入:” TO P
DO CASE
CASE P<800
R=0
CASE P<2000
R=0.05
CASE P<5000
R=0.08
OTHERWISE
R=0.1
ENDCASE
TAX=P*R
,税金为:”,TAX
SET TALK ON
RETURN
【高手进阶解答】
1.编程计算:
X(X+5) X≥6
(X+5)2 5≤X<6
Y = 1-X 2≤X<5
X*X 0≤X<2
2X X<0
[解答]
SET TALK OFF
INPUT,请输入自变量X的值:” TO X
DO CASE
CASE X>=6
Y = X*(X+5)
CASE X>=5 AND X<6
Y = (X+5)^2
CASE X>=2 AND X<5
Y = 1-X
CASE X>=0 AND X<2
Y = X*X
CASE X<0
Y = 2*X
ENDCASE
X,Y
SET TALK ON
【自我测试解答】
1.执行下程序后Y的值为多少。
SET TALK OFF
CLEAR
STORE 0 TO X,Y
DO WHILE,T.
X = X+1
DO CASE
CASE INT(X/2)=X/2
LOOP
CASE X>=10
EXIT
OTHERWISE
Y=Y+X
ENDCASE
ENDDO
Y
SET TALK ON
RETURN
[解答]
X = 10,Y = 1+3+5+7+9 = 25
练习四 程序基本结构:循环结构(一)
【实验目的】
1.掌握条件循环语句:DO WHILE的基本使用。
【知识要点】
DO WHILE…ENDDO循环:
(1)格式:DO WHILE 条件表达式
语句序列
[LOOP]
[EXIT]
ENDDO
LOOP语句:强行返回到循环开始语句。
EXIT语句:强行跳出循环,接着执行ENDDO后的语句
(2)功能:进入循环后,先判断<条件>是否成立,成立,则执行一遍循环体,当遇到ENDDO时回到循环头,再次判断<条件>,如仍成立,则又执行循环体,如此反复进行,直到<条件>不成立为止。
(3)说明:重复执行DO与ENDDO间的循环语句,直到不满足条件为止。知道循环条件应使用 DO WHILE 结构。
【实验内容】
用DO WHILE循环,求S=1+2+3…+N。
用DO WHILE循环,求S=1*2*3…*N。
用DO WHILE循环,求出1-100之间不能被3或7整除的数之和,从1开始,知道和大于678为止。
用DO WHILE循环,逐条显示在学生表中,性别为“男”的所有记录。
【高手进阶】
1.求任意两个数的最大公约数。
【自我测试】( 5分钟 )
1.执行下程序后Y的值为多少?
SET TALK OFF
CLEAR
STORE 0 TO X,Y
DO WHILE,T,
X = X+1
DO CASE
CASE INT(X/2)=X/2
LOOP
CASE X>=10
EXIT
OTHERWISE
Y=Y+X
ENDCASE
ENDDO
Y
SET TALK ON
RETURN
【实验过程】
1,用DO WHILE循环,求S=1+2+3…+N。
[解答]
SET TALK OFF
CLEAR
INPUT,请输入一个数:” to N
S=0
I=1
DO WHILE I<=N
S=S+I
I=I+1
ENDDO
S
RETIRN
2.用DO WHILE循环,求S=1*2*3…*N。
[解答]
SET TALK OFF
CLEAR
INPUT,请输入一个数:” to N
S=1
I=1
DO WHILE I<=N
S=S*I
I=I+1
ENDDO
S
RETIRN
用DO WHILE循环,求出1-100之间不能被3或7整除的数之和,从1开始,知道和大于678为止。
[解答]
SET TALK OFF
CLEAR
S=0
I=1
DO WHILE I<=100
IF NOD(I,3)=0 OR MOD(I,7)=0
I=I+1
LOOP
ENDIF
S=S+I
IF S>678
EXIT
ENDIF
I=I+1
ENDDO
”I=”,I,”S=”,S
RETURN
4.用DO WHILE循环,逐条显示在学生表中,性别为“男”的所有记录。
[解答]
SET TALK OFF
CLOSE ALL
CLEAR
USE 学生
DO WHILE,NOT,EOF()
IF 性别=”男”
DISPLAY
ENDIF
SKIP
ENDDO
SET TALK ON
RETURN
【高手进阶解答】
求任意两个数的最大公约数。
[解答]
SET TALK OFF
CLEAR
STORE 0 TO MAX,MIN
INPUT,请输入第一个数” TO MAX
INPUT,请输入第二个数” TO MIN
*如果MAX小于MIN,通过交换,使MAX成为两数中较大的数
IF MAX<MIN
TEMP=MIN
MIN=MAX
MAX=TEMP
ENDIF
*通过求余数运算得到最大公约数
DO WHILE MIN <>0
TEMPMIN=MIN
MIN=MAX%MIN &&用MIN存储每次求得的余数
MAX=TEMPMIN
ENDDDO
,最大公约数是:”,MAX
SET TALK ON
RETURN
【自我测试解答】
1.执行下程序后Y的值为多少?
SET TALK OFF
CLEAR
STORE 0 TO X,Y
DO WHILE,T,&& 条件是永远为真,要用“EXIT”强制退出
X = X+1
DO CASE
CASE INT(X/2)=X/2 && 或:X%2=0 或:MOD(X,2)=0 表示X是2 的倍数
LOOP
CASE X>=10
EXIT
OTHERWISE
Y=Y+X
ENDCASE
ENDDO
Y
SET TALK ON
RETURN
[解答] Y=1+3+5+7+9=25
练习五 程序基本结构:循环结构(二)
【实验目的】
1.掌握条件循环语句:DO WHILE的熟练使用
【知识要点】
(1)格式:DO WHILE 条件表达式
语句序列
[LOOP]
[EXIT]
ENDDO
LOOP语句:强行返回到循环开始语句。
EXIT语句:强行跳出循环,接着执行ENDDO后的语句
(2) 功能:进入循环后,先判断<条件>是否成立,成立,则执行一遍循环体,当遇到ENDDO时回到循环头,再次判断<条件>,如仍成立,则又执行循环体,如此反复进行,直到<条件>不成立为止。
(3)说明:重复执行DO与ENDDO间的循环语句,直到不满足条件为止。知道循环条件应使用 DO WHILE 结构。
【实验内容】
求数列“0,1,1,2,3,5,。。。。。。”的前30个数。
在学生表中,用“DO WIHLE循环语句”编写一个输入姓名,就可显示该记录,
并可继续进行查询的程序。
对成绩表,编一个可显示前十名学生的学号和总分的程序。
在成绩表中,按平均分来统计人数:统计90分(含90分)以上、80-90分(含80分)、70-80分(含70分)、60-70分(含60分)和60分以下的学生人数。
【高手进阶】
用FOR循环,输入一个数N,求1!+2!+3!+…….+N!
打印乘法九九表。
【自我测试】( 5分钟 )
1.下面程序执行的结果是什么?
SET TALK OFF
CLEAR
STORE,天长地久” TO CH
I = 1
DO WHILE I<8
SUBSTR(CH,I,2)
I = I+2
ENDDO
SUBSTR(CH,5,4)
SUBSTR(CH,1,4)
RETURN
SET TALK ON
【实验过程】
1.求数列“0,1,1,2,3,5,。。。。。。”的前30个数。
[解答]
CLEAR
SET TALK OFF
S1=0
S2=1
I=3
S1
S2
DO WHILE I <= 30
S3 = S1 + S2
S3
S1=S2
S2=S3
I=I+1
ENDDO
RETURN
在学生表中,用“DO WIHLE循环语句”编写一个输入姓名,就可显示该记录,
并可继续进行查询的程序。
[解答]
SET TALK OFF
CLEAR
USE 学生
AA="Y"
DO WHILE UPPER(AA)="Y"
ACCEPT "请输入姓名:" TO NA
LOCATE FOR 姓名=NA
IF FOUND()
DISPLAY
ELSE
"查无此人!"
ENDIF
ACCEPT "还要继续查找吗(Y/N)?" TO AA
ENDDO
SET TALK ON
USE
RETURN
3.对成绩表,编一个可显示前十名学生的学号和总分的程序。
[解答]
SET TALK OFF
CLEAR
USE 成绩
REPLACE ALL 总分 WITH 高数+大语+邓论+英语+计算机
INDEX ON 总分 TAG SC DESCENDING && 按总分降序排列
* INDEX ON -总分 TAG SC && 或这样来进行降序
N=1
DO WHILE N<=10 && 循环条件:从1到10
N = N+1
DISPLAY 姓名,总分 && 显示两个字段
SKIP && 移动指针
ENDDO
SET TALK ON
USE
RETURN
4.在成绩表中,按平均分来统计人数:统计90分(含90分)以上、80-90分(含80分)、70-80分(含70分)、60-70分(含60分)和60分以下的学生人数。
[解答]
SET TALK OFF
CLOSE ALL
CLEAR
STORE 0 TO S1,S2,S3,S4,S5
USE 成绩
DO WHILE,NOT,EOF()
DO CASE
CASE 平均>=90
S1=S1+1
CASE 平均<90 AND 平均>=80
S2=S2+1
CASE平均<80 AND平均>=70
S3=S3+1
CASE平均<70 AND平均>=60
S4=S4+1
OTHER WISE
S5=S5+1
ENDCASE
ENDDO
"90分(含90分)以上的学生人数为:",S1
"80-90分(含80分)的学生人数为:",S2
"70-80分(含70分)的学生人数为:",S3
"60-70分(含60分)的学生人数为:",S4
"60分以下的学生人数为:",S5
USE
SET TALK ON
RETURN
【高手进阶解答】
1.用DO WHILE循环,输入一个数N,求1!+2!+3!+…….+N!
[解答]
SET TALK OFF
CLEAR
INPUT,请输入一个数:” to N
I=1
DO WHILE,T.
K=1
J=1
DO WHILE J<I+ 1 && 条件是J<=N(见下IF语句)
K=K*J && 计算阶乘:每循环一次,K乘一个增大的数
J=J+1
ENDDO
k
I=I+1 && 当 循环一次,I的值增加1
IF I>N && 当 I>N 时,退出循环
EXIT
ENDIF
ENDDO
RETURN
2.打印乘法九九表。
[解答]
CLEAR
I=1
DO WHILE I<=9
J=1
DO WHILE J<=I
STR(I,1)+”*”+STR(J,1)+”=”+STR(I*J,2)+SPACE(2)
J=J+1
ENDDO
I=I+1
ENDDO
RETURN
【自我测试解答】
1.下面程序执行的结果是什么?
SET TALK OFF
CLEAR
STORE,天长地久” TO CH
I = 1
DO WHILE I<8
SUBSTR(CH,I,2) && I为1、3、5、7时,分别截取天、长、地、久
I = I+2
ENDDO
SUBSTR(CH,5,4) && 截取地久两字,并显示
SUBSTR(CH,1,4) && 截取天长两字,并显示
RETURN
SET TALK ON
[解答]
先竖向显示“天长地久”四个字,再横向显示“地久天长”这四个字。
练习六 程序基本结构:循环结构(三)
【实验目的】
1.掌握步长循环:FOR循环的使用
【知识要点】
步长循环FOR:
(1)格式:FOR 循环变量 = 初值 TO 终值 [STEP 步长]
命令语句序列
[LOOP]
[EXIT]
ENDFOR
(2)功能:重复执行FOR与ENDFOR间的循环语句,重复次数取决于内存变量的初值、终值和步长。
(3)说明:
① 若步长为1,则可省去STEP子句;
② 常用于已知循环次数的情况。
【实验内容】
1.输出-5000到5000中能被7整除的偶数。
2.用FOR循环计算1-100之间的偶数和。
3.用FOR循环计算1-100之间的奇数的累乘。
4.输入一个数,求1到此数的和,并可不断输入数,反复运算。
【高手进阶】
1.用FOR循环,输入一个数N,求1!+2!+3!+…….+N!
2.求解世界数学史上有名的“百鸡问题”:鸡公一,值钱五;鸡母一,值钱三;鸡雏三,值钱一,百钱买百鸡,问鸡公、母、雏各几何?
【自我测试】( 5分钟 )
执行下程序后I和S的值为多少。
SET TALK OFF
S=0
FOR I=1 TO 4
S=S+I*I
ENDFOR
I,S
SET TALK ON
【实验过程】
1.输出-5000到5000中能被7整除的偶数。
[解答]
CLEAR
SET TALK OFF
P = -5000
FOR Q = P TO 5000 STEP 2
IF Q%7 = 0
Q
ENDIF
ENDFOR
RETURN
2.用FOR循环计算1-100之间的偶数和。
[解答]
CLEAR
SET TALK OFF
S=0
FOR I=0 TO 100 STEP2
S=S+I
ENDFOR
S
SET TALK ON
RETURN
3.用FOR循环计算1-100之间的奇数的累乘。
[解答]
CLEAR
SET TALK OFF
S=0
FOR I=1 TO 100 STEP2
S=S*I
ENDFOR
S
SET TALK ON
RETURN
4.输入一个数,求1到此数的和,并可不断输入数,反复运算。
[解答]
SET TALK OFF
CLEAR
AA=”Y”
DO WHILE UPPER(AA)=”Y” && 条件:变量AA值为“Y”。
&& UPPER()小写转换大写
INPUT,求1到某数之和,请输入此数:” TO N
P = 0
K = 0
FOR P=0 TO N
P = P+1
K = K+P
ENDFOR
,1到”,N,”之和等于:”,K
ACCEPT "还要继续做吗(Y/N)?" TO AA && 输入的值给变量AA
ENDDO
SET TALK ON
RETURN
【高手进阶解答】
用FOR循环,输入一个数N,求1!+2!+3!+…….+N!
[解答]
SET TALK OFF
CLEAR
INPUT,请输入一个数:” to N
S=0
FOR I=1 TO N
T=1
FOR J=1 TO I
T=T*J
ENDFOR
S=S+T
ENDFOR
S
RERURN
2.求解世界数学史上有名的“百鸡问题”:鸡公一,值钱五;鸡母一,值钱三;鸡雏三,值钱一,百钱买百鸡,问鸡公、母、雏各几何?
[解答] 此题是:公鸡每只五个钱,母鸡每只三个钱,小鸡每三只一个钱,现用100个钱买100只鸡,问各买多少只?
设买公鸡x只、母鸡y只、小鸡z只
则有 x+y+z=100
5x+3y+z/3=100
解之得 5x+3y+(100-x-y)/3=100
因x、y、z只能为正整数,且x<=20、y<=33(因不能全是公鸡或母鸡),则将x从0到20及y从0到33的值代入方程中就可解出方程。
SET TALK OFF
CLEAR
FOR X=0 TO 20
FOR Y=0 TO 33
IF 5*X+3*Y+(100-X-Y)/3=100
,公鸡 母鸡 小鸡”
X,Y,100-X-Y
ENDIF
ENDFOR
ENDFOR
RETURN
【自我测试解答】
执行下程序后I和S的值为多少。
SET TALK OFF
S=0
FOR I=1 TO 4
S=S+I*I
ENDFOR
I,S
SET TALK ON
[解答]
I = 5,S = 12+22+32+42 = 30
练习七 程序基本结构:循环结构(四)
【实验目的】
掌握表扫描循环:SCAN的使用
【知识要点】
表扫描循环SCAN:
(1)格式:SCAN[范围][FOR 条件式]
命令语句序列
[LOOP]
[EXIT]
ENDSCAN
(2)功能:在指定范围内寻找满足条件的记录,并执行循环体中的语句。
(3)说明:常用于对表中全体记录作相同的操作。
【实验内容】
1.用SCAN循环,逐条显示学生表中,所有男生的记录。
2.对学生表,编一个可统计21岁以上有多少人的程序。
3.用“SCAN循环语句”和“DO CASE分支语句” 对成绩表,编“按学生平均分数确定其等级”的程序。
4.编一个统计Xscj表中,平均分的各分数段人数的程序(用SCAN循环)。
5,在成绩表中,找出指定等级的学生记录并统计该等级的学生人数。
【高手进阶】
在学生表和成绩表中查找平均分在80分以上的学生,并逐个显示学号、姓名及平均分。
【自我测试】( 5分钟 )
1.在学生表中查找所有计算机系学生的记录并统计人数。
【实验过程】
用SCAN循环,逐条显示学生表中,所有男生的记录。
[解答]
SET TALK OFF
CLEAR
USE学生
SCAN FOR 性别=”男”
DISPLAY
ENDSCAN
SET TALK ON
RETURN
对学生表,编一个可统计21岁以上有多少人的程序。
[解答]
SET TALK OFF
CLEAR
USE 学生
S=0
SCAN FOR 年龄>21
S = S+1 && 循环一次,变量S增加1
ENDSCAN
,年龄大于21岁的人有:”+STR(S)+”人”
RETURN
用“SCAN循环语句”和“DO CASE分支语句” 对成绩表,编“按学生平均分数确定其等级”
的程序。
[解答]
SET TALK OFF
CLEAR
USE 成绩
REPLACE ALL 平均 WITH (高数+大语+邓论+英语+计算机)/5
SCAN
DO CASE
CASE 平均<60
REPLACE 等级 WITH,不及格”
CASE 平均>=90
REPLACE 等级 WITH,优”
CASE 平均>=75
REPLACE 等级 WITH,良”
CASE 平均>=60
REPLACE 等级 WITH,及格”
ENDCASE
ENDSCAN
RETURN
4.编一个统计Xscj表中,平均分的各分数段人数的程序(用SCAN循环)。
[解答]
SET TALK OFF
CLEAR
USE Xscj
S=0
S60=0
S75=0
S90=0
SCAN
DO CASE
CASE 平均<60
S=S+1
CASE平均>=60 AND平均<75
S60=S60+1
CASE平均>=75 AND平均<90
S75=S75+1
CASE平均>=90 AND平均<=100
S90=S90+1
ENDCASE
ENDSCAN
,60分以下的有”+STR(S)+”人”
,60分到75分有”+STR(S60)+”人”
,75分到90分有”+STR(S75)+”人”
,90分以上的有”+STR(S90)+”人”
RETURN
在成绩表中,找出指定等级的学生记录并统计该等级的学生人数。
[解答]
SET TALK OFF
CLOSE ALL
CLEAR
USE 成绩
S=0
ACCEPT "请输入要查询的学生等级:" TO DJ
SCAN
IF 等级=DJ
DISPLAY
S=S+1
ENDIF
ENDSCAN
S
USE
SET TALK ON
RETURN
【高手进阶解答】
1.在学生表和成绩表中查找平均分在80分以上的学生,并逐个显示学号、姓名及平均分。
[解答]
SET TALK OFF
CLEAR
SELECT 1
USE 成绩
INDEX ON 学号 TAG NO
SET ORDER TO NO
SELECT 2
USE 学生
SET RELATION TO 学号 INTO 成绩
SCAN
IF成绩.平均>=80
?”学号是”+学号+" 的"+姓名+” 同学各科平均为”+ ;
STR(成绩.平均,5,2)+”分”
ENDIF
ENDSCAN
RETURN
【自我测试解答】
在学生表中查找所有计算机系学生的记录并统计人数。
[解答]
SET TALK OFF
CLOSE ALL
CLEAR
USE 学生
S=0
SCAN FOR 系别="计算机系"
DISPLAY
S=S+1
ENDSCAN
"计算机系人数为:",S
USE
SET TALK ON
RETURN
第7章 表单设计与应用练习一 创建和管理表单和标签控件
【实验目的】
用表单向导创建表单用表单设计器创建表单利用数据环境添加数据表运行表单
【知识要点】
 一、创建表单
1、创建表单的三种方法
(1)使用表单向导创建简易的数据表单
(2)使用表单设计器创建或修改任何形式的表单
(3)使用表单生成器产生快速表单
2、调出表单设计器方法一、在项目管理器环境下调用
(1)在“项目管理器”窗口中选择“文档”选项卡,然后选择其中的“表单”图标;
(2)单击“新建”按钮,系统弹出“新建表单”对话框;
(3)单击“新建表单”图标按钮。
方法二、菜单方式调用
(1)单击“文件”菜单中的“新建”命令,打开“新建”对话框;
(2)选择“表单”文件类型,然后单击“新建文件”按钮。
方法三、令方式调用在命令窗口输入:CREATE FORM <表单文件名>。
不管采用上面哪种方法,系统都将打开“表单设计器”窗口,。在表单设计器环境下,用户可以交互式、可视化地设计完全个性化的表单二、修改表单
对于一个已创建的表单,可以使用表单设计器进行编辑修改。
1、打开表单设计器
(1)如果要修改项目中的表单,在项目编辑状态下打开要修改的表单文件,进入表单设计器环境进行修改即可。
(2)如果要修改的表单不属于某个项目,可以单击“文件”菜单中的“打开”命令,然后在“打开”对话框中选择需要修改的表单文件,进入表单设计器环境进行修改即可。
(3)在命令窗口输入命令:MODIFY FORM <表单文件名>,进入表单设计器环境进行修改即可。
2、表单生成器在表单设计器环境下,也可以调用表单生成器,以方便、快速地产生表单。调用表单生成器有3种方法:
(1)可以通过选择“表单”菜单中的“快速表单”命令;
(2)单击“表单设计器”工具栏中的“表单生成器”按钮;
(3)右击表单窗口,然后在弹出的快捷菜单中选择“生成器”命令。
3、数据环境为数据库应用系统创建的表单都拥有自己的数据环境,数据环境和表单保存在一起。将数据表添加到表单的数据环境中,再运行该表单时,Visual FoxPro将自动打开数据环境中的表或视图,并在关闭该表单时自动关闭它们。
可以利用“数据环境设计器”设置和修改表单的数据环境。打开“数据环境设计器”的方法有3种。
(1)在表单设计器环境下,单击表单设计器工具栏上的“数据环境”按钮,即可打开“数据环境设计器”窗口。
(2)选择“显示”菜单中的“数据环境”命令,也可打开“数据环境设计器”窗口。
(3)在表单中右击,从快捷菜单中选择“数据环境”命令,进入“数据环境设计器”窗口。
三、保存和运行表单
1、保存表单
(1),文件/保存”:保存当前表单
(2)Ctrl+W:保存当前表单
(3)“关闭”钮、“文件/退出”:在系统问是否保存时,选“是”
2、运行表单文件。
(1)在“项目管理器”窗口中,选择要运行的表单,然后单击,运行”按钮。
(2)在表单设计器环境下,选择“表单”菜单中的“执行表单”命令,或单击标准工具栏上的“运行”按钮。
(3)选择“程序”菜单中的“运行”命令,打开“运行”对话框,然后在对话框中指定要运行的表单文件并单击“运行”按钮。
(4)在命令窗口输入命令:
DO FORM <表单文件名>
【实验内容】
1.根据学生表,利用表向导创建一个表单(学生情况.scx)。结果可以对该学生表的内容进行显示和查找。结果如下图。
2.根据学生表和成绩表,利用表向导创建一个一对多的表单(学生情况1.scx)。结果可以同时对两个表的记录进行显示。结果如下图。
3.根据成绩表,创建一个快捷表单(学生成绩.scx)。结果如下图。
4.根据学生表,利用表设计器和数据环境设计器,创建一个新的表单(学生情况2.scx),要求在数据环境中将整个表格移入表单中,显示出学生的所有属性。结果如下图。
5.根据学生表,利用表设计器和数据环境设计器,创建一个新的表单(学生情况3.scx),要求在表单中只显示出学生表中的学号,姓名,性别,入学成绩这四个属性。
6,为表单“学生情况2.scx”添加一个标签控件“学生情况一览表”。 修改标签控件的属性(大小、字号、颜色等)。
【高手进阶】
1.新建一个表单(sj.scx),表单的Caption属性设置为“标签的应用”。再为该表单添加一个标签控件,标签控件的Caption属性为“退出”。要求运行表单时,用鼠标单击该标签,则该表单被释放。
【自我测试】( 5分钟 )
1.根据“书库.dbf”表,利用向导新建一个表单,要求可显示书库中的书号,书名和作者。并且格式为“浮雕式”和“图片按钮”,按书号降序排序,并能浏览,查找书库中的内容。如下图。
【实验过程】
1.根据学生表,利用表向导创建一个表单(学生情况.scx)。结果可以对该学生表的内容进行显示和查找。结果如下图。
解答:
(1)使用“文件”菜单的“新建”命令,打开“新建”对话框,在对话框中选择想要建立的文件类型“表单”,然后单击“向导”按钮,打开“向导选取”对话框。
(2)选择使用的向导。在“向导选取”对话框中有两种选择,其中“表单向导”用于由单个表创建表单。本题选择“表单向导”,然后单击“确定”按钮进入表单向导。
(3)字段选择。在,步骤1-字段选取”中,可以选择在表单上显示哪些字段。该题选择,学生表”的全部字段,然后单击“下一步”按钮。
(4)选择表单样式。在,步骤2-选择表单样式”中,可以选择表单样式和表单中按钮的类型。该题选择“标准式”样式和“文本按钮”按钮类型,然后单击“下一步”按钮。
(5)确定排序次序。在,步骤3-排序次序”中,用于选择在表单中是否按顺序显示记录。方法是从“可用的字段或索引标识”中选择字段——学号,单击“添加”按钮,将它添加到“选定字段框”中,然后单击“下一步”按钮。
(6)完成。在表单向导的“步骤4-完成”中,在“请输入表单标题”框中输入“输入和修改学籍记录”,然后单击“预览”按钮,预览表单的运行结果。如果对结果不满意,可以单击“上一步”按钮,退回上面的步骤进行修改。如果结果满意,就可以选择一种保存方式,该题选择“保存并运行表单”单选按钮,然后单击“完成”按钮,在随后出现的“另存为”对话框中保存该表单,命名为“学生情况.scx”,接着开始运行表单,表单运行结果上图所示。
2.根据学生表和成绩表,利用表向导创建一个一对多的表单(学生情况1.scx)。结果可以同时对两个表的记录进行显示。结果如下图。
解答:
(1)使用“文件”菜单的“新建”命令,打开“新建”对话框,在对话框中选择想要建立的文件类型“表单”,然后单击“向导”按钮,打开“向导选取”对话框。
(2)选择使用的向导。在“向导选取”对话框中有两种选择,其中“表单向导”用于由单个表创建表单。本题选择“一对多表单向导”,然后单击“确定”按钮进入表单向导。
(3)字段选择。在,步骤1-从父表中选定字段”中,可以选择在表单上显示哪些字段。该题选择,学生表”的全部字段,然后单击“下一步”按钮。
(4)字段选择。在,步骤2-从子表中选定字段”中,可以选择在表单上显示哪些字段。该题选择,成绩表”的全部字段,然后单击“下一步”按钮。
(5)在“步骤3-建立表之间的关系”中,选取“学生表”中的“学号”字段和“成绩表”中的“学号”字段建立关联。
(6)选择表单样式。在,步骤4-选择表单样式”中,可以选择表单样式和表单中按钮的类型。该题选择“标准式”样式和“文本按钮”按钮类型,然后单击“下一步”按钮。
(7)确定排序次序。在,步骤5-排序次序”中,用于选择在表单中是否按顺序显示记录。方法是从“可用的字段或索引标识”中选择字段——学号,单击“添加”按钮,将它添加到“选定字段框”中,然后单击“下一步”按钮。
(8)完成。在表单向导的“步骤6-完成”中,在“请输入表单标题”框中输入“输入和修改学籍记录”,然后单击“预览”按钮,预览表单的运行结果。如果对结果不满意,可以单击“上一步”按钮,退回上面的步骤进行修改。如果结果满意,就可以选择一种保存方式,该题选择“保存并运行表单”单选按钮,然后单击“完成”按钮,在随后出现的“另存为”对话框中保存该表单,命名为“学生情况1.scx”,接着开始运行表单,表单运行结果上图所示。
3.根据成绩表,创建一个快捷表单(学生成绩.scx)。结果如下图。
解答:
(1)使用“文件”菜单的“新建”命令,打开“新建”对话框,在对话框中选择想要建立的文件类型“表单”,然后单击“新建文件”按钮,打开表单设计器。
(2)使用“表单”菜单的“快速表单”命令,打开“表单生成器”对话框。在“字段选取”选项卡中选择“成绩表”的所有字段为选定字段。在“样式”选项卡中选择“标准式”。点击“确定”按钮。
(3)选择“表单”菜单的“执行表单”。弹出“保存”对话框。为表单命名为“学生成绩.scx”。保存并运行表单。如上图。
4.根据学生表,利用表设计器和数据环境设计器,创建一个新的表单(学生情况2.scx),要求在数据环境中将整个表格移入表单中,显示出学生的所有属性。结果如下图。
解答:
(1)使用“文件”菜单的“新建”命令,打开“新建”对话框,在对话框中选择想要建立的文件类型“表单”,然后单击“新建文件”按钮,打开表单设计器。
(2)右击表单,选择“数据环境”。弹出“数据环境设计”窗口。右击选择“添加”,将“学生表添加至数据环境中。
(3)用鼠标左键按住“学生表”蓝色的标题处,将该表整个拖入表单设计器中,则表单中添加了一个表格控件。如上图。
(4)选择“表单”菜单的“执行表单”。弹出“保存”对话框。为表单命名为“学生情况2.scx”。保存并运行表单。
5.根据学生表,利用表设计器和数据环境设计器,创建一个新的表单(学生情况3.scx),要求在表单中只显示出学生表中的学号,姓名,性别,入学成绩这四个属性。
解答:
(1)使用“文件”菜单的“新建”命令,打开“新建”对话框,在对话框中选择想要建立的文件类型“表单”,然后单击“新建文件”按钮,打开表单设计器。
(2)右击表单,选择“数据环境”。弹出“数据环境设计”窗口。右击选择“添加”,将“学生表添加至数据环境中。
(3)用鼠标左键选取学生表中的“学号”字段,拖入表单设计器中,依次将“学号”“姓名”“性别”“入学成绩”四个字段拖入表单中,如上图。
(4)选择“表单”菜单的“执行表单”。弹出“保存”对话框。为表单命名为“学生情况3.scx”。保存并运行表单。
6,为表单“学生情况2.scx”添加一个标签控件“学生情况一览表”。 修改标签控件的属性(大小、字号、颜色等)。
解答:
(1)使用“文件”菜单的“打开”命令,打开表单“学生情况2.scx”
(2)在控件工具栏中选择标签控件。按住鼠标左键在表单上拖动,就添加了一个标签件。
(3)单击“标签”控件,选定“属性”窗口的“Caption” (标题),在“属性设置栏”中输入“学生情况一览表”;设定“FontName”属性为“隶书”,设定,FontSize” 属性为26,设定“ForeColor”为红色。
(4)选择“表单”菜单的“执行表单”。弹出“保存”对话框。为表单命名为“学生情况4.scx”。保存并运行表单。
【高手进阶解答】
1.新建一个表单(sj.scx),表单的Caption属性设置为“标签的应用”。再为该表单添加一个标签控件,标签控件的Caption属性为“退出”。要求运行表单时,用鼠标单击该标签,则该表单被释放。
解答:
(1)使用“文件”菜单的“新建”命令,打开“新建”对话框,在对话框中选择想要建立的文件类型“表单”,然后单击“新建文件”按钮,打开表单设计器。
(2)在控件工具栏中,选中标签控件,在表单的合适位置绘制出一个标签控件。
(3)设置标签的Caption属性为“退出”。Fontsize属性为24。
(4)代码的编写。双击标签控件,弹出代码编写窗口。在标签控件的Click事件中编写如下代码:
Thisform.release
(5)选择“表单”菜单的“执行表单”。弹出“保存”对话框。保存并运行表单。
【自我测试解答】
1.根据“书库.dbf”表,利用向导新建一个表单,要求可显示书库中的书号,书名和作者。并且格式为“浮雕式”和“图片按钮”,按书号降序排序,并能浏览,查找书库中的内容。如下图。
解答:
(1)使用“文件”菜单的“新建”命令,打开“新建”对话框,在对话框中选择想要建立的文件类型“表单”,然后单击“向导”按钮,打开“向导选取”对话框。
(2)选择使用的向导。在“向导选取”对话框中有两种选择,其中“表单向导”用于由单个表创建表单。本题选择“表单向导”,然后单击“确定”按钮进入表单向导。
(3)字段选择。在,步骤1-字段选取”中,可以选择在表单上显示哪些字段。该题选择,书库”表的“书号”“书名”“作者”字段,然后单击“下一步”按钮。
(4)选择表单样式。在,步骤2-选择表单样式”中,可以选择表单样式和表单中按钮的类型。该题选择“浮雕式”样式和“图片按钮”按钮类型,然后单击“下一步”按钮。
(5)确定排序次序。在,步骤3-排序次序”中,用于选择在表单中是否按顺序显示记录。方法是从“可用的字段或索引标识”中选择字段——书号,单击“添加”按钮,将它添加到“选定字段框”中,再选择降序单选按钮,然后单击“下一步”按钮。
(6)完成。在表单向导的“步骤4-完成”中,在“请输入表单标题”框中输入“书库”,然后单击“预览”按钮,预览表单的运行结果。如果对结果不满意,可以单击“上一步”按钮,退回上面的步骤进行修改。如果结果满意,就可以选择一种保存方式,该题选择“保存并运行表单”单选按钮,然后单击“完成”按钮,在随后出现的“另存为”对话框中保存该表单,命名为“书库.scx”,接着开始运行表单,表单运行结果上图所示。
练习二 常用控件:命令按钮、命令按钮组、文本框
【实验目的】
理解面向对象程序基本概念;
熟练掌握表单的基本操作;
熟练掌握命令扫钮、命令按钮组和文本框的使用;
【知识要点】
一、表单常用控件及其常用属性
1.命令按钮:命令按钮用来启动某个事件代码,完成特定功能。如关闭表单、移动记录指针、打印报表等。
常用属性有:
(1)Caption属性:用于设置按钮的标题。在设置命令按钮对象的“Caption”属性时,输入“\<”和一个快捷键字符可指定其快捷键。在表单上同时按Alt键和快捷字符,可以完成单击此按钮的功能。
(2)Enabled属性:指定表单或控件能否响应由用户引发的事件。默认值为.T.,即对象是有效的,能被选择,能响应用户引发的事件。
(3)Visible属性:指定对象是可见还是隐藏。在表单设计器中,默认值为.T.,即对象是可见的。在程序代码中,默认值为.F.,即对象是隐藏的。但一个对象即使是隐藏的,在代码中仍可以访问它。该属性在设计和运行时可用,适用于绝大多数控件。
(4)Piction属性:定义图形化按钮的面版图型。
2.命令按钮组:命令按钮组是包含一组命令按钮的容器控件,用户可以单个或作为一组来操作其中的按钮。
常用属性有:
(1)ButtonCount属性:指定命令组中命令按钮的数目。可以通过改变ButtonCount属性的值来重新设置命令组中包含的命令按钮数目。设置命令按钮组的最简便方法是使用命令组生成器。
(2)Buttons属性:用于存取命令组中各按钮的数组。该属性数组在创建命令组时建立,用户可以利用该数组为命令组中的命令按钮设置属性或调用其方法。属性数组下标的取值范围应该在l~ButtonCount属性值之间。
(3)Value属性:指定命令组当前的状态。该属性的类型可以是数值型的(这是默认的情况),也可以是字符型的。如果命令组内的某个按钮有自己的Click事件代码,那么一旦单击该按钮,就会优先执行为它单独设置的代码,而不会执行命令组的Click事件代码。
3.文本框:文本框也是最常用的控件,使用文本框能够进行多种类型数据的输入和输出。
文本框的主要应用是对表中非备注字段中的数据进行显示和编辑。
常用属性有:
(1)ControlSource属性:利用该属性为文本框指定一个字段或内存变量。运行时,文本框首先显示该变量的内容。而用户对文本框的编辑结果,也会最终保存到该变量中。
(2)Value属性:返回文本框的当前内容。对文本框Value属性的设置决定了运行表单时,在文本框中显示的数据的值和类型。文本框中的数据可以是数值、字符、日期或逻辑型的。
(3)PasswordChar属性:利用该属性可在文本框中接收用户密码,可以把它设置为“*”或其他的一般字符。这样在运行表单时,文本框的Value和Text属性可以接收用户真正输入的信息,而在屏幕上显示的却是PasswordChar所指定的字符。这在设计登录口令框时经常用到。
(4)Readonly属性:该属性为.T.时,文本框显示为灰色,表明不可编辑其中的数据。
(5)InPutMask属性:指定在一个文本框中如何输入和显示数据。
(6)Valid事件:若要检查用户输入文本框的值,可以编写Valid事件代码,利用代码来检查数据。
二、控件常用过程(事件)
1.Init(初始化) 当对象运行时,被激活(触发事件)
2.Click(单击) 单击对象(一般是“命令钮”),被激活
3.DblClick(双击) 双击对象(一般是“命令钮”),被激活
4.Load(加载) 当运行表单时(先引发Load,再引发Init ),被激活
5.Destroy(释放) 当对象被释放时,被激活
6,UnLoad(卸载) 当退出表单时,被激活
7.Change(改变) 对象(一般是“文本框”)内容改变,被激活
8.GotFocus/LostFocus(获得/失去焦点) 光标移到/移出对象时,被激活
9.Valid(有效的) 当控件失去焦点时,可触发事件
【实验内容】
1.创建一个表示今天日期的表单: 单击“今天日期”钮,就会显示今天的年月日练习如何将程序在命令钮的“Click”中输入
2.用Xsda表创建一个表单,要求能通过输入姓名(或学号)进行查找并显示该生的情况练习使用“数据环境设计器”和命令钮输入代码。见表单“学生信息查询”
3.用“表单设计器”,为Xsda表创建一个“学生管理”表单,并加入标签和命令钮。
添加,
一个标签:学生档案管理系统(设置属性:标题、字体、字号、颜色等)
七个命令钮:第一个、上一个、下一个、最后一个、退出、添加、删除(设置标题、添加代码)
4.为Xsda表创建一个“学生档案管理”表单,并用文本框来编辑字段内容。
在表单中添加如下控件:
四个标签:学生档案管理、学号、姓名、出生年月三个文本框:对应学号、姓名、出生年月三个字段用命令按钮组添加五个命令钮:第一个、上一个、下一个、最后一个、退出
5.用“表单设计器”设计一个计算圆面积的表单;(输入半径,按“计算”钮,就算出并显示面积)
[练习如何使用“文本框”输入、输出数据]

【高手进阶】
1.做一个能进行加法运算的表单
[练习使用命令钮,及文本框输入、输出数据的操作]
2.用“表单设计器”设计一个输入口令的表单(口令“5845201314”正确,显示"欢迎光临!",否则显示“无权使用!”)
[目的:练习如何使用“文本框”输入和用“标签”输出数据及运行新表单]
【自我测试】( 5分钟 )
1.用“表单设计器”为书库表创建一个表单“书库管理”,并添加“第一个”、“上一个”、“下一个”、“最后一个”、“退出”等命令按钮组。并且能够通过书名查出该书的信息。
【实验过程】
1.创建一个表示今天日期的表单: 单击“今天日期”钮,就会显示今天的年月日解答:练习如何将程序在命令钮的“Click”中输入
(1)进入“表单设计器”,建两个命令按钮:“今天日期”和“退出”
  (2)双击“今天日期”钮,在“Click(单击)”事件中输入
YMD=DTOS(DATE()) && 函数DTOS把日期转为(YYYYMMDD)字符
YY=SUBSTR(YMD,1,4)   && 函数SUBSTR截取字符(从第1位取4个)
MM=SUBSTR(YMD,4,2)
DD=SUBSTR(YMD,6,2)
WAIT WINDOWS,今天是:” + YY +,年” + MM +,月” + DD +,日”
&& 暂停运行,(用窗口形式)显示内
ThisForm.Release && 更新表单
(3)双击“退出”钮,在“Click(单击)”事件中输入
  ThisForm.Release
2.用Xsda表创建一个表单,要求能通过输入姓名(或学号)进行查找并显示该生的情况解答:练习使用“数据环境设计器”和命令钮输入代码。见表单“学生信息查询”
(1)进入“表单设计器”:
(2)将表Xsda添加到“数据环境设计器”中,将表中字段逐个拖入到“表单设计器”中,并调整大小和位置;
(3)单击“控件工具栏”上的“标签”钮后,在表单上方拖出标签框,在“属性”框的“Caption”栏中输入“学生情况一览表”(并在“FontName”、“FontSize”、“ForeColor”栏中确定字体、字号、颜色等);
(4)建两个标签和一个文本框:“请输入要查找学生的姓名”、“姓名”及准备录入姓名的文本框
(5)建两个命令按钮:“查找”和“退出”;
① 右击“查找”命令按钮,选“代码”项,在“Click(单击)”事件中输入:
LOCATE FOR 姓名=ALLTRIM(ThisForm.Text1.Value)
&& 移指针到输入的姓名的第一条记录
IF EOF() && 条件是已到文件尾,即是没找到记录
MESSAGEBOX("查无此人!",48,"提示信息")
&& 出现一个对话框,48的含义见P188
ENDIF
ThisForm.Refresh
② 右击“退出”命令按钮,选“代码”项,在“Click(单击)”事件中输入:
ThisForm.Release
(6)保存名为“学生信息查询”。
3.用“表单设计器”,为Xsda表创建一个“学生管理”表单,并加入标签和命令钮。
添加,
一个标签:学生档案管理系统(设置属性:标题、字体、字号、颜色等)
七个命令钮:第一个、上一个、下一个、最后一个、退出、添加、删除(设置标题、添加代码)
解答:见表单“学生管理”
(1) 创建数据环境:“显示/数据环境”-在“添加表或视图“对话框中选定表Xsda,将其添加到“数据环境设计器”中
(2) 向表单中添加对象:
显示表内容:将“数据环境设计器”中表的所需字段(如学号、姓名、性别、民族、出生年月、籍贯、自费否、入学总分等)拖入表单中适当位置添加标签:单击“表单控件”工具栏的“标签”钮,在表单上方拖出标签框(Label1)
添加命令按钮:单击“表单控件”工具栏的“命令”钮,在表单中适当位置,拖出一个命令按钮;其余六个按钮,照此法添加。注意它们的位置、顺序,不要弄乱了。不然写代码时,容易弄错按钮。
(3) 为对象设置属性:通过“属性”窗口,可为对象设置属性。如:
单击“标签”框,选定“属性”窗口的“Caption(标题)”,在“属性设置栏”中输入“学生管理”;、选定“FontName(字体名)”,选择一种字体,如楷体、选定“ForeColor(字体颜色)”,选择一种颜色,如红色;
 同样,七个命令按钮,布置好后位置后,设定标题名称为“第一个”、“上一个”、“下一个”、“最后一个”、“退出”、“添加”、“删除”。同样可设定字体、字号、颜色。。。。。
(4) 编辑事件或方法代码:双击命令按钮,在“过程”栏中选择“Click(单击)”事件,并输入代码:
在(第一个)命令按钮的“Click(单击)”事件中输入
  GO TOP (移指针到第一条记录)
ThisForm.Refresh   (更新表单)
在(上一个)命令按钮的“Click(单击)”事件中输入
  Skip -1 (移指针到上一条记录)
IF BOF()   (若指针已到文件头)
    GO TOP  (移指针到首记录)
ENDIF
ThisForm.Refresh  (更新表单)
在(下一个)命令按钮的“Click(单击)”事件中输入
  Skip 1 (移指针到下一条记录)
  IF EOF() (若指针已到文件尾)
   GO BOTTOM    (移指针到末记录)
ENDIF
ThisForm.Refresh (更新表单)
在(最后一个)命令按钮的“Click(单击)”事件中输入
  GO BOTTOM     (移指针到最后一条记录)
ThisForm.Refresh (更新表单)
在(退出)命令按钮的“Click(单击)”事件中输入
  ThisForm.Release (从内存中释放该表单)
在(添加)命令按钮的“Click(单击)”事件中输入
  APPEND BLANK (添加一条空白记录)  
ThisForm.Refresh (更新表单)
在(删除)命令按钮的“Click(单击)”事件中输入
DELETE
*PACK (不要急于真的删除了)
ThisForm.Refresh (更新表单)
(5) 保存退出:按“保存”钮,取名为“学生档案”后,“确定”退出。
4.为Xsda表创建一个“学生档案管理”表单,并用文本框来编辑字段内容。
在表单中添加如下控件:
四个标签:学生档案管理、学号、姓名、出生年月三个文本框:对应学号、姓名、出生年月三个字段用命令按钮组添加五个命令钮:第一个、上一个、下一个、最后一个、退出解答:见表单“学生档案管理”
(1)为四个标签设置属性:标题、字体、字号、颜色等,与上一题操作一样。
(2)为文本框设置学号、姓名、出生年月等的数据来源:
右击“文本框”-选“生成器”,在“值”标签中,从字段名列表框中选择表中字段;
或从属性窗口的“ControlSource”属性中设置数据来源(表中的字段)
注:1。文本框生成器上有三个标签:[P270]
① 格式:作用是设置当前文本框中的数据类型。只能是字符、数值、日期、逻辑型四种。
② 样式:用来设置文本框的款式。如平面或三维、边框有无线条等。
③ 值:是最重要的选项。其任务是设置数据控制源,即设置文本框的数据来源或数据的存储位置。一般是从从字段名列表框中选择表中字段,或从属性窗口的“ControlSource”属性中设置数据来源(表中的字段)。
2.一般情况下对于表中的字段,最好是使用“数据环境”来拖出
(3)用,命令按钮组”添加命令按钮:
单击“表单控件”工具栏的“命令按钮组”钮,在表单中拖出命令按钮组,右击命令按钮组框,选“生成器”,在“按钮”标签中设置按钮数目,比如为“5”;在“布局”标签中设置按钮排列方式,比如为“水平”。
设置按钮的“Caption(标题)”、“FontName(字体名)”、“ForeColor(字体颜色)”等属性。注意:要先右击按钮框,选“编辑”,然后再右击各按钮,进行设置。
为各按钮编辑事件或方法代码。方法和内容同上一练习题。
5.用“表单设计器”设计一个计算圆面积的表单;(输入半径,按“计算”钮,就算出并显示面积)
解答:见表单“圆面积”[练习如何使用“文本框”输入、输出数据]
(1)向表单中添加对象:利用“表单控件”工具栏添加三个标签(Label):单击工具栏的“标签”钮,在表单中拖出三个标签框添加二个文本框(Text):单击工具栏的“文本框”钮,在表单中拖出二个文本框添加二个命令按钮(Command):单击工具栏的“命令”钮,在表单中拖出二个命令按钮

(2) 为对象设置属性:通过“属性”窗口,可为对象设置属性。如:
 分别设置“标签”框1(Label1)、2(Label2)、3(Label3)的标题为“计算圆面积”、“请输入圆的半径”和“圆的面积为”,并自行设定字体、字号、颜色;
分别设置“命令”按钮1(Command1)、按钮2(Command2)的标题为“计算”和“退出”。也可设置字体、字号、颜色。

(3) 编辑事件或方法代码:
① 双击命令按钮1(Command1),在“过程”栏中选择“Click(单击)”事件,并输入代码:
R = VAL(ThisForm.Text1.Value) && 文本框1(Text1)中输入的值赋给变量R
注:1.在程序中访问Value,则可利用文本框中的值;
2.ThisForm.Text1.Value表示当前表单文本框1的值;
3.VAL是字符转变为数值的函数。若设置“InputMask”属性为数值,则可不用VAL函数。
ThisForm.Text2.Value = 3.14*R*R && 把计算结果赋给Text2
ThisForm.Text1.SetFocus
&& 将焦点移到文本框1,即计算后,光标回到文本框1,等待第二次操作。
ThisForm.Refresh && 更新表单
② 双击命令按钮2(Command2),在“过程”栏中选择“Click(单击)”事件,并输入代码:
ThisForm.Release && 释放表单
(4) 保存退出:按“保存”钮,取名为“圆面积”后,“确定”退出。
【高手进阶解答】
1.做一个能进行加法运算的表单解答:见表单“加法器计算器”[练习使用命令钮,及文本框输入、输出数据的操作]
(1)进入“表单设计器”,添加四个标签(Label)、两个文本框(Text)、两个命令按钮(Command),并设定标题、字体、字号、颜色等。
(2)对前两个文本框(Text1、Text2)的InputMask属性设为“9999999.99”。(即限定只能输入7位数字,也可不设置,则可输入任意多的数)
(3)双击命令按钮1(Command1),在“过程”栏中选择“Click(单击)”事件,并输入代码:
ThisForm.Text3.Value=VAL(ThisForm.Text1.Value)+ VAL(ThisForm.Text2.Value)
函数VAL()是将字符型转为数值型,此句表示将文本框1、2的值相加后赋给文本框3
ThisForm.Refresh
双击命令按钮2(Command2),在“过程”栏中选择“Click(单击)”事件,并输入代码:
ThisForm.Release
2.用“表单设计器”设计一个输入口令的表单(口令“1314520”正确,显示"欢迎光临!",并运行表单“学生管理”,否则显示“无权使用!”)
练习如何使用“文本框”输入和用“标签”输出数据及运行新表单
(1) 向表单中添加对象:
添加二个标签(Label):单击“表单控件”工具栏的“标签”钮,在表单中拖出二个标签框添加一个文本框(Text):单击“表单控件”工具栏的“文本框”钮,在表单中拖出一个文本框,
 
(2) 为对象设置属性:通过“属性”窗口,为对象设置属性,如:设定标题、字体、字号、颜色等。
 将“标签”2(Label2)属性:“Caption(标题)”,设为“无”(使其在屏幕上不显示);
将“文本框”(Text1)属性:“PasswordChar(密码)”,设为,*”
(3) 编辑事件或方法代码:
对“文本框”(Text1)的“Valid(有效的)”事件中输入代码:
MM = ThisForm.Text1.Value    && 将文本框中输入的值给变量MM
IF MM="1314520" && 分支条件(即口令值为:1314520)
ThisForm.Label2.Caption="欢迎光临!" && 满足条件,则在标签2中显示"欢迎光临!"
DO FROM 学生管理 && 运行表单“学生管理”
ELSE
ThisForm.Label2.Caption="不欢迎你!"
ENDIF
ThisForm.Refresh
【自我测试解答】
1.用“表单设计器”为书库表创建一个表单“书库管理”,并添加“第一个”、“上一个”、“下一个”、“最后一个”、“退出”等命令按钮组。并且能够通过书名查出该书的信息。
解答:
(1)新建一个表单,打开表单设计器
(2)在表单设计器中,右键单击表单,选择“数据环境”。再右击数据环境,选“添加”,将书库表添加至数据环境中。
(3)将数据环境中表的字段拖入表单设计器中,按如图排列。
(4)添加一个按钮组控件。右击按钮组控件,选生成器。将按钮个数设为5个。设置5个按钮的Caption属性分别为“第一个”“下一个”“上一个”“最后一个”和“退出”。
(5)再添加一个标签控件,设置其Caption属性为“请输入要查找的书名”
(6)最后添加一个命令按钮,设置其Caption属性为“查找”
(7)编写代码。
在“第一个”按钮的Click事件中输入:
Go top
Thisform.refresh
在“第二个”按钮的Click事件中输入:
If not eof()
skip 1
Endif
Thisform.refresh
在“下一个”按钮的Click事件中输入:
If not bof()
skip -1
Endif
Thisform.refresh
在“最后一个”按钮的Click事件中输入:
Go bottom
Thisform.refresh
在“退出”按钮的Click事件中输入:
Thisform.release
在“查找”按钮的Click事件中输入:
Locate for 书名=alltrim(thisform.text1.value)
Thisform.refresh
(8)保存并运行表单
练习三 常用控件:编辑框、复选框、选项组、计时器、图像
【实验目的】
掌握几种控件的特点及其属性熟练应用几种控件的事件并对能对其进行代码的编写
【知识要点】
 一、几种常用控件及其常用属性
1.编辑框:编辑框实际上是一个完整的字处理器,利用它能够选择、剪切、粘贴及复制正文;可以实现自动换行,能够有自己的垂直滚动条,可以用箭头键在正文里面移动光标。编辑框只能输入、编辑字符型数据,包括字符型内存变量、数组元素和字段里的内容。
常用属性有:
(1)ControlSource属性:用于指定编辑框的数据来源,在编辑框中的输入或修改的结果将存放在指定的数据源。
(2)Readonly属性:设置用户能否修改编辑框的文本。值为.T.时,不能编辑编辑框中的内容;值为.F.时,允许编辑编辑框的内容,系统默认值为.F,。
(3)ScrollBars属性:指定编辑框是否具有滚动条。当属性值为0时,编辑框没有滚动条;当属性值为2(默认值)时,编辑框包含垂直滚动条。
(4)Value属性:返回文本框的当前内容。对文本框Value属性的设置决定了运行表单时,在文本框中显示的数据的值和类型。文本框中的数据可以是数值、字符、日期或逻辑型的。
2.复选框:此控件用于创建一个复选框,每个复选框都有两个状态,如.T.或.F.。当处于.T.状态时,即选中此复选框,则在复选框前面的方框中显示一个“√”;否则,复选框内为空白。
常用属性有:
(1)Caption属性:用来指定显示在复选框旁边的文字。
(2)Value属性:用来指明复选框的当前状态,Value属性的设置有3种情况。
① 0或.F.,复选框呈清除(也称为未选中)状态。
② l或.T.,复选框呈选中状态。
③ 2或.Null.,复选框呈灰色状态。当复选框获得焦点时,只要用户按<Ctrl>+<0>,
就在复选框中输入.NULL.,使复选框显示灰色。
(3)ControlSource属性:指明与复选框建立联系的数据源。
3.选项框:选项组又称为选项按钮组,是包含选项按钮的一种容器。一个选项组中往往包含若干个选项按钮,但用户只能从中选择一个按钮,当用户选择某个选项按钮时,
该按钮即成为被选中状态,而选项组中的其他选项按钮,不管原来是什么状态,都变为未选中状态。被选中的选项按钮中会显示一个圆点。
常用属性有:
(1)ButtonCount属性:指定选项组中选项按钮的数目。在表单中创建一个选项组时,ButtonCount属性的默认值是2。可以通过改变ButtonCount属性的值来重新设置选项组中包含的选项按钮数目。
(2)Value属性:用于指定选项组中哪个选项按钮被选中。该属性值的类型可以是数值型的,也可以是字符型的。
(3)ControlSource属性:指明与选项组建立联系的数据源。作为选项组数据源的字段变量或内存变量,其类型可以是数值型或字符型。比如,变量值为数值型2,则选项组中第2个按钮被选中;若变量值为字符型“Option2”,则Caption属性值为“Option2”的按钮被选中。用户对选项组的操作结果会自动存储到数据源变量及Value属性中。
4.计时器:计时器控件可以进行计时,可以按某个时间间隔周期性地执行指定的操作。
常用属性有:
(1)Timer事件:即计时器事件,是在时间间隔到时触发的事件。应该编写该事件的代码,指定完成某个操作。
(2)Interval属性:用于指定一个时间间隔,即一个计时器事件和下一个计时器事件之间的毫秒数。如果计时器有效,将以近似相等的时间间隔触发计时器事件。
(3)Enabled属性:若将该属性设置为.T.,计时器就能在表单开始运行时启动计时工作。如果设置Enabled属性为.F.,就会挂起计时器的运行;这种情况下,可以使用表单上别的控件的某个事件(如命令按钮的Click事件)启动计时器的工作。
5.线条、形状和图像:形状和线条用于在表单上添加线条、方框、圆或椭圆形状。
常用属性有:
(1)BackColor属性:确定对象的边框颜色。
(2)BorderStyle属性:确定对象的边框样式。
(3)BorderWidth属性:确定对象的边框宽度。
(4)Fillstyle属性:确定形状对象的填充样式。
(5)FillColor属性:确定形状对象的填充颜色。
(6)Curvature:确定形状对象的4个角的变曲程度,属性值范围是0(直角)到99(圆)。
(7)LineSlant:该属性的有效值为斜杠(/)和反斜杠(\),用于决定当线条既不水平又不垂直时线条倾斜的方向。
(8)SpeciaEffect属性:确定形状是平面的还是三维的,当Curvature属性设置为0时才有效。
图像控件用于在表单上显示图像,在表单中添加该控件,作为标志或起装饰作用的图片(.bmp文件)。常用属性如下。
(1)Picture属性:提供在控件上要显示的图片(.bmp或.ico文件)。
(2)BorderStyle属性:决定图像是否具有可见的边框。
(3)Backstyle属性:决定图像的背景是否透明。
(4)Stretch属性:如果Stretch设置为0——剪裁,则超出图像控件范围的那一部分图像将不显示;如果Stretch设置为l——等比填充,图像控件将保留图片的原有比例,并在图像控件中显示最大可能显示的图片;如果Stretch设置为2——变比填充,则调整图片正好与图像控件的高度和宽度相匹配。
【实验内容】
1.创建一个表单。当选定字体、字号和颜色时,文本框中的字符就按选定设置显示。
2.创建一个表单,添加一个计时器和一个线条控件。要求每过0.1秒,线条就会逐渐加粗。
3.新建一个表单,在该表单上添加一个文本框控件,几个复选框控件和两个标签控件,如下图。要求,当你选中若干个复选框时,文本框中出现相应的数字。
4.新建一个表单,具有图像控件和命令按钮。要求当点击“填充图片”按钮时,为该图像控件填充一张图片,当点击“等比填充”和“变比填充”两个按钮时,分别以两种方式填充图片。结果如图。
【高手进阶】
1.能否为某一表单(如“学生档案表”)再加一个“欢迎进入”的画面。
【自我测试】( 5分钟 )
1.根据学生表做一个能对各门课程统计平均成绩的表单。如下图。
【实验过程】
1.创建一个表单。当选定字体、字号和颜色时,文本框中的字符就按选定设置显示。
[解答]练习使用“文本框”和“单选”钮
(1) 为单选钮组编写事俾代码:
在OptionGroup1的Click事件中输入:
DO CASE
CASE THIS.Value=1 && 表示当前单选钮组得到光标后,定位在第1项上
THISFORM.Text1.FontName="宋体"
CASE THIS.Value=2
THISFORM.Text1.FontName="隶书"
CASE THIS.Value=3
THISFORM.Text1.FontName="黑体"
CASE THIS.Value=4
THISFORM.Text1.FontName="楷体_GB2313"
ENDCASE
或:
Do Case
Case ThisForm.OptionGroup1.VALUE = 1 && 表示当前单选钮组第1项得到光标
ThisForm.Text1.FontName="宋体" && 设置字体为“宋体”
Case ThisForm.OptionGroup1.VALUE = 2
ThisForm.Text1.FontName="隶书"
Case ThisForm.OptionGroup1.VALUE = 3
ThisForm.Text1.FontName="黑体"
Case ThisForm.OptionGroup1.VALUE = 4
ThisForm.Text1.FontName="楷体_GB2313"
EndCase
在OptionGroup2和OptionGroup3的Click事件中输入类似代码字号(FontSize):直接输入阿拉伯数字,如9、12、18、22
颜色(ForeColor):要在RGB()括号中输入数值。红色是255,0,0;蓝色是0,0,255;绿色是0,255,0;黑色是0,0,0
2.创建一个表单,添加一个计时器和一个线条控件。要求每过0.1秒,线条就会逐渐加粗。
[解答]
(1)新建一个表单,打开表单设计器。
(2)在表单上添加一个直线控件。该控件的Borderwidth的初值为1。
(3)在表单上添加一个计时器控件。该控件的Interval属性为100。
(4)在计时器的Timer事件中输入如下代码:
If thisform.xx.borderwidth<100
thisform.xx.borderwidth=thisform.xx.borderwidth+1
Endif
(5)保存并运行表单。
3.新建一个表单,在该表单上添加一个文本框控件,几个复选框控件和两个标签控件,如下图。要求,当你选中若干个复选框时,文本框中出现相应的数字。
[解答]
(1)新建一个表单,打开表单设计器。
(2)在该表单添加六个复选框控件。其Caption属性分别为“旅游英语”“外国文化”“外交礼仪”“计算机英语”“实用文写作”“数学模型”。
(3)再添加一个文本框控件和两个标签控件“你一共选修了”“六门课”。
(4)在每个复选框控件的Click事件中输入如下代码:
Thisform.text1.value=str(val(thisform.text1.value)+1)
(5)保存并运行表单。
4.新建一个表单,具有图像控件和命令按钮。要求当点击“填充图片”按钮时,为该图像控件填充一张图片,当点击“等比填充”和“变比填充”两个按钮时,分别以两种方式填充图片。结果如图。
[解答]
(1)新建一个表单,打开表单设计器。
(2)选取图像控件和三个命令按钮控件,分别绘制在如上图的位置。
(3)将三个命令按钮的Caption属性分别设置为“填充图片”“等比填充”和“变比填充”。
(4)编写代码。
在“填充图片”的Click事件中输入如下代码:
Thisform.image1.picture=”d:\picture.jpg”
Thisform.refresh
在“等比填充”的Click事件中输入如下代码:
Thisform.image1.stretch=1
Thisform.refresh
在“变比填充”的Click事件中输入如下代码:
Thisform.image1.stretch=2
Thisform.refresh
(5)保存并运行表单
【高手进阶解答】
1.能否为某一表单(如“学生档案表”)再加一个“欢迎进入”的画面
[解答]
(1)新建一个表单,取名“欢迎进入”,在“属性”窗口的“picture”栏中输入图片的路径(D:\软三VFP上机实训三\VF配套材料\表单\)和名称(00A);“Stretch”栏设置图像的放置方式(应选:2-变比填充)。
(2)再建一个“进入”命令按钮,在“Click(单击)”事件中输入:
DO FORM D:\软三VFP上机实训三\VF配套材料\表单\学生管理
&& 运行表单“学生管理”
THISFORM.RELEASE
【自我测试解答】
1.根据学生表做一个能对各门课程统计平均成绩的表单。如下图。
[解答]
(1)新建一个表单,打开表单设计器。
(2)右击表单,选择“数据环境”,打开数据环境设计器。将成绩表添加至数据环境中。
(3)将学号,课程号,成绩字段拖入表单,如图排列。
(4)再添加一个标签控件,一个文本框控件,一个命令按钮控件和一个编辑框控件。如图排列。标签控件的Caption属性设为“请输入课程号”。命令按钮的Caption属性设为“统计”。
(5)为命令按钮的Click事件编写如下代码:
set talk off
average to x for 课程号=alltrim(thisform.text1.value)
thisform.edit1.value=thisform.text1.value+"的平均成绩为:"+str(x,6,2)
(6)保存并运行表单。
练习四 常用控件,微调、页框、列表框、组合框、表格
【实验目的】
掌握几种控件的特点及其属性熟练应用几种控件的事件并对能对其进行代码的编写
【知识要点】
 一、几种常用控件及其常用属性
1.微调控件:微调控件常用在给定数值范围及数值间距的情况下,让用户从数值范围内通过上调或下调操作,选择一个值或直接在微调框中输入值。
常用属性有:
(1)KeyboardHighValue属性:指定用户能输入到微调框中的最高值。
(2)KeyboardLowValbe属性:指定用户能输入到微调框中的最低值。
(3)SpinnerHighValue属性:指定当用户单击向上按钮时微调控件显示的最高值。
(4)SpinnerLowValue属性:指定当用户单击向下按钮时微调控件显示的最低值。
(5)Increment属性:用户每次单击向上或向下按钮时增加或减少的值(数值间距)。
(6)Value属性:返回用户输入的值。
(7)UpClick事件:用户单击向上按钮时响应的事件。
(8)DownClick事件:用户单击向下按钮时响应的事件。
2.页框:页框是可以包含多个页面(Page)的容器对象。每个页面也是容器,其中又可包含多个控件。
常用属性有:
(1)Tabs属性:确定页面选项卡是否可见。
(2)TabStyle属性:确定选项卡是否是相同大小且与页框的宽度相同。
(3)TabStretch属性:决定选项卡是单行还是多行显示。
(4)PageCount属性:决定页面中包含的页面数,有效值是0~99。
(5)Caption属性:用于指定页面的标题,即在选项卡上显示的文本。
(6)FontName和FontSize属性:设定页面标题的字体和字号。
3.列表框:列表框提供一组条目(数据项),用户可以从中选择一个或多个条目。一般情况下,列表框显示其中的若干条目,用户可以通过滚动条浏览其他条目。
常用属性有:
(1)RowSource 属性:指定列表框的条目数据源。
(2)RowSourceType属性:指明列表框中条目数据源的类型。
(3)ColumnCount属性:用于确定列表框的列数。若要形成多列列表,应该设置该属性值为列表的列数。
(4)ListCount属性:指明列表框中数据条目的数目。
(5)ControlSource属性:用户可以通过该属性指定一个字段或变量,用以保存用户从列表框中选择的结果。
4.组合框:组合框兼有列表框和文本框的功能。有两种形式的组合框,即下拉组合框和下拉列表框,通过更改组合框的Style属性来选择两者形式之一。
常用属性有:
(1)ControlSource属性:指定用户保存选择或输入值的表字段或变量。
(2)Colunmlines属性:指定在下拉列表框中是否显示分隔线,默认值为.T.,在下拉列表框中显示分隔线;如果为.F.,则不显示分隔线。
(3)RowSourceType属性:指定组合框中数据源类型。
(4)RowSource 属性:指定组合框中数据源的来源。
5.表格:表格控件用在表单上添加表格对象。表格是容器对象,包含多个列,每个表格列也是容器,包含标头和控件。。
常用属性有:
(1)ColumnCount属性:设置表格的列数。如果ColumnCount属性设置为1(默认值),则在运行表单时,表格的列数与RecordSource属性所指定的表中字段数目相同。
(2)AllowAddNew属性:是否允许在RecordSource属性所指定的表中追加新记录。
如果将AllowAddNew属性设置为真,当用户选中了表中最后一条记录,并且按下“↓”键时,就向表中添加新记录。
(3)ControlSource属性:指明在列中要显示的数据,一般是表中的一个字段。
(4)Sparse属性:若将Sparse属性设置为.T.,则运行表单时,列中被选中的单元格的数据才显示为控件,列中的其他单元格的数据仍以文本形式显示。
(5)CurrentControl属性:指定列中哪一个控件是活动的,默认值为“Text1”。
常用的列标头属性如下。
(1)Caption属性:指定标头的标题文本,显示在列顶部。
(2)Alignment属性:指定标题文本在对象中显示对齐方式。
【实验内容】
1.新建一个表单,在该表单上添加几个标签控件,三个微调控件,排列成如下图所示。要求当调节三个微调按钮时,可以改变表单的背景颜色。
2.新建一个表单,在该表单上添加一个列表框控件、一个标签控件和一个文本框控件。排列如下图,要求在列表框中选中一个学生姓名时,在文本框中会出现该学生的家庭住址。
3.用Xsda表创建一个表单,要求能输入新来学生(即插入新记录)和通过输入学号(或姓名)进行查找
4.新建一个表单,在该表单上添加一个组合框控件和两个标签控件,排列如下图。要求当对组合框中的选项进行选择时,可以通过这种选择将标签控件上的字体改变。
6、依据书库表新建一个表单,具有两个选项卡,分别为“查询”和“统计”。查询要求能够通过不同的条件进行查询。如可以根据书名,书号或者是作者进行查询。统计要求能够将订购所有教材所需的金额统计出来。
【高手进阶】
1.为Xsda表和Xscj表创建一个表单,使选择姓名,可显示该生的学号、课程号、分数等情况。
【综合测试】( 5分钟 )
1.对Rsda表,建一个通过输入“编号”、“姓名”、“性别”或“职务”的查询表单
【实验过程】
1.新建一个表单,在该表单上添加几个标签控件,三个微调控件,排列成如下图所示。要求当调节三个微调按钮时,可以改变表单的背景颜色。
解答:
(1)新建一个表单,打开表单设计器。
(2)在表单上添加三个标签控件。其Caption属性分别为“R”“G”“B”。
(3)再在上面添加三个微调控件。
(4)在三个微调控件的“Downclick”和“Upclick”事件均填写如下代码:
Thisform.backcolor=rgb(thisform.spinner2.value,thisform.spinner3.value,thisform.spinner1.value)
(5)保存并运行表单。
2.新建一个表单,在该表单上添加一个列表框控件、一个标签控件和一个文本框控件。排列如下图,要求在列表框中选中一个学生姓名时,在文本框中会出现该学生的家庭住址。
解答:
(1)新建一个表单,打开表单设计器。
(2)在表单上添加一个列表框控件。右击列表框控件,选择“生成器”。在生成器中的“列表项”中选择学生表中的姓名字段作为填充列表的字段。关闭生成器。
(3)在表单上添加一个标签控件。设其Caption属性为“该生家住在:”。
(4)在表单上添加一个文本框控件。
(5)列表框控件的Click事件中填入如下代码:
Thisform.text1.value=家庭住址
(6)保存并运行表单。
3.用Xsda表创建一个表单,要求能输入新来学生和通过输入学号(或姓名)进行查找练习使用命令钮输入代码
(1)进入“表单设计器”:
(2)将表Xsda添加到“数据环境设计器”中,将整个表全拖入(或逐个字段拖入)“表单设计器”中,并调整大小和位置;
(3)单击“控件工具栏”上的“标签”钮后,在表单上方拖出标签框,在“属性”框的“Caption”栏中输入“学生情况一览表”(并在“FontName”、“FontSize”、“ForeColor”栏中确定字体、字号、颜色等);
(4)建三个命令按钮:“录入”、“查找”和“退出”;
(5) 右击“录入”命令按钮,选“代码”项,在“Click(单击)”事件中输入:
 APPEND BLANK && 添加一条空白记录
 ThisForm.Refresh 
(6)右击“查找”命令按钮,选“代码”项,在“Click(单击)”事件中输入:
 LOCATE FOR 学号=ALLTRIM(THISFORM.TEXT1.VALUE)
* LOCATE FOR 姓名=ALLTRIM(THISFORM.TEXT2.VALUE)
* SET FILTER TO 学号=ALLTRIM(THISFORM.TEXT1.VALUE);
or 姓名=ALLTRIM(THISFORM.TEXT2.VALUE)
IF EOF()
MESSAGEBOX("查无此人!")
ENDIF
THISFORM.REFRESH
(7) 右击“退出”命令按钮,选“代码”项,在“Click(单击)”事件中输入:
THISFORM.RELEASE
(8)保存名为“学生情况一览表”。
4.新建一个表单,在该表单上添加一个组合框控件和两个标签控件,排列如下图。要求当对组合框中的选项进行选择时,可以通过这种选择将标签控件上的字体改变。
解答:
(1)新建一个表单,打开表单设计器。
(2)在表单上添加两个标签控件。它们的Caption属性分别为“这是一个实验”和“请选择字体:”。
(3)再添加一个组合框。右击该控件,选择“生成器”。在生成器的列表项选项卡中,选择“手工输入数据”,再在列表中输入“黑体”“隶书”“宋体”“幼圆”四种字体的名称。关闭生成器。
(4)在组合框的Click事件中输入下列代码:
Thisform.label1.fontname=thisform.combo1.value
(5)保存并运行表单。
5、依据书库表新建一个表单,具有两个选项卡,分别为“查询”和“统计”。查询要求能够通过不同的条件进行查询。如可以根据书名,书号或者是作者进行查询。统计要求能够将订购所有教材所需的金额统计出来。
解答:
(1)新建一个表单,打开表单设计器。
(2)在表单上添加一个页框控件,其两个选项卡的Caption的属性分别为“查询”和“统计”。
(3)选中第一个选项卡。右击选择数据环境。添书店表添加到数据环境中,将书库表中的几个字段从数据环境中拖入选项卡中。再添加两个标签“查找条件”和“查找内容”,两个文本框和两个命令按钮“查询”和“退出”。
(4)在“查询”命令按钮的Click事件中添加如下代码:
x=alltrim(thisform.pageframe1.page1.text1.value)
locate for &x=alltrim(thisform.pageframe1.page1.text2.value)
thisform.refresh
在“退出”按钮的Click事件中添加如下代码:
Thisform.release
(5)选中第二个选项卡。在其中添加一个表格控件。右击选择生成器,选择书库表的中所有字段为输出字段。关闭生成器。再添加一个标签“订购教材总费用为:”、一个文本框和一个命令按钮“统计”
(6)在“统计”命令按钮的Click事件中输入如下代码:
sum 总金额 to x
thisform.pageframe1.page2.text1.value=str(x,10,2)
(7)保存并运行表单。
【高手进阶解答】
1.为Xsda表和Xscj表创建一个表单,使选择姓名,可显示该生的学号、课程号、分数等情况练习如何使用“组合框”和“列表框”,且对两个表的关联操作
(1) 向表单中添加对象:
添加一个标签(Label)、一个组合框(Combo)、一个表格(Grid)、一个命令按钮(Command),并设定标题、字体、字号、颜色等。
(2)对组合框:右击“组合框”,选“生成器”命令。在“列表项”选项中选Xsda表的“姓名”字段;
(3)对表格:右击“表格”,选“生成器”命令。在“表格项”选项中选Xscj表的“学号”、“课程号”和“考试成绩”三字段;在“关系” 选项中的“父表中的关键字段”中选“Xsda.学号”,在“子表中的相关索引”中选“学号”
注意:子表“Xscj”要先建索引
【自我测试解答】
1.对Rsda表,建一个通过输入“编号”、“姓名”、“性别”或“职务”的查询表单练习如何使用“表格”、“单选”钮和“命令”钮
(1)将表Rsda添加到“数据环境设计器”中,将整个表全拖入(或逐个字段拖入)“表单设计器”中,并调整大小和位置;
(2)添加如下图所示的各控件(两个标签、一个文本框、一个单选按钮、两个命令按钮)
(3)单选按钮设置个数为“4”、各标题(Caption)分别如上图所示。
(4)在单选钮的“单击”(Click)事件中输入代码:
Do Case
Case ThisForm.OptionGroup1.VALUE = 1
ThisForm.Label2.Caption =,请输入要查询的编号:”
Case ThisForm.OptionGroup1.VALUE = 2
ThisForm.Label2.Caption =,请输入要查询的姓名:
Case ThisForm.OptionGroup1.VALUE = 3
ThisForm.Label2.Caption =,请输入要查询的性别:
Case ThisForm.OptionGroup1.VALUE = 4
ThisForm.Label2.Caption =,请输入要查询的职务:
EndCase
ThisForm.Text1.Value =,,&& 清空文本框1的值
ThisForm.Text1.SetFocus && 使文本框1获得焦点
ThisForm.Refresh
(5)在“查询”命令按钮的“单击”(Click)事件中输入代码:
Select Rsda
Do Case
Case ThisForm.OptionGroup1.VALUE = 1
Set Filter To 编号 = Alltrim(ThisForm.Text1.Value)
Case ThisForm.OptionGroup1.VALUE = 2
Set Filter To 姓名 = Alltrim(ThisForm.Text1.Value)
Case ThisForm.OptionGroup1.VALUE = 3
Set Filter To 性别 = Alltrim(ThisForm.Text1.Value)
Case ThisForm.OptionGroup1.VALUE = 4
Set Filter To 职务 = Alltrim(ThisForm.Text1.Value)
EndCase
ThisForm.Refresh
(6)在“退出”命令按钮的“单击”(Click)事件中输入代码:
ThisForm.Release
(7)保存名为“查询职工”。
第8章 菜单设计、消息栏和工具栏练习一 菜单设计基本操作
【实验目的】
了解设计菜单的步骤;
熟练掌握菜单设计器创建菜单;
掌握菜单运行方法;
【知识要点】
一、菜单的组成
菜单系统是由菜单栏、菜单项和下拉菜单组成。菜单栏位于标题下方,用于放置各个菜单项;菜单项是菜单栏中的一个菜单的名称。单击菜单项就可弹出下拉菜单。菜单是包含命令、过程和子菜单的选项列表,可分为父菜单和子菜单两类,子菜单挂在父菜单下作为父菜单的一个菜单项。
二、菜单设计的步骤菜单设计一般包含以下几个步骤:
菜单系统的规划、建立菜单与子菜单、把任务分派到菜单系统中、生成菜单程序、测试和运行菜单系统等。
三、用菜单设计器创建菜单及子菜单
1.启动菜单设计器:
,文件/新建”-(“类型”选)“菜单”-“新建文件”钮
2.创建菜单项:
在“菜单名称”列中输入要创建的菜单项[可用“(\<字母>)”,建立热键]
3.创建子菜单:
单击“菜单名称”右侧“编辑”-(为此菜单项)输入要创建的子菜单[也可建立热键]
4.为菜单或菜单项指定任务:
选定菜单项-在“结果”栏中选“命令”(或“过程”)-在编辑框中输入相应的命令或调用其它程序
5.生成菜单程序:
,菜单/生成”-(“生成菜单”的“输出文件”框)确定菜单的名称和位置-“生成”钮(菜单的扩展名为.MPR)
凡菜单有修改,都应重新“生成”一次
6.运行菜单程序:[因菜单是一个程序,因此运行菜单就是运行程序]
(1)“程序/运行”-选定菜单(程序)-“运行”
(2)DO 菜单名.MPR
【实验内容】
一、设计菜单
1.在学生表.dbf,课程表.dbf,成绩表.dbf三个表的基础上用菜单设计器设计一个用户自定义的菜单系统:如下所示:
系统维护(S)
个人资料(D)
成绩查询(C)
报表(P)
帮助(H)
口令维护(K)
个人资料查看(Q)
个人成绩查询(G)
基本情况(O)
目录与索引(V)
退出系统(X)
个人资料修改(J)
班级成绩查询(B)
学生成绩(C)
关于…… (A)
科目成绩查询(K)
【高手进阶】
进一步完成上面的菜单操作:
为菜单或菜单项指定任务(以成绩查询中个人成绩查询为例):虽然我们完成了菜单构架的设计,但是具体功能是如何实现的呢?
【自我测试】
设计一个如下的菜单系统:
系统维护
书籍查询
数据管理
口令维护
按作者查询
数据的修改
推出系统
按书名查询
数据的增加
按出版社查询
【实验过程】
一.启动菜单设计器创建一个菜单(学生管理。mnx):
1.,文件/新建”-(“类型”选)“菜单”-“新建文件”钮
 
2,在菜单类型选择的时候选择菜单,这里不做快捷菜单
3.进入菜单设计器窗口

二.创建菜单项:
在“菜单名称”列中输入要创建的菜单项(就是主菜单,快捷键和热键直接在菜单名称后面输入即可)如下图:

注意:在这里结果项都是子菜单,因为他们下面都有自己的子菜单三.创建子菜单:
单击结果旁边的创建按钮即可进入该菜单的子菜单创建对话框,如给成绩查询建立子菜单:单击成绩查询然后单击创建按钮

注意:在子菜单的结果选项中,选择命令,当然其他选项也可以,因为所有的子菜单都是执行某一个功能,这里我们以个人成绩查询为例讲解整个过程。在选项中输入命令:DO FROM 个人成绩查询.scx (意思是当用户单击个人成绩查询时就运行表单FROM 个人成绩查询,进入个人成绩查询界面)
4.为菜单或菜单项指定任务,
选定菜单项-在“结果”栏中选“命令”(或“过程”)-在编辑框中输入相应的命令或调用其它程序(在2,3的一步已做分析)
5.生成菜单程序:
,菜单/生成”-(“生成菜单”的“输出文件”框)确定菜单的名称和位置-“生成”钮(菜单的扩展名为.MPR)
凡菜单有修改,都应重新“生成”一次

6.运行菜单程序:[因菜单是一个程序,因此运行菜单就是运行程序]
(1)“程序/运行”-选定菜单(程序)-“运行”
(2)DO 学生管理.mpr

【高手进阶解答】
进一步完成上面的菜单操作:
为菜单或菜单项指定任务(以成绩查询中个人成绩查询为例):虽然我们完成了菜单构架的设计,但是具体功能是如何实现的呢?就如,个人成绩查询模块的实现过程如下:
创建一个表单(个人成绩查询.scx)
添加控件一个标签对象(LABEL1),一个文本框对象(TEXT1),一个命令按钮对象(COMMAND1),一个表格对象(GRID1)
设置对象属性
LABEL1.CAPTION=”输入学号:”
LABEL1.FONTSIZE=16
TEXT1.FONTSIZE=16
COMMAND1.CAPTION=”确定”
COMMAND1.FONTSIZE=16
GRID1.ENABLED=.f.
GRID1.VISIBLE=.f.

4.设置数据环境
方法:①菜单操作,显示----﹥数据环境,把学生表,课程表,成绩表添加进来
②鼠标右键单击表单任意空白处弹出快捷菜单---﹥数据环境,把学生表,课程表,成绩表添加进来

5.编写事件代码双击“确定”按钮,出现COMMAND1的CLICK事件编辑框,事件代码为:
SELE 学生表
LOCATE FOR ALLT(THIDFORM.TEXT1.VALUE) =ALLT(学生表.学号)
IF FOUND()
THIDFORM.GRID1.ENABLED=.t.
THIDFORM.GRID1.VISIBLE=.t.
THIDFORM.GRID1.RECORDSOURCETYPE=4
THIDFORM.GRID1.RECORDSOURCE="SELECT 学生表.学号,姓名,课程名,成绩 FROM 学生表,课程表,成绩表 WHERE 学生表.学号=成绩表.学号 AND 课程表.课程号=成绩表.课程号 AND ALLT(学生表.学号)=ALLT(THIDFORM.TEXT1.VALUE) INTO CURS TEMP1"
ELSE
MESSAGEBOX("没有该学生!!")
ENDIF
THIDFORM.REFRESH
6.保存,运行及调试
保存:“保存”工具或“文件”菜单下“保存”命令等方法,但文件名要为“个人成绩查询.scx”
运行:DO 学生管理.mpr或点击“!”

【自我测试解答】
步骤(略)
第9章 报表与标签练习一 报表与标签基本操作
【实验目的】
掌握用报表向导创建报表;
熟练掌握使用报表设计器创建报表;
【教材内容】
一、报表
报表包括两个基本部分:数据源和布局。
数据源是报表的数据来源,它通常是数据库中的表或自由表,也可以是视图、查询或临时表。
布局定义报表的打印格式。
报表设计就是根据报表的数据源和应用需要来设计报表的布局。
二、创建报表
1.基本步骤:
(1)选定报表类型;
(2)建立报表文件;
(3)编辑报表文件;
(4)预览和打印报表;
2.创建报表:
(1)利用“报表向导”
“文件/新建”-(类型)选“报表”-“向导”钮-选择向导-按提示进行
(2)利用“报表设计器”
①“文件/新建”-(类型)选“报表”-“新建文件”钮
②CREATE REPORT 报表文件名
进入“报表设计器”

三、设计报表
1.“页标头”带区:
位于每一页的顶部并出现在每一页中,即每页的标题。常用于显示各字段名与分隔线。
2.“细节”带区:
常用于显示表中各字段记录的值。运行报表时表中记录按细节规定的格式输出。
3.“页注脚”带区:
位于每一页的底部并出现在每一页中,即每页的结尾。常用于显示报表页码、日期与时间等。
4.工具栏:
“报表设计器”、“报表控件”、“布局”等。可从“显示”菜单中调出
5.设置报表“数据源”:
(1)设置“数据环境”
①“显示/数据环境”
②右击“报表设计器” —,数据环境”
③单击“数据设计器”工具箱中“数据环境”钮
(2)向“数据环境”中添加表、视图
①“数据环境/添加”
②右击“数据环境设计器” —,添加”
③单击“报表设计器”工具箱中“数据环境”钮
6.修改报表带区:
(1)调整大小拖带区标识栏
(2)放置控件单击“报表控件”工具箱中“控件”钮 — 放置控件
如:用“标签”控件,为各字段加上字段名作为小标题
【实验内容】
1.用报表向导为学生表创建一个学生基本情况报表(学生基本情况.frx)

2.用报表设计器为书库创建一个书籍情况报表(书籍情况.frx)
【高手进阶】
1.用报表向导为学生表,成绩表创建一个“一对多报表”学生成绩报表(学生成绩.frx)
2.使用标签向导为学生表设计一个准考证的标签。如下图:
【自我测试】
用报表设计器为学生表设计一个学生情况报表(学生情况.frx)
【实验过程】
1.用报表向导为学生表创建一个学生基本情况报表(学生基本情况.frx)
① 启动报表向导
“文件/新建”-(类型)选“报表”-单击“向导”钮-选“报表向导”-(按提示进行)
② 字段选取
选择表学生表 -再选择所需字段,按“添加”钮,将其添加到“选定字段”框中
(见图2)
③ 分组记录
这里不分组
④ 选择报表样式(见图 3)

图 1 图 2
 
图 3 图 4
⑤ 定义报表布局(见图 4)
可以定义报表的方向为“横向”或“纵向”
⑥ 排序记录(见图 5)
这里我们以学号排序
⑦ 完成(见图 6)
完成以前可以先预览一下报表
 
图 5 图 6
2.用报表设计器为书库创建一个书籍情况报表(书籍情况.frx)
(1)启动报表设计器
“文件/新建”-(类型)选“报表”-单击“新建文件”钮 (按提示进行)
(2) 设置报表“数据源”
①,显示/数据环境”
② 右击“报表设计器” —,数据环境”
③ 单击“数据设计器”工具箱中“数据环境”钮,然后把书库表(书库.dbf)添加进来
(3) 设计报表(见图 10)
①“标题”带区首先应该把“标题”带区调出来,方法是“报表”菜单---→“标题/总结”,然后添加“标签”控件,并输入内容
②“页标头”带区:
日期部分:首先添加“域”控件,然后输入表达式date()(日期是调用的日期函数)
线条部分:直接用“线条”控件即可页标头部分:先用“线条”控件和“矩形”控件画好表格,然后用“标签”控件写上相应的页标头
③“细节”带区
直接使用“域”控件将书库表中需要的字段添加近来
④“页注脚”带区
直接使用“标签”控件将需要的信息添加即可

图 10
(4)预浏与打印(见图 11)
①文件/打印
②报表/运行报表

【高手进阶解答】
1,用报表向导为学生表,成绩表创建一个“一对多报表”学生成绩报表(学生成绩.frx)
(1) 启动报表向导
“文件/新建”-(类型)选“报表”-单击“向导”钮-选“一对多报表向导”-(按提示进行)
(2) 字段选取
① 指定父表(学生表)并选择父表所需字段,将其添加到“选定字段”框中(见图7)
② 指定子表(成绩表)并选择子表所需字段,将其添加到“选定字段”框中(见图8)
(3) 建立两表的关联(系统会自动选定相匹配的字段)(见图 9)
(4) 选择报表样式
 
图 7 图8

图 9
(5)定义报表布局
(6) 排序记录
(7)完成
2.使用标签向导为学生表设计一个准考证的标签。
(1)启动标签向导
(2)选择表
(3)选择标签类型

这里可以在英制和公制之间转换。
(4)定义布局在这个步骤中可以选定表中的字段和“,”,“、”,“。”等符号来设计标签。对于准考证标签的设计,这里还需要使用字符常量,比如“准考证”,“学号”,“姓名”这些提示信息,就只能在文本框中输入相关的提示信息,然后添加到选定字段中。如下图:

(5)排序记录
(6)完成
【自我测试解答】
操作和上面基本上相同