指导老师:余敦辉
2009-3-2
VFP程序设计基础实验指导书
前 言
学习数据库程序设计,上机实训是十分重要的环节。为了方便读者上机练习,本实训指导书设计了12个实训。这些实训和课堂教学紧密配合,通过有针对性的上机实训,可以更好地熟悉 Visual FoxPro的功能,掌握 Visual FoxPro程序设计的方法,并培养一定的应用开发能力。建议每个实训安排2机时左右,也可以根据实际情况从每个实训中选择部分内容上机练习。
为了达到理想的实训效果,请务必做到以下几点:
1想好编程的思路,做到胸有成竹,提高上机效率。
2、程序的执行结果以及各种屏幕信息的含义、出现的原因并提出解决办法。
3书要求填写的内容。
程序设计和应用开发能力的提高需要不断的上机实践和长期的经验积累,在上机过程中会碰到各种各样的问题,分析问题和解决问题的过程就是经验积累的过程。只要按照上面3点要求去做,在学完本课程后就一定会有很大的收获,计算机应用能力就会有很大提高。
【实训1】熟悉VFP环境
实训目的:
1.熟悉VFP系统的操作环境。
2.掌握VFP系统的启动和退出方法。
3.掌握MSDN帮助文件的使用方法。
实训内容:
1.VFP系统的启动
(1)点击“开始”菜单中的“程序”选项。
(2)找到Visual FoxPro 6.0的快捷方式来启动VFP。
注:Visual FoxPro 6.0的可执行文件为vfp6.exe,其所在目录随安装的位置的不同而不同,一般为:“C:\Program Files\Microsoft Visual Studio\Vfp98\VFP6.EXE"。
2.在桌面上建立vfp6.exe的快捷方式
(1) 首先找到VFP的可执行文件vfp6.exe,依次打开C:\Program Files\Microsoft Visual Studio\Vfp98文件夹,找到VFP的可执行文件为vfp6.exe。(根据具体实训环境的不同,该文件的位置可能不同)
(2)选中vfp6.exe文件。
(3)右键拖动vfp6.exe文件到桌面空白处,在弹出的快捷菜单中选择“在当前位置创建快捷方式”菜单项,即可在桌面上建立vfp6.exe的快捷方式。双击刚刚建好的快捷方式也可以启动vfp环境。
3.退出VFP(以下方法并列)
方法1:在“命令”窗口中,输入命令“quit”。
方法2:直接按Alt+F4。
方法3:在“文件”菜单中,选择“退出”命令。
方法4:双击主窗口左上角的控制菜单框。
方法5:在主窗口控制菜单中,选择“关闭”。
4.认识VFP界面
(1) 在vfp主窗口中依次找到标题栏、菜单栏、工具栏、状态栏的位置。
(2) “常用”工具栏的关闭。
①单击“显示”菜单中的“工具栏”菜单项。
②在弹出的窗口中,找到“工具栏”列表框中的“常用”项,鼠标单击去掉“常用”工具栏前面的选中标记。
③单击“确定”按钮,即可关闭“常用”工具栏。
(3) “常用”工具栏的显示。
①单击“显示”菜单中的“工具栏”菜单项。
②在弹出的窗口中,找到“工具栏”列表框中的“常用”项,鼠标单击选中“常用”工具栏前面的选中标记。
③单击“确定”按钮,即可显示“常用”工具栏。
注:其他工具栏的显示与关闭与上面的方法相同,请读者自己练习。
(3)命令窗口显示与关闭。
方法1:单击“窗口”菜单中的”命令窗口” 菜单项来显示命令窗口,再次单击“窗口”菜单中的”命令窗口”菜单项可关闭命令窗口。
方法2:CTRL+F2(显示命令窗口)/ CTRL+F4(关闭命令窗口)
5.利用MSDN帮助文件查找要解决的问题
(1)进入帮助系统有三种方法。
方法1:在命令窗口中,输入“help”命令后,回车。
方法2:调用“帮助”菜单。
方法3:在VFP窗口中的任一位置选中需要获得帮助的内容,按“F1”功能键。
(2)选择“活动子集”为“Visual Foxpro文档”,保证用户查看到的是关于vfp的帮助内容。
(3)选中“搜索”标签,输入要搜索的关键字。例如输入“系统容量”四个字,单击“列出主题”按钮列出符合条件的主题。
(4)用鼠标双击找到的主题,在右边的窗口部分即可看到要查找主题的相关内容。(当然用户也可以在“目录”选项卡下以目录的形式来浏览vfp的帮助内容。)
注:帮助文件的位置:通常情况下,VFP6的MSDN帮助文件位置在c:\program files\Microsoft Visual studio\msdn98\98vs\2502,文件名为foxhelp.chm。
(5)请读者找到所在的实训环境下,VFP6的MSDN帮助文件foxhelp.chm的存放位置。
【实训2】项目管理器的基本操作
实训目的:
1.掌握工作目录的设置方法。
2.掌握项目管理器的基本操作。
3.掌握如何建立表文件及备注和通用字段内容的输入方法。
实训内容:
1.设置D:\VFPLX文件夹为工作目录(两种方法)
首先在D盘新建立一个名为VFPLX的文件夹。
方法1:菜单方法
(1)依次单击“工具”菜单中的“选项”菜单项。
(2)单击选中”文件位置”选项卡中的“默认目录”项。
(3) 单击“修改”按钮,在弹出的“更改文件位置”对话框中,选中“使用默认目录”选项。
(4)在“定位默认目录”下面的文本框输入新的工作目录文件夹路径,单击“确定”按钮。例如输入:D:\VFPLX。
方法2: 命令操作的格式为:set default to 目录名
(1)在命令窗口中输入:set default to D:\VFPLX
(2)回车执行上面的命令即可。
注意:要设置为工作目录的文件夹必须已经存在,否则,不能设置成功。在vfp环境下,一旦设置了工作目录后,用户使用VFP工作过程中所产生的文件默认都会存到已经设置好的工作目录下,不会与vfp系统文件混在一起,方便管理与查找。
2.项目管理器的基本操作
(1)建立项目文件
①单击“文件”菜单中的“新建”菜单项,在弹出的窗口中选择文件类别为“项目”。 ②单击“新建文件”按钮。
③在弹出的创建窗口中输入项目文件名。例如输入:XM1(注意项目文件的扩展名为.PJX)。
④ 单击“保存”按钮,便建立了名为XM1的项目文件,同时打开了项目管理器窗口。
(2)建立数据库文件
【实训2】项目管理器的基本操作
实训目的:
1.掌握工作目录的设置方法。 2.掌握项目管理器的基本操作。
3.掌握如何建立表文件及备注和通用字段内容的输入方法。 实训内容:
1.设置D:\VFPLX文件夹为工作目录(两种方法)
首先在D盘新建立一个名为VFPLX的文件夹。 方法1:菜单方法
(1)依次单击“工具”菜单中的“选项”菜单项。 (2)单击选中”文件位置”选项卡中的“默认目录”项。
(3) 单击“修改”按钮,在弹出的“更改文件位置”对话框中,选中“使用默认目录”选项。
(4)在“定位默认目录”下面的文本框输入新的工作目录文件夹路径,单击“确定”按钮。例如输入:D:\VFPLX。
方法2: 命令操作的格式为:set default to 目录名 (1)在命令窗口中输入:set default to D:\VFPLX (2)回车执行上面的命令即可。
注意:要设置为工作目录的文件夹必须已经存在,否则,不能设置成功。在vfp环境下,一旦设置了工作目录后,用户使用VFP工作过程中所产生的文件默认都会存到已经设置好的工作目录下,不会与vfp系统文件混在一起,方便管理与查找。 2.项目管理器的基本操作 (1)建立项目文件
①单击“文件”菜单中的“新建”菜单项,在弹出的窗口中选择文件类别为“项目”。 ②单击“新建文件”按钮。
③在弹出的创建窗口中输入项目文件名。例如输入:XM1(注意项目文件的扩展名为.PJX)。
④ 单击“保存”按钮,便建立了名为XM1的项目文件,同时打开了项目管理器窗口。 (2)建立数据库文件
①在项目管理器中,单击选中“数据”选项卡下面的“数据库”类别。 ②单击“新建”按钮,单击“新建数据库”按钮。
③输入文件名:如“教工”(注意数据库文件的扩展名为.dbc)。
④单击“保存”按钮,便建立了名为“教工”的数据库,同时打开了数据库设计器窗口。 ⑤单击数据库设计器窗口右上角的“x”形图标按钮来关闭设计器。 (3)关闭项目文件
单击项目管理器右上角的“x”(关闭按钮)。 (4)打开项目文件。
①单击“文件”菜单中的“打开”菜单项。
选择文件类型为“项目”,选中要打开的项目文件XM1.PJX,单击“确定”。 (5)建立表文件
①单击“数据库”左边的“+”,就会列出刚刚建好的“教工”数据库。 ②单击“教工”左边的“+”,选中“表”。(选自由表,可建立自由表) ③单击“新建”/单击“新建表”按钮(此时建立的是数据库表)。 ④输入文件名:如“zgda”(注意表文件的扩展名为.dbf)。 ⑤单击“保存”按钮,便打开了表设计器窗口。 ⑥输入表的结构(如下表所示)后,单击“确定”按钮。
⑦
1.备注字段的输入方法:双击相应记录的备注字段(简历),打开备注字段的输入窗口,既可输入文本内容。 2.通用字段的输入方法:
(1)双击相应记录的通用字段(照片字段),打开通用字段的输入窗口。 (2)单击“编辑”菜单中的“插入对象”命令。
(3)选择“对象类型”为“Microsoft Word 图片”,即可打开Word程序。 (4)在Word程序依次单击插入/图片/剪贴画/选择一个剪贴画插入。
(5)关闭Word程序,回到vfp,即可看到插入的图片,关闭通用字段的输入窗口。 (6)已经插入内容的备注字段和通用字段的外表分别显示为Memo和Gen,第一个字母大写;没有插入内容的备注字段和通用字段的外表分别显示为memo和gen。
小结:建立表文件的过程分2步。首先建立表结构,即定义表的列数及每一列的数据类型、宽度等;再输入记录信息,即决定表有多少行的数据。 (6)修改表文件的结构
① 在项目管理器中,选中zgda.dbf表。
② 单击“修改”按钮,即可打开表设计器,对表的结构进行修改。(可增加、插入、
删除字段、改变字段的位置)
③ 在表设计器的字段选项卡上的字段列表中最后一个字段后面单击鼠标来增加一个
备注型字段,输入字段名为“备注”,选择字段类型为“备注型”。
④ 删除“工作时间”字段:选中“工作时间”字段,单击“删除”按钮。 ⑤ 改变字段的位置(顺序):拖动字段名前的移动按钮到目标位置松开鼠标即可。 注:可以在命令窗口中输入:modify structure命令,来修改表文件的结构,但必须先打开zgda表。 (7)浏览表的内容(记录)
①在项目管理器中,选中zgda.dbf表。
②单击“浏览”按钮,即可打开浏览窗口对表的记录进行修改。 (8)移去一个(表)文件
①在项目管理器中,选中要移去:如zgda.dbf表。
②单击“移去”按钮,单击“移去”按钮,仅仅是将表从项目管理器中移去,不删除该表文件;(单击“删除”按钮,是将表从项目管理器中移去,同时删除该表文件)。 注:如果是数据库表,移去后该表变为自由表。 (9)在项目中添加已有的文件
①在项目管理器中,选中要添加的文件类型:如选中“自由表”类别。 ②单击“添加”按钮,选择要添加的表文件,如:刚刚移去的zgda.dbf ③单击“确定”,即可添加到项目中。
(10)项目管理器展开与折叠、选项卡拖离和顶层显示操作
①展开与折叠:单击“其他”选项卡右边的“向上箭头”图标,即可折叠项目管理器窗口,同时“向上箭头”图标变成“向下箭头”图标;单击“其他”选项卡右边的“向下箭头”图标,即可展开项目管理器窗口,
②选项卡的拖离:在“折叠”状态下,拖动相应的“选项卡”到新的位置松开鼠标即可。 ③选项卡的顶层显示:单击拖离后的选项卡上的“图钉”图标即可使该选项卡变成“顶层显示”状态,不被其他的“选项卡”所遮盖。
【实训3】数据类型与常用函数的用法
实训目的:
1.熟练掌握各种数据类型常量的表示方法。 2.熟练掌握常用函数的用法。 相关知识:
1.常量的表示方法
数值型(N):直接由数字或+、-、小数点构成,无定界符号。 字符型(C):
(1)由字符、汉字组成,需加定界符(单引号、双引号、中括号)。 (2)如’沈阳’、”沈阳”、[沈阳]。
(3)同一定界符不能嵌套,如:“AB”CD””,但 ‘AB”CD”’是合法的。 日期型(D):用{}定界。如:{^2005-08-30}或CTOD(“01/08/30”)。 日期时间型(T):用{}定界。如:{^2005-08-30 11:15:30 A}
逻辑型(L):用.定界。如用.t.或.Y.表示逻辑真, 用.F.或.N.表示逻辑假。 货币型(Y):用$符号开头,后跟数字。如:$90。 2.函数的学习要点
(1)函数名是什么?
(2)该函数有几个参数、参数的数据类型是什么? (3)该函数的功能是什么? (4)返回值的数据类型是什么?
对于任何的一个函数,只要注意以上4点,应用起来就不成问题!
实训内容:在窗口中输入下列函数表达式,回车运行后分析运行结果,具体练习过程中请查阅帮助文件以了解下述函数的具体用法。
1.sign( ) 函数功能:当指定数值表达式的值为正、负或 0 时,分别返回 1、-1 或 0 ? sign(0) &&0 ? sign(-8)
&&-1
2.平方根函数sqrt():返回指定数值表达式的平方根 ? sqrt(9) &&3 (参数不能为负数) 3.圆周率函数pi():返回圆周率常数
? pi() &&3.14
set decimals to 4 &&指定数值型数据显示的小数位数为4位,系统默认为2位 ? pi() && 3.1416
4.取整函数int()、floor()、ceiling()
? int(12.56) &&12
? int(-12.56)
? int(.56) && -12 &&0 注:int()函数返回值为参数的整数部分。 ? floor(-4.5) && -5
? floor(3.5) &&3
注:floor()函数返回值为小于或者等于参数值的最大的整数。
? ceiling(-4.5) &&-4
? ceiling(3.5) &&4
注:ceiling()函数返回值为大于或者等于参数值的最小的整数。
5.四舍五入函数Round()
? Round(7556.5678,2) &&7556.57
? Round(7556.5678,0) &&7557
? Round(7556.81,-2) &&7600
? Round(7556.5678,-1) &&7560
注:第二个参数为负数时,表示对相应的整数位进行四舍五入
6.最值函数max()、min()
? max(10,20,30,25) &&30
? max(10,20) &&20
? max("a","ab") &&ab
? max($10,$20) &&$20
? max({^2005-4-16},{^2004-4-16}) &
注:参数至少有二个,参数可以是字符型、数值型、货币型、日期型;将上面的max改写成min后运行并分析运行结果。
7.求字符串长度函数len()
? len("abcde") &&5
? len("*") &&1 *为空格字符
? len("中国") &&4 一个汉字占2个宽度
? len("") &&0 空字符串长度为0
8.大小写转换函数
? lower("AbCd12OK")
? upper("AbCd12OK") &&abcd12ok &&ABCD12OK
注:只转换字符串中的大小写,其他字符不变。
9.空格字符生成函数
? "a"+space(3)+"b" &&a***b *为空格字符
? len(space(3)+space(2))
? len(space(3)-space(2))
10.删除空格字符函数
? trim("abcd***")+"ef" &&abcdef *为空格字符
? trim("abc*d*****")+"ef" &&abc*def *为空格字符
? ltrim("*ab*")+"ef" &&ab*ef *为空格字符
? alltrim("*ab*")+"ef" &&abef *为空格字符
11.取子串函数
? left("abcdef",2) &&ab
? left("abcdef",100) && abcdef
? right("abcdef",3) &&def
? substr("abcdef",2,3) &&bcd
? substr("abcdef",3) &&cdef
? substr("中华人民共和国",5,4) &&人民
12.occurs()函数
? occurs("ab","cabkabk") &&2 串ab在串cabkabk中出现了2次 ? occurs("ab","ckk") &&0 串ab在串ckk中出现了0次
13、at()函数
? at("ab","ccabkabk",1) &&3 串ab在串cabkabk中第1次出现的起始位置是3 ? at("ab","ccabkabk",2) &&6 串ab在串cabkabk中第1次出现的起始位置是6 &&5 +为字符连接运算符 &&5 -为字符连接运算符
14.子串替换函数
? stuff("abcdef",2,4,"ok") &&abokef 替换串abcdef第2个位置开始的4个字符,用串ok来替换
? stuff("abcdef",2,0,"ok") &&abokcdef 相当于插入ok
? stuff("abcdef",2,4,"") &&af 相当于删除bcde
15.日期函数
? date() &&
set century on &&
? date()
set date to ansi &&
? date()
? time()
? datetime()
? year({^2004-04-16})
? month({^2004-04-16})
? day({^2004-04-16})
? hour(datetime())
? minute(datetime())
? sec(datetime()) &&
16.转换函数
? str(123.5678,8,2) &&**123.57 *
? str(123.5678,6,3) &&123.57
? val("123.45")+100 &&223.45
? val("12a3.45") &&12
? val("a1212a3.45") &&0
set date to usa &&
? ctod("04-16-05") &
? ctod("04-16-05")+1 &
? dtoc(date()) &&返回系统日期 用4位数字显示年份 设置日期的显示格式为ansi &&以字符串形式返回系统当前时间 &&返回系统日期和时间 &&2004 返回日期中的年份数值 &&4 返回日期中的月份数值 &&16 &&分别显示当前系统时间的小时数 &&分别显示当前系统时间的分钟数 分别显示当前系统时间的秒数 为空格 第1个字符不是数字也不是+-号,返回0 设置日期的显示格式为美国日期格式 将系统日期转换为字符格式
17.宏替换函数
x="123"
? &x+100 && 223 &&相当于? 123+100
? x+"100" && 123100
18.iif()函数
x=100
? iif(x>100,x-50,x+50) &&150
? iif(x
19.数据类型测试函数type()、vartype()
? type("123") &&N
? type("04/06/09") &&N
? type("time()") &&C
? vartype(123) &&N
? vartype(“123”) &&C
? vartype($123) &&Y
? vartype(Datetime()) &&T
? vartype({^2005-04-19}) &&D
? vartype(3>5) &&L
思考题:如何用IIF()函数实现SIGN()的功能?
(提示:IIF(X>0,1,IIF( x=0 ,0,-1)))
20.测试函数bof()、eof()、recno()
use zgda
? bof() &&.f.
? recno() &&1 刚刚打开的表,指针指向首记录
skip –1 && 指针向上移动一条记录
? bof() &&.t.
? recno() &&1 表可访问的最小记录号为1
go bottom && 指针指向尾记录
? eof() &&.f.
? recno() &&8 假设表中只有8条记录,指针指向首记录
skip &&指针向下移动一条记录
? eof() &&.t.
? recno() &&9 表可访问的最大记录号为记录总数+1, 假设表中只有8条记录 ? reccount() &&8 假设表中只有8条记录
21.信息窗口函数MessageBox()
格式:MESSAGEBOX(信息文本, [,对话框类型数值 [,标题栏文本]])
例子:MESSAGEBOX(“您好,VFP!”,64,“提示信息”)
【实训4】运算符与表达式
实训目的:
1.掌握各种类型表达式的书写方法。
2.掌握运算符的优先级别。
实训内容:
依次在命令窗口中输入下列表达式,回车运行来输出表达式的值,并分析运行结果。
1.数值表达式
? -3**2 &&9 负号的运算级别高于乘方
? (3+4)/2^2+int(12.5) &&13.75
相关知识:
(1)书写数值表达式,乘号一定不能省略。
(2)数值表达式是由算术运算符和数值型常数、变量、函数组成,运算结果为数值型数据。算术运算符为:+ - * / % ^ ( ) 。
(3)算术运算符的优先次序由高到低依次为:括号、负号、乘方、乘除、模运算(取余)、加减,同级运算从左到右依次进行。
2.字符表达式
? “abc**”+”*cd*” &&abc***cd* *为空格,+号为字符串完全连接运算 ?“abc**”-”*cd*” &&abc*cd*** *为空格,-号为字符串不完全连接运算 相关知识:
(1)字符表达式是由字符运算符和字符型常数(即用定界符括起来的字符串)、变量、函数组成,运算结果是字符型数据或逻辑值。
(2)二种字符串运算符,优先级别相同。
(3)完全连接是指两个字符串合并,即包括空格在内的字符串中所有字符相加。不完全连接运算是将串1尾部的空格移到串2的尾部后,再连接。
3.关系表达式
set collate to “machine” &&设置数据的比较序列为机内码方式
? 8>100 &&.f.
? “8”>”100” &&.t.
? {^2004-5-19}>{^2003-5-19} && .t.
? $80
? “abc”=”ab” &&.t. 系统默认“=”为非精确比较,右边是左边的左子串,则成立。
Set exact on &&设置“=”为精确比较,off为非精确比较
“abc”=”ab” && .f. 精确比较要求两边的字符串必须完全相等才成立。 ? “ok”$”abokd” &&.t. 前一个串“ok”包含在后一个串中,返回逻辑真 相关知识:
(1)关系表达式描述的同类数据的大小比较关系,其结果是一个逻辑值,关系成立结果取真(.T.),不成立结果取假(.F.)。
(2)关系运算符两边的数据类型要一致,只有同类型的数据才能进行比较。
(3)数据比较规律
①数值和货币类型:数越大,其值越大。如:1000>800 $90>$10
②日期数据:未来>历史 如:{^2007-5-19}>{^2007-5-18}
③逻辑常量:逻辑真大于逻辑假,即:.t.>.f.
④字符串比较:依次对应比较两个串的字符,直到比较出结果即停止比较。例如:"abc">"ab", "abc">"aBc"。
⑤字符的比较规律
ASCII字符:比较字符的ASCII码值的大小。总结规律为:空格注意:上述字符的比较规律的前提是必须设置数据的比较序列为机内码方式。设置的命令为:set collate to “machine” 或者依次单击“工具”菜单中的“选项”菜单项,单击“数据”选项卡,设置“排序序列”为“machine”选项即可。
4.逻辑表达式:逻辑运算符的优先级别为:.NOT. .AND. .OR.
? not(10+3)>5 and ”ab”$”ab”+”cde” or 3>=4 &&.f.
? 3>2 AND NOT 5>6 &&
相关知识:
(1)当表达式中出现了多种运算符时,各种运算符的优先顺序由高到低依次为:
算术或字符或日期运算→关系运算→逻辑运算
(2)相同优先级的运算按从左到右的顺序计算
5.日期和日期时间表达式
? {^2005-3-29}-{^2005-3-21} &&8 两日期相差的天数为8天
? {^2005-3-29}+{^2005-3-21} && 两日期表达式相加,属非法表达式
? {^2005-3-25}+3 &
? {^2005-3-25}-3 &(用严格日期格式表示) ? datetime()+30 &&其值为当前时间的30秒后的日期时间
? datetime()-30 &&其值为当前时间的30秒以前的日期时间
? {^2005-5-5 10:10:20 a}-datetime() &&2个日期时间相差的秒的数值
相关知识:
(1)一个日期与一个数值相加,&&日期,表示从当前日期往后数N天。
(2)一个日期与一个数值相减,&&日期,表示从当前日期向前数N天。
(3)两个日期相减,&&数值,表示两日期之间相差的天数。
【实训5】程序结构
实训目的:
(1)理解VFP的2种工作方式:交互方式和程序执行方式。
(2)掌握程序文件的建立、存盘、调用方法和注释语句的使用方法。
(3)熟悉3种程序结构。
(4)会用调试器来分析程序的执行流程。
相关知识:
行首注释语句: NOTE | * 注释内容
功能:在程序文件中指示注释行的开始,注释行不被执行。
行尾注释语句: && 注释内容
功能:在程序文件中代码行的行尾注释,注释内容不被执行。
实训内容:完善下列程序横线处的代码,并调试运行。
1.建立并执行程序p1.prg,程序功能是判断用户输入的整数是否是偶数。
(1)在命令窗口中输入:modify command p1,在弹出的文本编辑器窗口中输入程序代码如下:
input "一个整数" to x if x/2=int(x/2)
? “您输入的是偶数”
else
? “您输入的不是偶数”
endif
(2)按CTRL+W键,存盘。
(3)在命令窗口中输入命令:DO p1后,回车执行该程序。
2.参照上面的例子来建立并执行p2.prg,程序功能:判断用户输入的整数是正数、负数还是零,代码如下:
input "一个整数" to x
if x>0
? "您输入的是一个正数"
else
if x
? "您输入的是一个负数"
else
? "您输入的是零"
endif
endif
3.参照上面的例子来建立并执行p3.prg,程序功能:根据学生的分数情况给出成绩等级,代码如下:
Input "分数 " to x &&从键盘接收来个成绩的数值赋值给X变量
Do case
Case x>=90 and x
? "优秀"
Case x>=80 and x
? "良好"
Case x>=70 and x
? "中等"
Case x>=60 and x
? "及格" otherwise
? "悲惨,您可能不及格阿!"
Endcase
4.建立sum.prg,程序功能是求 1+2+3+„+10的和,代码如下所示
S=0
K=1
DO WHILE K
S=S+K K=K+1
ENDDO
? “1+2+„+10=”,S
注意:S=S+K为求和表达式,在循环中的作用是累加变量K的值,将结果保存到S变量中。 思考:
(1)若s=s+k分别改为s=s+k**2和s=s+1/k,程序的功能又是什么?
(2)请分析下面的程序段的功能是什么,S中累加的是哪些数的和?
S=0
K=1
DO WHILE K
K=K+1
S=S+K
ENDDO
? “S=”,S
操作练习:使用调试器来跟踪该程序的执行情况,具体步骤为:
(1)单击“工具”菜单中的“调试器”菜单项,打开“调试器”窗口。
(2)在调试器窗口中单击“文件”菜单中的“打开”菜单项,打开要跟踪的程序,如sum.prg。
(3)执行“调试”菜单中的“单步跟踪”命令,来跟踪程序的执行,并观察分析“局部”窗口中变量值的变化情况。
5.在程序功能不变的情况下,用FOR循环来改写第4题sum.prg,并对比FOR循环与DO While循环的区别。
参考代码如下,读者也可以自己写出类似的程序。
S=0
For k=1 to 10 step 1
S=S+k
Endfor
? “S=”,S
6.编写程序JC.PRG,程序功能是求5的阶乘(5!=1*2*3*4*5),参考代码如下。
Y=1 &&存放阶乘结果的变量要赋初值为1
FOR X=1 TO 5 step 1 && step 1 可省略 Y=Y*X &&累计变量X的乘积到变量Y中。
ENDFOR
? "5!=",Y
注:请打开调试器,来跟踪该程序的执行情况。
7.参照上一题的程序,编写程序求S=1!+2!+3!+4!+5!的值。
S=0
Y=1
FOR X=1 TO 5
Y=Y*X &&循环执行过程中,Y中存放的分别是1、2、3、4、5的阶乘值 S=S+Y &&累加Y中存放的分别是1、2、3、4、5的阶乘值
ENDFOR
? "S=",S
8.用调试器跟踪下面程序的执行情况,并写出运行结果。
Store 0 to x, y, s1, s2, s3
Do while x
x=x+1
Do case
Case int(x/2)=x/2 &&判断X是偶数
S1=s1+x/2 &&S1中累加的是2、4、6、8、10几个数和的一半
Case mod(x,3)=0 &&判断X是3的倍数
S2=s2+x/3 &&S2中累加的是3、9两个数和的三分之一
Case x%2!=0 &&判断X不是偶数
s3=s3+1 &&S3存放的是非偶数的个数(1、5、7)
Endcase
Enddo
? s1,s2,s3
运行结果: 15.0000 4.0000 3
9.找出100—900之间的“水仙花数”(指一个三位数,其各位数字的立方和等于该数本身,如:153=1+5+3),下面是部分代码,调试该程序。
*****SXH.PRG求水仙花数****
CLEAR 333
FOR K=100 TO 999
A=INT(K/100) &&取百位数字
B=INT((K-100*A)/10) &&取十位数字
C=MOD(K,10) &&取个位数字,看看取十位是否还有别的方法? IF k=A**3+B**3+c**3
? K
ENDIF
ENDFOR
运行结果:153,370,371,407
10.用scan-endscan循环结构来显示zgda表中所有女讲师的记录信息。
USE ZGDA
SCAN for 性别=“女” and 职称=“讲师”
DISPLAY
ENDSCAN
11、用3种循环显示ZGDA.DBF的所有记录,请对比3种循环。
(1)用SCAN循环显示ZGDA.DBF的所有记录:
USE ZGDA
SCAN
DISPLAY
ENDSCAN
(2)用DO循环显示ZGDA.DBF的所有记录:
USE ZGDA
DO WHILE NOT EOF()
DISP skip
ENDDO
(3)用FOR循环显示ZGDA.DBF的所有记录:
USE ZGDA
K=RECCOUNT()
FOR J=1 TO K
DISP skip
ENDFOR
【实训6】数据表的操作
实训目的:
(1)熟练掌握数据表文件的建立、复制、删除和表记录的插入、删除等命令操作。
(2)会用命令方式来给表建立索引。
实训内容:
1.建立zgda表文件
(1)在D盘新建一个文件夹vfpok。
(2) 设置d:\vfpok为工作目录,在命令窗口中输入命令:set defa to d:\vfpok &&可根据需要设置。
(1)在命令窗口中输入命令:create zgda,打开表设计器。
(2)接下来的操作与项目管理器中的建表操作相同。建立表文件的过程分2步:即先建立表结构(规定表的列数及类型等);输入记录(决定表有多少行的数据)
2.表文件的复制
use zgda &&打开表zgda
list && list显示全部记录后,指针指向文件尾
? eof() && .t.
copy to danew.dbf for 性别='男' &&复制打开的表文件zgda 中男生记录到danew.dbf use danew &&打开danew,此时自动关闭前一个表zgda
disp all &&显示全部记录后,指针指向文件尾
3.表结构的复制与修改
use zgda
display structure &&显示表的结构信息
copy stru to dast.dbf fiel 姓名,性别,年龄,职称 &&复制zgda表文件结构到dast.dbf use dast &&打开danew,此时自动关闭前一个表zgda
list structure &&显示表的结构信息
modi stru &&修改结构danew表的结构
4.文件的复制
close all &&关闭所有文件
copy file zgda.dbf to zgdabak.dbf &&复制zgda表文件到zgdabak表文件中
use zgdabak &&显示错误信息,找不到备注文件
copy file zgda.fpt to zgdabak.fpt &&复制备注文件
use zgdabak &&打开文件
list &&显示全部记录后,指针指向文件尾
5.文件改名、删除与文件目录的显示
dir z*.* &&列出所有z开头的文件
dir &&列出所有表文件
rename zgdabak.dbf to zb.dbf &&表文件zgdabak.dbf改名为zb.dbf
use zb.dbf &&显示错误信息,找不到备注文件
rename zgdabak.fpt to zb.fpt &&表备注文件同时要改名,否则,zb.dbf表打不开。 dele file zb.fpt &&删除zb.fpt
use zb.dbf &&显示错误信息,找不到备注文件
dele file zb.dbf &&删除zb.dbf文件
6.表记录的修改
use zgda
edit &&进入全屏幕状态,修改表的记录
change &&进入全屏幕状态,修改表的记录
browse &&进入全屏幕状态,修改表的记录
*用replace命令修改特定的记录
go 4 &&指针定位记录号为4的记录
disp &&显示当前记录信息
repl 年龄 with 年龄+1 &&当前记录的年龄+1,无范围、条件替换的是当前记录 disp &&显示当前记录信息(对比一下)
*用replace命令成批的修改满足条件的多条记录
clear &&清屏
list &&显示所有记录信息
repl all 年龄 with 年龄+1 for 职称="讲师" &&所有讲师记录的年龄+1
list &&显示所有记录信息(对比一下)
7.表记录的插入
go 3 &&指针定位在第3条记录
insert blank &&在第3条记录后,插入一条空记录
list &&显示所有记录信息
go 3
insert blank before &&在第3条记录前,插入一条空记录
list &&显示所有记录信息
8.表记录的删除
go 3
dele &&逻辑删除当前记录
list &&可以看到第3条记录有删除标记*
pack &&物理删除有删除标记的记录
list &&显示所有记录信息,原来的第3号记录已删除了。
注:
(1)请读者将另一条空记录用命令删除
(2)zap等价于先执行dele all后,再执行pack(请复制一个表文件再试这个命令)。
(3)recall、delete 命令后无任何选项时,只对当前记录操作。
9.表的排序
use zgda
sort on 性别 /D to zgxb &&按照性别降序生成排序表zgxb
use zgxb
list
10.建立索引及索引查找
(1)建立单索引
close all &&关闭所有文件
use zgda &&打开表文件zgda
list &&此时表按照物理顺序显示,即按照记录号顺序显示(用户输入记录的顺序) index on 性别 to xb.idx &&按照性别递增的顺序建立单索引文件
list &&此时表按照性别递增的逻辑顺序来显示(刚刚建立的索引文件正起作用) set index to &&关闭索引文件,记录恢复物理顺序显示
list &&记录恢复物理顺序显示
set index to xb.idx &&打开已经建立单索引文件
(2)建立结构复合索引
index on 年龄 desc tag NL &&在结构复合索引文件中按照年龄降序建立索引,NL为其索引标识。
index on 姓名ascending tag xm &&在结构复合索引文件中按照姓名升序建立索引,xm为其索引标识。
set order to tag nl &&设置结构复合索引文件中年龄索引方式起作用 list &&按照年龄降序显示表的记录
find 45 &&查找年龄为45的记录,如果找到,则指针定位该记录,同时found()返回值为真;没有找到,指针指向文件尾,found()返回值为假。
display
set order to xm &&设置结构复合索引文件中姓名索引方式起作用 list &&按照姓名升序显示记录
seek “王” &&查找姓王的记录
(3)建立非结构复合索引
index on 工作时间 desending tag GT of fjg.cdx &&建立非结构复合索引文件fjg.cdx,索引方式为工作时间降序,其索引标识为GT。
11.顺序查找
use zgda
locate for 姓名=”王” &&查找姓王的职工,=为非精确比较,可以实现模糊查询 ? found() &&.t.
display &&显示当前记录
continue &&继续查找下一个满足条件(姓王的职工)的记录
? found() &&.t. 假设表中有2条姓王的记录
display
注意:locate 与 continue 合用,可以实现查询每一个满足条件的记录。
12.过滤记录
USE ZGDA
set filter to 年龄>40 &&指定过滤条件为年龄大于40岁,满足条件的记录可操作 List &&只会显示年龄大于40岁的记录
set filter to &&取消过滤器,此时,所有记录都可操作
set filter to 性别=”女” and 职称=“讲师” &&指定过滤条件为女讲师
13.统计命令
use zgda
sum 年龄 TO X &&求所有记录年龄字段值的和,结果存放到X变量中。 ? X
AVERGE 年龄 TO Y &&求所有记录年龄的平均值,结果存放到Y变量中。 ? Y
clear
count for性别=”女” to k &&查表中女职工记录个数,结果存放到k变量中。 ? k &&8 表中共有8条记录
注:count命令的结果受set dele on的影响
loca for 性别=”女” &&找到第一条女职工记录
delete &&逻辑删除
set delete on &&屏蔽有删除标记的记录
count for性别=”女” to k &&查表中女职工记录个数,结果存放到k变量中。 ? k &&7 有删除标记的记录被屏蔽不计数
? recount() &&8 该函数不受set dele on的影响,表中共有8条记录
14.分类汇总
use zgda
index on性别 to xb &&汇总的关键字段必先索引
total on 性别 to zgnew &&按照性别分类汇总,生成新表文件,表中只有2个记录 use zgnew
count to x &&统计表记录的个数
? x &&2
List &&显示全部的两条记录信息
【实训7】查询与视图
实训目的:
1.理解查询与视图的概念与二者的区别。
2.了解结构化查询语言SQL。
3.熟练掌握用“查询设计器”和“查询向导”两种方法建立查询。
4.熟练掌握建立视图的操作方法。
实训内容:
1.单表查询:为数据表ZGDA.DBF建立一个查询文件ZGXB.QPR,查询年龄大于40的女职工的全部信息、按照年龄降序来显示查询结果。
操作步骤:
(1) 单击“文件”菜单中的“新建”菜单项,在弹出的窗口中选择文件类别为“查询”。
(2) 单击“新建文件”按钮,打开了“查询设计器”窗口。
(3)在弹出的“打开”对话框,找到要查询的表文件zgda,单击“确定”按钮。
(4)选择“字段”选项卡,单击“全部添加”或者根据查询要求选择要显示的字段,单击添加,选定的字段出现在“选定字段”栏中。
(5)设置筛选条件为年龄大于40的女职工。选择“筛选”选项卡,选择“年龄”字段,条件为“>”,在实例中输入40,逻辑条件为”AND”,在下一行中选择“性别”字段,条件为“=”,在实例中输入“女”。
(6)选择“排序依据”选项卡,选择“年龄”为排序字段,单击“添加”按钮,选择排序选项为“升序”。
(7)保存查询文件。单击“文件”菜单中的“保存”菜单项,输入查询文件名称为ZGXB.QPR,单击“确定”。
(8)执行查询:可以在“查询”菜单中选“运行查询”命令,也可以用命令方式来执行,如执行本例的命令是:DO ZGXB.QPR。
2.单表分组统计查询:为数据表ZGDA.DBF建立一个查询文件ZGXBF.QPR,按照性别分组,并求小组平均年龄、小组人数,查询结果按照小组人数降序显示。
操作步骤:
(1) 单击“文件”菜单中的“新建”菜单项,在弹出的窗口中选择文件类别为“查询”。
(2) 单击“新建文件”按钮,打开了“查询设计器”窗口。
(3)在弹出的“打开”对话框,找到要查询的表文件zgda,单击“确定”按钮。
(4)选择“字段”选项卡,根据要求选择要显示的字段,单击“添加”,选定的字段出现在“选定字段”栏中。
(5)在“函数和表达式”栏中,输入分组计算表达式AVG(年龄),单击“添加”。
(6)在“函数和表达式”栏中,输入分组计算表达式COUNT(*),单击“添加”。
(6)选择“分组依据”选项卡,选择“性别”字段,单击“添加”。
(7)选择“排序依据”选项卡,选择“COUNT(*)”为排序字段,单击“添加”按钮,选择排序选项为“降序”。
(8)保存查询文件。单击“文件”菜单中的“保存”菜单项,输入查询文件名称为ZGXBF.QPR,单击“确定”。
(9)执行查询:在命令窗口中输入:DO ZGDBF.QPR后回车,可以在浏览窗口的看到查询的结果。
(10)设置查询的去向是一个表文件CXB.DBF。回到设计器状态,单击“查询”菜单中的“查询去向”菜单项,在弹出的对话框中选择去向为“表”,在“表名”后面的文本框中输入表名为“CXB”,单击“确定”按钮。
(11) 执行查询:在命令窗口中输入:DO ZGDBF.QPR后回车,就会在当前工作目录下生成表文件CXB.DBF,里面存放查询的结果记录。
3.一对多数据表查询
为职工档案表ZGDA.DBF(一方表)和教师任课表LESSON.DBF(多方表)建立一个查询文件ZGD.QPR,即查询编号为2的职工的姓名、职称、出生日期及该教师所讲授的课程名称、学时信息。
操作步骤:
(1) 单击“文件”菜单中的“新建”菜单项,在弹出的窗口中选择文件类别为“查询”。
(2) 单击“新建文件”按钮,打开了“查询设计器”窗口。
(3) 右键单击“查询设计器”窗口,选择“添加表”菜单项,在数据环境中添加表文件ZGDA.DBF和教师任课表LESSON.DBF。
(4) 选择“联接”选项卡,选择类型为“内部联接”,并按照公共字段“编号”相等来建立连接。
(5)其他操作与前面的例子相同,此处略。
4.创建本地视图操作
单表视图:为数据表ZGDA.DBF建立一个视图名称为view1,视图显示年龄大于40的女职工的全部信息、按照年龄降序来显示视图记录。
操作步骤:
(1)打开已经建好的数据库:如:教工.dbc,进入数据库设计器。
(2)单击“数据库”菜单中的“新建本地视图”菜单项,在弹出的窗口中选择“新建视图”按钮。
(3)在弹出的“添加表和视图”对话框中添加表文件ZGDA.DBF后,单击“关闭”按钮关闭此对话框。
(4)视图设计器各个选项卡的操作方法与查询设计器基本相同,此处省略相同的步骤。
(5)选择“更新条件”选项卡,将“编号”字段设置为主关键字,在“钥匙”图标下面的编号字段的前面单击鼠标将选中标记设置为选中状态,在同样的方法设置要允许修改的字段,在“铅笔”图标下其他字段的前面单击鼠标将选中标记设置为选中状态。
(6)设置“发送SQL更新”选项为选中状态。
(7)单击“文件”菜单中的“保存”菜单项,在弹出的保存窗口中输入视图名称为view1,单击“确定”。
注:
(1)以浏览方式打开视图名称为view1和表文件ZGDA.DBF,在视图中修改某一记录的编号数据后,将指针(光标)移动到其他记录上,观察源表文件ZGDA.DBF中的数据变化。
(2)视图并不形成对应的磁盘文件,视图的定义存储在数据库文件中,因此建立视图前一定要打开一个数据库,否则不能建立视图。
【实训8】数组
实训目的:
1.掌握数组的定义、引用、赋值。
2.掌握二维数组的一维访问方式。
3.掌握用数组求最值的算法。
实训内容:
1.定义数组命令:declare或者dimension命令
dimension ar (10) &&定义一个一维数组ar,该数组有10个元素,数组下标从1开始。 display memory &&已定义一个变量,数组不管有多少个元素,显示内存变量时只算一个变量,但每一个数组元素都可以象一个普通内存变量一样来使用。
dimension ab[3,2] &&定义一个二维数组ab,该数组有6个元素。
display memory &&用户定义的数组但没有赋值,系统自动初始化其值为逻辑假.F 注:二维数组在内存中以行主序方式存放,即先顺序存储第1行的数据元素,再顺序存储其他行的数据元素,可以用一维数组(下标为其排列序号)的方式来访问,即:
ab[1,1]可以看作是ab[1]、ab[1,2] =ab[2] , ab[2,1]= , ab[2,2]= ab[4] ,ab[3,2]= ab[6]
2.数组初始化
ar[1]=1 && 给数组元素ar[1] 赋值为1
ab[1,2]=3 && 给数组元素ab[1,2] 赋值为3
注:每一个数组元素都可以象一个普通内存变量一样来进行赋值。
ar=100 && 给数组ar的所有元素赋值为100
display memory &&看到ar数组的所有元素值为100
ar[1]=“OK” &&给数组元素ar[1] 赋值为OK字符串
?A &&OK 输出数组元素ar[1]的值。
注:数组名在赋值表达式中,代表所有的数组元素;在输出语句中,数组名代表该数组的第一个元素。
3.调试程序MX.PRG,程序功能是从键盘输入10个数保存到数组N中,并输出10个数中的最大值。
Dimesion N[10]
For k=1 to 10
Input “一个数:” to N[k]
Endfor &&用循环初始化数组N
Max=N[1] &&假设数组第一个元素的值最大。
For k=2 to 10
If max
Endif
Endfor &&数组比较完毕,max变量中保存该数组的最大值 ? “本数组的最大值是:”,max &&输出该数组的最大值
注:求最大值算法的思想是先假设第一个元素的值是最大的,并保存到max变量中,然后将max变量与数组后面的元素值依次比较,若遇到的更大的元素值,则将其保存在max变量中,直到所有元素都比较完毕,max变量中保存的就是数组中的最大值。
4.改写上面的最大值程序MX.PRG,使其功能变为求数组中元素的最小值。
将MX.PRG中的max用min替代后,只要改写下面的部分,其他语句不变。
If min>N[k] &&依次与后面的元素比较 &&将遇到的较小元素值保存在min变量中
Endif
5.求ZGDA.DBF表中年龄的最大值,并输出年龄最大的那一条记录。
Use ZGDA
MAX=年龄 skip
If MAX>年龄
MAX=年龄 &&将遇到的较大年龄值保存在max变量中
&&保存记录号
Endif
Enddo
? “年龄的最大值是”,MAX
【实训9】子程序、过程与自定义函数
实训目的:
1.掌握子程序、过程的定义及调用方法。
2.掌握自定义函数的定义及调用方法。
3.理解变量的作用域。
实训内容:
1.不带参数的子程序
(1)建立子程序HELLO.PRG,在命令窗口中输入命令modify comm. Hello后回车,在出现的文本编辑器窗口中输入如下代码。
messagebox("您好,VFP!") &&显示提示窗口
return &&返回主程序
(2)建立主程序MAIN.PRG,在命令窗口中输入命令modify comm. main后回车,在出现的文本编辑器窗口中输入如下代码。
do hello.prg &&调用子程序hello.prg
(3)在命令窗口中输入命令:do main.prg后回车,执行主程序MAIN.PRG,观察执行情况。 do main &&执行主程序
2.带参数的子程序调用
(1) 在命令窗口中输入命令modify comm. SUBJC后回车,建立子程序SUBJC.PRG,功能是求x的阶乘,代码如下:
Parameters x , y && 定义形式参数
N=1
Y=1
Do while n
Y=Y*n &&累计乘积的表达式,结果保存y变量中 N=N+1
Enddo
return &&返回主程序
(2)建立主程序JCMAIN.PRG(方法同上,不再赘述),输入程序代码如下:
S=0
Do SUBJC with 5, S && 调用子程序,并传递参数5,S
? S &&120 5的阶乘值
注意:默认情况下,DO ... WITH 语句以引用传递方式向过程传递变量和数组。当一个值在被调用过程中更改时,新值传递回调用程序中相关的变量或数组。
(3)在命令窗口中执行主程序JCMAIN.PRG,观察执行情况。
do JCMAIN.PRG &&执行主程序
3.带参数的过程文件调用
(1)建立过程文件SP1.PRG,功能是求x的阶乘,代码如下:
Procedure JC &&在过程文件中定义一个名为JC的过程
Parameters x , y && 定义形式参数
N=1
Y=1
Do while N
Y=Y*N N=N+1
Enddo
Return &&返回主程序
注:多个过程可以放在一个过程文件中,用过程名来区分。实际上,过程和子程序是一回事,只不过把多个子程序保存在一个PRG文件中,在PRG文件中每个子程序(过程)用Procedure 语句单独定义罢了,而把这个PRG文件成为过程文件。
(2)建立主程序SPMAIN.PRG,代码如下: &&打开过程文件SP1.PRG
S=0
Do JC with 5,S &&调用过程文件中的JC过程
? S
Set procedure to &&关闭过程文件
(3)在命令窗口中输入DO SPMAIN来执行主程序SPMAIN.PRG,观察执行情况。
4.自定义求圆的面积的函数,程序文件名为:MYFUN.PRG,代码如下:
input "请输入半径" to R
MJ=area(R) &&调用自定义函数AREA,返回值保存到MJ中。
? "半径为"+str(R)+"的圆面积为",MJ &&输出圆的面积
****下面的代码是自定义函数AREA****
FUNCTION AREA &&定义函数名为AREA
Parameters X &&定义形式参数
&&计算面积
RETURN S &&返回S的值
注:上述例子,自定义的函数代码与主程序在一个程序文件中;当然也可以把自定义的函数代码放到过程/子程序文件中,用时要先打开过程文件,即可调用。
5.变量的作用域
全局变量:用PUBLIC命令定义,作用范围为所有的程序,直到用RELEASE命令将其释放掉。
私有变量:用PRIVATE命令定义,作用范围为定义它的本级和各级子程序,一旦本级程序结束,私有变量即被释放掉。
局部变量:用LOCAL命令定义,作用范围为定义它的程序,不能被上级程序和下级子程序所调用,一旦定义它的程序执行结束,局部变量即被释放掉。
(1)分析下面的主程序的执行结果。
运行结果为:13
注:图中1,2,3,4为程序执行的流程顺序。
(2)分析下面的主程序的执行结果。
运行结果为:12
注:
①图中1,2,3为程序流程顺序。
②程序中未加说明的变量是私有变量(private),其作用范围是本级程序及其各级子程序,命令窗口中定义的变量是全局变量。
(3)分析下面的主程序的执行结果
运行结果为:X= 4 Y= 5 Z=9
(4)分析下面的主程序的执行结果
运行结果为:X= 1 Y= 2 Z=9
注意:private命令可将上级程序中创建的与私有变量同名的变量隐藏起来,可以在当前程序中操作这些私有变量,而不影响被隐藏的变量的值。一旦包含 private 命令的程序执行完毕,所有被隐藏起来的内存变量就恢复原值,可继续使用。
【实训10】报表设计
实训目的:
1.掌握报表向导和标签向导使用方法,。
2.学会使用报表设计器来建立、修改报表。
3.掌握用命令的方式来预览报表和标签文件。
实训内容]:
1.用报表向导为ZGDA.DBF表创建报表文件ZGBB.FRX
操作步骤:
(1)单击“文件”菜单中的“新建”菜单项,在弹出的窗口中选择文件类别为“报表”。
(2)点击“向导”按钮,在弹出的对话框中选取“报表向导”,单击“确定”按钮,启动了报表向导程序。
(3)字段选取:首先要打开确定报表的数据源。单击“数据库和表”右边的有省略号标记的“打开”按钮,在打开的窗口中选择ZGDA.DBF表后,单击“确定”按钮。并根据需要选择ZGDA.DBF表中的部分或全部字段,点击“下一步”按钮。
(4)分组记录:不分组,点击“下一步”按钮。
(5)报表样式:选择“账务式”,点击“下一步”按钮。
(6)定义报表布局:设置列数为2,其他选项默认,点击“下一步”按钮。
(7)排序记录:选择“编号”字段,设置排序方式为“升序”,点击“下一步”按钮。
(8)输入该报表的标题,选择“保存报表以备将使用”选项,单击“完成”,输入报表文件名ZGBB.FRX(注意扩展名为FRX),单击“确定”按钮即可。
2.用快速报表为ZGDA.DBF表创建报表文件ZGB1.FRX
(1)单击“文件”菜单中的“新建”菜单项,在弹出的窗口中选择文件类别为“报表”,点击“新文件”按钮来打开“报表设计器”。
(2)单击“报表”菜单/“快速报表”选项,出现“打开”对话框,选择报表的数据源为:ZGDA.DBF表,单击“确定”按钮,出现“快速报表”对话框。
(3)选择字段布局为“列布局”,选中“标题”等复选框。
(4)选择字段:设置了报表布局后,单击“字段”按钮,进入“字段选择器”对话框,为报表选择编号、姓名、年龄、职称等字段。
(5)单击“确定”按钮,返回“报表设计器”。
(6)预览报表:单击“显示”菜单中的“预览”菜单项来预览报表。
(7)单击“文件”菜单下的“保存”命令,保存报表文件名为ZGB1.FRX。
3.使用报表设计器创建与修改报表
(1)单击“文件”菜单中的“新建”菜单项,在弹出的窗口中选择文件类别为“报表”,点击“新文件”按钮来打开“报表设计器”。
(2)向报表添加数据源:单击“报表设计器”工具栏的“数据环境”按钮(或者“显示”菜单下的“数据环境”菜单项),出现“数据环境设计器”对话框,在其中单击“右键”,选择“添加”,将ZGDA.DBF表添加到“数据环境”。
(3) 在“数据环境设计器”中拖动ZGDA表中要选取的字段到“报表设计器”的细节带区,系统会自动生成相应的控件来显示该字段。
(4)合理安排报表布局:可以手动调整所选字段的排列次序、位置和显示的字体格式等。 注:通常情况下,先采用快速报表或报表向导生成报表的大致布局,再利用报表设计器来做进一步的修改,完善报表。
4.预览报表
(1)菜单方式:在报表设计器状态下,单击“报表”菜单中的“预览”菜单项即可预览正在编辑的报表。
(2)命令方式: PREVIEW &&预览报表文件ZGBB.FRX。
5.利用向导为ZGDA.DBF表建立标签文件BQ1.LBX
(1) 单击“文件”菜单中的“新建”菜单项,在弹出的窗口中选择文件类别为“标签”,点击“向导”按钮,即可启动“标签向导”程序窗口。
(2)在打开的向导窗口中“数据库和表”的位置,选择ZGDA.DBF表为标签的数据源。
(3)根据实际需要选择“标签的类型”,这里选择第一项。
(4)定义布局:在“文本”右端的文本框中可以输入要显示的文本,例如输入:“编号:”,单击有蓝色小三角形的“添加”按钮,把文本添加到“选定字段”下面的列表中;在“可用字段”下面的列表中选择“编号”字段,单击有蓝色小三角形的“添加”按钮,把“编号”字段添加到“选定字段”下面的列表中。
注:用户可以输入换行符号、逗号等分割符来定义标签的布局,其他字段的添中方法与此相同,不再赘述。
(5)排序记录:选择“编号”为排序字段,单击“添加”按钮,并选择排序方式为:升序。
(6)选择“保存标签以备将来使用”选项后,可以单击“预览”按钮,来进行预览,效果如下图所示,单击“完成”输入标签文件名BQ1.LBX,单击“保存”按钮。
标签预览图
(7)在命令窗口中输入“report form bq1.lbx preview”来预览标签文件。
【实训11】菜单设计
实训目的:
1.掌握条形菜单的建立、修改、生成和调用的方法。
2.掌握快捷菜单的建立、修改、生成和调用的方法。
3.掌握菜单设计器的使用方法。
实训内容:
1.快捷菜单的定义
(1)打开快捷菜单设计器:单击“文件”菜单中的“新建”菜单项,在弹出的窗口中选择文件类别为“菜单”,单击“新建文件”按钮。
(2)在弹出的“新建菜单”窗口中选择“快捷菜单”,单击“确定”按钮,启动了“快捷菜单设计器”窗口。
(3)设计快捷菜单中的菜单项,如下图所示。具体方法,单击“插入栏”,在打开的对话框中,选择相应的vfp系统菜单命令项如下图所示,单击“插入”按钮。
(4)单击“文件”菜单下的“保存”命令,保存菜单文件名为KJ.MNX。
(5)在“快捷菜单设计器”状态下,单击“菜单”中的“生成”命令,将快捷菜单文件KJ.MNX生成对应的菜单程序文件,该文件的名称为 KJ.MPR 。
2.快捷菜单的调用
(1)新建一个名称为BD1.scx的表单文件,在该表单中填加一个编辑框控件edit1,保存表单文件。
(2) 双击表单,选择过程为rightclick,在表单的右击RIGHTCLICK事件中,输入下列代码: DO KJ.MPR &&调用快捷菜单
(3)保存表单文件。
(4)在窗口中输入命令:do form bd1,来运行表单bd1,在表单上按下鼠标右键就会弹出快捷菜单,测试快捷菜单的功能。
注:上述快捷菜单的定义与调用是步骤相关的,请按步骤进行。
3.在顶层表单中调用一般菜单
(1)建立菜单
操作步骤如下:
①单击“文件”菜单中的“新建”菜单项,在弹出的窗口中选择文件类别为“菜单”,单击“新建文件”按钮。在弹出的“新建菜单”窗口中选择“菜单”,单击“确定”按钮,启动了“菜单设计器”窗口。
②输入菜单项的相应名称,并选择结果为“子菜单”,表示将来单击该项,会弹出一个下拉子菜单,如下图所示。
③单击“文件调用”项右边的“创建”按钮,来设计“文件调用”的下拉子菜单。此时,“菜单设计器”上的菜单级显示为“文件调用”,表示目前正在设计“文件调用”项的子菜单,如下图所示。
④输入相应的菜单名称,在“结果”列中选择“命令”,如图所示。
注:菜单项的结果为“命令”的含义是当单击该菜单项时,会执行一条VFP命令,要执行的命令在后面的框中输入,如:“bd1表单”项的结果为“命令”,命令代码为:do form bd1。 ⑤选择“菜单级”中内容为“菜单栏”后,单击“日期与时间”菜单项右边的“创建”按钮,来设计该项的下拉子菜单,并根据下图所示为相应的菜单项选择相应的“结果”项。
注:
① 单击“日期”项右边的“创建”,输入日期过程代码如下:
RQ=DATE()
Messagebox(ctod(RQ))
② 退出菜单项的命令是:set sysmenu to default &&恢复VFP的菜单为系统默认菜单。 ③ 结果中的“过程”选项的含义是执行多条命令,而结果中的“命令”选项的功能是执行一条命令。
⑥设置该菜单可被一个顶层表单调用
在“显示”菜单中选择“常规选项”命令,在打开的对话框窗口中,选中“顶层表单”复选框。
⑦单击“文件”菜单下的“保存”命令,保存菜单文件名为Mymenu.mnx。
⑧在“菜单设计器”状态下,单击“菜单”中的“生成”命令,可将Mymenu.mnx文件生成Mymenu.mpr的菜单程序文件。
(2)在顶层表单中调用菜单
①新建一个表单文件DCBD.SCX。
②设置DCBD.SCX为顶层表单,即在表单的属性窗口中将该表单的SHOWWINDOW属性设置为2-作为顶层表单。
③双击表单,选择过程为INIT(或load),在表单的INIT(或load)事件中输入如下代码:.
④在窗口中输入命令:do form DCBD.SCX,来运行表单DCBD,测试菜单项的执行情况。
(3)其他要说明的问题
①给菜单项添加热键,方法是在菜单名的后面用“\
③ 添加菜单项目之间的分割线:只需把菜单项的名字写成:“\-”,其他项采用系统默认值
即可。
【实训12】SQL语言
实训目的:
1.掌握查询语句SQL—SELECT的功能与语法。
2.掌握数据操纵语句SQL—INSERT、SQL—UPDATE、SQL—DELETE的功能与语法。
3.掌握数据定义语句SQL—ALTER的功能与语法。
实训内容:
1、建表(建表后,可用modify structure 修改表结构命令 来看表的结构)
前提条件:create database SQLLX &&建立数据库SQLLX,该数据库是打开的 create table zgda1.dbf ;
(编号 c(6) not null,姓名 c(6),年龄 n(2,0),工资 f(6,2),获奖次数 I,出生日期 d,工作时间 t,婚否 l,简历 m,照片 g)
create table zgda2.dbf (编号 c(6) not null,姓名 c(6),年龄 n(2,0),工资 f(6,2))
create table zgda3.dbf (编号 c(6) not null primary key,姓名 c(6),年龄 n(2,0),工资 f(6,2)) create table zgda3.dbf (编号 c(6),姓名 c(6),年龄 n(2,0) check 年龄>0 error "年龄要大于
0" default 30)
create table zgda3.dbf (编号 c(6),姓名 c(6),年龄 n(2,0) check 年龄>0 error "年龄要大于
0" default 30)
create table zgda4 free (编号 c(6),姓名 c(6),年龄 n(2,0)) &&zgda4是自由表 注意:(表zgda1----zgda4是数据库表,并自动加到当前数据库SQLLX中)
(1) c n f类型需要指定宽度 n f b类型要指定精度
(2)UNIQUE 候选索引 primary key 主索引
2、alter table 修改表结构
alter table zgda3 add column 性别 c(2) check 性别="女" or 性别="男" error "性别只能为男或者女" default "男"
功能:添加性别字段并设置有效性规则,默认值为男。
alter table zgda3 alter column 性别 c(4) default "女" &&无有效性规则,默认值为女
alter table zgda3 alter column 性别 c(4) check 性别="女" or 性别="男" error "性别只能为男或者女" default "女"
alter table zgda3 alter column 性别 drop default &&删除性别字段的
默认值
alter table zgda3 alter column 性别 drop check &&删除性别字段的有效性规则
alter table zgda3 alter column 性别 set check 性别="男" or 性别="女" error "男或女?"
alter table zgda3 alter column 性别 set default "男" &&设置或更改性别字段的默认值
alter table zgda3 drop column 性别 &&删除性别字段 alter table zgda3 rename 姓名 to name &&姓名字段改名为name
alter table zgda3 rename column name to NM
3、drop table zgda4 &&删除自由表zgda4(请用close database把数据库关掉,否则删除不掉)
4、insert into:
open database SQLLX &&请打开数据库SQLLX
create table zgda4.dbf (编号 c(6),姓名 c(6),年龄 n(2,0),出生日期 d,婚否 L)
insert into zgda4(编号,姓名,年龄,出生日期,婚否) values ("990011","张三",35,{^1975-7-25},.t.)
insert into zgda4(编号,姓名,年龄,出生日期,婚否) values("990012","李四",40,{^1966-7-25},.f.)
insert into zgda4(编号,姓名,年龄,出生日期,婚否) values("990013","王五",46,{^1960-7-25},.t.)
5、delete
dele from zgda4 where 年龄>=40 &&用list命令显示记录,可看到2条记录加上了删除标记。
6、update
update zgda4 set 年龄=年龄+1,出生日期=出生日期-1 &&没有where条件,则更新全部记录
update zgda4 set 年龄=年龄+1,出生日期=出生日期-1 where 婚否=.t. &&更新已婚记录
7、select查询(运行下面的语句,说出其含义)
select * from zgda
select all 职称 from zgda &&all可省略,查出所有记录的职称字段值
select distinct 职称 from zgda &&查出所有记录的职称字段值,去掉重复行。 select 姓名,性别,年龄,职称 from zgda
select top 3 * from zgda order by 编号 desc &&查编号最大的前3条记录 select top 50 percent * from zgda order by 年龄 desc &&查年龄最大的前一半记录
select 姓名,性别,年龄,职称 from zgda where 性别="男"号 && 等同于:男"
select 姓名,性别,年龄,职称 from zgda where 职称="讲师" order by 性别 asc,年龄 desc select 姓名,性别,年龄,职称 from zgda where 年龄 between 40 and 50 &&包括40和50 select 姓名,性别,年龄,职称 from zgda where 年龄 >= 40 and 年龄
select 姓名,性别,年龄,职称 from zgda where 年龄 not between 40 and 50 &&年龄不在40和50范围内
select * from zgda where 姓名 like "刘%" &&查询所有姓刘的记录 select * from zgda where 姓名 like "王_" &&查询所有姓王且姓名只有两个字符的记录 select 姓名,性别,年龄,职称 from zgda where 姓名 not like "王%" &&查询所有不姓王的记录
where后面的特殊运算符(in ;between and ;like)
select 姓名,性别,年龄,职称 from zgda where 姓名 in ( "刘","王") &&查姓刘和姓王的记录,与下一语句等价。
select 姓名,性别,年龄,工资,职称 from zgda where 姓名 ="刘" or 姓名 ="王"
select 姓名,性别,年龄,职称 from zgda where 职称 in ("讲师","副教授")
select 姓名,性别,年龄,职称 from zgda where 职称="讲师" or 职称="副教授"
注:in 运算符:判断表达式的值是否等于指定列表中几个值中的一个
select 职称,avg(年龄) from zgda group by 职称 &&查每种职称的职工平均年龄
select 职称,avg(年龄) 平均年龄from zgda group by 职称 &&同时给表达式avg(年龄) 命名为 平均年龄
***将上面的两条语句中的avg换成sum后,再运行,看功能是什么?
select 职称,avg(年龄) from zgda group by 职称 having avg(年龄)>40 &&平均年龄>40的分组会显示
select max(年龄) from zgda &&查表中最大年龄值,最小用min
select职称,max(年龄) from zgda group by 职称 &&查每种职称的职工最大年龄,最小用min
select count(*) 职工人数 from zgda &&查表中人数,职工人数为自定义别名 select count(性别) from zgda &&查性别字段值的行数(计重复值) 结果为:8
select count(distinct 性别) from zgda &&查性别字段值的行数(不计重复值)结果为:2
select 性别,count(*) 职工人数 from zgda group by 性别 &&查男女职工人数,职工人数
指导老师:余敦辉
2009-3-2
VFP程序设计基础实验指导书
前 言
学习数据库程序设计,上机实训是十分重要的环节。为了方便读者上机练习,本实训指导书设计了12个实训。这些实训和课堂教学紧密配合,通过有针对性的上机实训,可以更好地熟悉 Visual FoxPro的功能,掌握 Visual FoxPro程序设计的方法,并培养一定的应用开发能力。建议每个实训安排2机时左右,也可以根据实际情况从每个实训中选择部分内容上机练习。
为了达到理想的实训效果,请务必做到以下几点:
1想好编程的思路,做到胸有成竹,提高上机效率。
2、程序的执行结果以及各种屏幕信息的含义、出现的原因并提出解决办法。
3书要求填写的内容。
程序设计和应用开发能力的提高需要不断的上机实践和长期的经验积累,在上机过程中会碰到各种各样的问题,分析问题和解决问题的过程就是经验积累的过程。只要按照上面3点要求去做,在学完本课程后就一定会有很大的收获,计算机应用能力就会有很大提高。
【实训1】熟悉VFP环境
实训目的:
1.熟悉VFP系统的操作环境。
2.掌握VFP系统的启动和退出方法。
3.掌握MSDN帮助文件的使用方法。
实训内容:
1.VFP系统的启动
(1)点击“开始”菜单中的“程序”选项。
(2)找到Visual FoxPro 6.0的快捷方式来启动VFP。
注:Visual FoxPro 6.0的可执行文件为vfp6.exe,其所在目录随安装的位置的不同而不同,一般为:“C:\Program Files\Microsoft Visual Studio\Vfp98\VFP6.EXE"。
2.在桌面上建立vfp6.exe的快捷方式
(1) 首先找到VFP的可执行文件vfp6.exe,依次打开C:\Program Files\Microsoft Visual Studio\Vfp98文件夹,找到VFP的可执行文件为vfp6.exe。(根据具体实训环境的不同,该文件的位置可能不同)
(2)选中vfp6.exe文件。
(3)右键拖动vfp6.exe文件到桌面空白处,在弹出的快捷菜单中选择“在当前位置创建快捷方式”菜单项,即可在桌面上建立vfp6.exe的快捷方式。双击刚刚建好的快捷方式也可以启动vfp环境。
3.退出VFP(以下方法并列)
方法1:在“命令”窗口中,输入命令“quit”。
方法2:直接按Alt+F4。
方法3:在“文件”菜单中,选择“退出”命令。
方法4:双击主窗口左上角的控制菜单框。
方法5:在主窗口控制菜单中,选择“关闭”。
4.认识VFP界面
(1) 在vfp主窗口中依次找到标题栏、菜单栏、工具栏、状态栏的位置。
(2) “常用”工具栏的关闭。
①单击“显示”菜单中的“工具栏”菜单项。
②在弹出的窗口中,找到“工具栏”列表框中的“常用”项,鼠标单击去掉“常用”工具栏前面的选中标记。
③单击“确定”按钮,即可关闭“常用”工具栏。
(3) “常用”工具栏的显示。
①单击“显示”菜单中的“工具栏”菜单项。
②在弹出的窗口中,找到“工具栏”列表框中的“常用”项,鼠标单击选中“常用”工具栏前面的选中标记。
③单击“确定”按钮,即可显示“常用”工具栏。
注:其他工具栏的显示与关闭与上面的方法相同,请读者自己练习。
(3)命令窗口显示与关闭。
方法1:单击“窗口”菜单中的”命令窗口” 菜单项来显示命令窗口,再次单击“窗口”菜单中的”命令窗口”菜单项可关闭命令窗口。
方法2:CTRL+F2(显示命令窗口)/ CTRL+F4(关闭命令窗口)
5.利用MSDN帮助文件查找要解决的问题
(1)进入帮助系统有三种方法。
方法1:在命令窗口中,输入“help”命令后,回车。
方法2:调用“帮助”菜单。
方法3:在VFP窗口中的任一位置选中需要获得帮助的内容,按“F1”功能键。
(2)选择“活动子集”为“Visual Foxpro文档”,保证用户查看到的是关于vfp的帮助内容。
(3)选中“搜索”标签,输入要搜索的关键字。例如输入“系统容量”四个字,单击“列出主题”按钮列出符合条件的主题。
(4)用鼠标双击找到的主题,在右边的窗口部分即可看到要查找主题的相关内容。(当然用户也可以在“目录”选项卡下以目录的形式来浏览vfp的帮助内容。)
注:帮助文件的位置:通常情况下,VFP6的MSDN帮助文件位置在c:\program files\Microsoft Visual studio\msdn98\98vs\2502,文件名为foxhelp.chm。
(5)请读者找到所在的实训环境下,VFP6的MSDN帮助文件foxhelp.chm的存放位置。
【实训2】项目管理器的基本操作
实训目的:
1.掌握工作目录的设置方法。
2.掌握项目管理器的基本操作。
3.掌握如何建立表文件及备注和通用字段内容的输入方法。
实训内容:
1.设置D:\VFPLX文件夹为工作目录(两种方法)
首先在D盘新建立一个名为VFPLX的文件夹。
方法1:菜单方法
(1)依次单击“工具”菜单中的“选项”菜单项。
(2)单击选中”文件位置”选项卡中的“默认目录”项。
(3) 单击“修改”按钮,在弹出的“更改文件位置”对话框中,选中“使用默认目录”选项。
(4)在“定位默认目录”下面的文本框输入新的工作目录文件夹路径,单击“确定”按钮。例如输入:D:\VFPLX。
方法2: 命令操作的格式为:set default to 目录名
(1)在命令窗口中输入:set default to D:\VFPLX
(2)回车执行上面的命令即可。
注意:要设置为工作目录的文件夹必须已经存在,否则,不能设置成功。在vfp环境下,一旦设置了工作目录后,用户使用VFP工作过程中所产生的文件默认都会存到已经设置好的工作目录下,不会与vfp系统文件混在一起,方便管理与查找。
2.项目管理器的基本操作
(1)建立项目文件
①单击“文件”菜单中的“新建”菜单项,在弹出的窗口中选择文件类别为“项目”。 ②单击“新建文件”按钮。
③在弹出的创建窗口中输入项目文件名。例如输入:XM1(注意项目文件的扩展名为.PJX)。
④ 单击“保存”按钮,便建立了名为XM1的项目文件,同时打开了项目管理器窗口。
(2)建立数据库文件
【实训2】项目管理器的基本操作
实训目的:
1.掌握工作目录的设置方法。 2.掌握项目管理器的基本操作。
3.掌握如何建立表文件及备注和通用字段内容的输入方法。 实训内容:
1.设置D:\VFPLX文件夹为工作目录(两种方法)
首先在D盘新建立一个名为VFPLX的文件夹。 方法1:菜单方法
(1)依次单击“工具”菜单中的“选项”菜单项。 (2)单击选中”文件位置”选项卡中的“默认目录”项。
(3) 单击“修改”按钮,在弹出的“更改文件位置”对话框中,选中“使用默认目录”选项。
(4)在“定位默认目录”下面的文本框输入新的工作目录文件夹路径,单击“确定”按钮。例如输入:D:\VFPLX。
方法2: 命令操作的格式为:set default to 目录名 (1)在命令窗口中输入:set default to D:\VFPLX (2)回车执行上面的命令即可。
注意:要设置为工作目录的文件夹必须已经存在,否则,不能设置成功。在vfp环境下,一旦设置了工作目录后,用户使用VFP工作过程中所产生的文件默认都会存到已经设置好的工作目录下,不会与vfp系统文件混在一起,方便管理与查找。 2.项目管理器的基本操作 (1)建立项目文件
①单击“文件”菜单中的“新建”菜单项,在弹出的窗口中选择文件类别为“项目”。 ②单击“新建文件”按钮。
③在弹出的创建窗口中输入项目文件名。例如输入:XM1(注意项目文件的扩展名为.PJX)。
④ 单击“保存”按钮,便建立了名为XM1的项目文件,同时打开了项目管理器窗口。 (2)建立数据库文件
①在项目管理器中,单击选中“数据”选项卡下面的“数据库”类别。 ②单击“新建”按钮,单击“新建数据库”按钮。
③输入文件名:如“教工”(注意数据库文件的扩展名为.dbc)。
④单击“保存”按钮,便建立了名为“教工”的数据库,同时打开了数据库设计器窗口。 ⑤单击数据库设计器窗口右上角的“x”形图标按钮来关闭设计器。 (3)关闭项目文件
单击项目管理器右上角的“x”(关闭按钮)。 (4)打开项目文件。
①单击“文件”菜单中的“打开”菜单项。
选择文件类型为“项目”,选中要打开的项目文件XM1.PJX,单击“确定”。 (5)建立表文件
①单击“数据库”左边的“+”,就会列出刚刚建好的“教工”数据库。 ②单击“教工”左边的“+”,选中“表”。(选自由表,可建立自由表) ③单击“新建”/单击“新建表”按钮(此时建立的是数据库表)。 ④输入文件名:如“zgda”(注意表文件的扩展名为.dbf)。 ⑤单击“保存”按钮,便打开了表设计器窗口。 ⑥输入表的结构(如下表所示)后,单击“确定”按钮。
⑦
1.备注字段的输入方法:双击相应记录的备注字段(简历),打开备注字段的输入窗口,既可输入文本内容。 2.通用字段的输入方法:
(1)双击相应记录的通用字段(照片字段),打开通用字段的输入窗口。 (2)单击“编辑”菜单中的“插入对象”命令。
(3)选择“对象类型”为“Microsoft Word 图片”,即可打开Word程序。 (4)在Word程序依次单击插入/图片/剪贴画/选择一个剪贴画插入。
(5)关闭Word程序,回到vfp,即可看到插入的图片,关闭通用字段的输入窗口。 (6)已经插入内容的备注字段和通用字段的外表分别显示为Memo和Gen,第一个字母大写;没有插入内容的备注字段和通用字段的外表分别显示为memo和gen。
小结:建立表文件的过程分2步。首先建立表结构,即定义表的列数及每一列的数据类型、宽度等;再输入记录信息,即决定表有多少行的数据。 (6)修改表文件的结构
① 在项目管理器中,选中zgda.dbf表。
② 单击“修改”按钮,即可打开表设计器,对表的结构进行修改。(可增加、插入、
删除字段、改变字段的位置)
③ 在表设计器的字段选项卡上的字段列表中最后一个字段后面单击鼠标来增加一个
备注型字段,输入字段名为“备注”,选择字段类型为“备注型”。
④ 删除“工作时间”字段:选中“工作时间”字段,单击“删除”按钮。 ⑤ 改变字段的位置(顺序):拖动字段名前的移动按钮到目标位置松开鼠标即可。 注:可以在命令窗口中输入:modify structure命令,来修改表文件的结构,但必须先打开zgda表。 (7)浏览表的内容(记录)
①在项目管理器中,选中zgda.dbf表。
②单击“浏览”按钮,即可打开浏览窗口对表的记录进行修改。 (8)移去一个(表)文件
①在项目管理器中,选中要移去:如zgda.dbf表。
②单击“移去”按钮,单击“移去”按钮,仅仅是将表从项目管理器中移去,不删除该表文件;(单击“删除”按钮,是将表从项目管理器中移去,同时删除该表文件)。 注:如果是数据库表,移去后该表变为自由表。 (9)在项目中添加已有的文件
①在项目管理器中,选中要添加的文件类型:如选中“自由表”类别。 ②单击“添加”按钮,选择要添加的表文件,如:刚刚移去的zgda.dbf ③单击“确定”,即可添加到项目中。
(10)项目管理器展开与折叠、选项卡拖离和顶层显示操作
①展开与折叠:单击“其他”选项卡右边的“向上箭头”图标,即可折叠项目管理器窗口,同时“向上箭头”图标变成“向下箭头”图标;单击“其他”选项卡右边的“向下箭头”图标,即可展开项目管理器窗口,
②选项卡的拖离:在“折叠”状态下,拖动相应的“选项卡”到新的位置松开鼠标即可。 ③选项卡的顶层显示:单击拖离后的选项卡上的“图钉”图标即可使该选项卡变成“顶层显示”状态,不被其他的“选项卡”所遮盖。
【实训3】数据类型与常用函数的用法
实训目的:
1.熟练掌握各种数据类型常量的表示方法。 2.熟练掌握常用函数的用法。 相关知识:
1.常量的表示方法
数值型(N):直接由数字或+、-、小数点构成,无定界符号。 字符型(C):
(1)由字符、汉字组成,需加定界符(单引号、双引号、中括号)。 (2)如’沈阳’、”沈阳”、[沈阳]。
(3)同一定界符不能嵌套,如:“AB”CD””,但 ‘AB”CD”’是合法的。 日期型(D):用{}定界。如:{^2005-08-30}或CTOD(“01/08/30”)。 日期时间型(T):用{}定界。如:{^2005-08-30 11:15:30 A}
逻辑型(L):用.定界。如用.t.或.Y.表示逻辑真, 用.F.或.N.表示逻辑假。 货币型(Y):用$符号开头,后跟数字。如:$90。 2.函数的学习要点
(1)函数名是什么?
(2)该函数有几个参数、参数的数据类型是什么? (3)该函数的功能是什么? (4)返回值的数据类型是什么?
对于任何的一个函数,只要注意以上4点,应用起来就不成问题!
实训内容:在窗口中输入下列函数表达式,回车运行后分析运行结果,具体练习过程中请查阅帮助文件以了解下述函数的具体用法。
1.sign( ) 函数功能:当指定数值表达式的值为正、负或 0 时,分别返回 1、-1 或 0 ? sign(0) &&0 ? sign(-8)
&&-1
2.平方根函数sqrt():返回指定数值表达式的平方根 ? sqrt(9) &&3 (参数不能为负数) 3.圆周率函数pi():返回圆周率常数
? pi() &&3.14
set decimals to 4 &&指定数值型数据显示的小数位数为4位,系统默认为2位 ? pi() && 3.1416
4.取整函数int()、floor()、ceiling()
? int(12.56) &&12
? int(-12.56)
? int(.56) && -12 &&0 注:int()函数返回值为参数的整数部分。 ? floor(-4.5) && -5
? floor(3.5) &&3
注:floor()函数返回值为小于或者等于参数值的最大的整数。
? ceiling(-4.5) &&-4
? ceiling(3.5) &&4
注:ceiling()函数返回值为大于或者等于参数值的最小的整数。
5.四舍五入函数Round()
? Round(7556.5678,2) &&7556.57
? Round(7556.5678,0) &&7557
? Round(7556.81,-2) &&7600
? Round(7556.5678,-1) &&7560
注:第二个参数为负数时,表示对相应的整数位进行四舍五入
6.最值函数max()、min()
? max(10,20,30,25) &&30
? max(10,20) &&20
? max("a","ab") &&ab
? max($10,$20) &&$20
? max({^2005-4-16},{^2004-4-16}) &
注:参数至少有二个,参数可以是字符型、数值型、货币型、日期型;将上面的max改写成min后运行并分析运行结果。
7.求字符串长度函数len()
? len("abcde") &&5
? len("*") &&1 *为空格字符
? len("中国") &&4 一个汉字占2个宽度
? len("") &&0 空字符串长度为0
8.大小写转换函数
? lower("AbCd12OK")
? upper("AbCd12OK") &&abcd12ok &&ABCD12OK
注:只转换字符串中的大小写,其他字符不变。
9.空格字符生成函数
? "a"+space(3)+"b" &&a***b *为空格字符
? len(space(3)+space(2))
? len(space(3)-space(2))
10.删除空格字符函数
? trim("abcd***")+"ef" &&abcdef *为空格字符
? trim("abc*d*****")+"ef" &&abc*def *为空格字符
? ltrim("*ab*")+"ef" &&ab*ef *为空格字符
? alltrim("*ab*")+"ef" &&abef *为空格字符
11.取子串函数
? left("abcdef",2) &&ab
? left("abcdef",100) && abcdef
? right("abcdef",3) &&def
? substr("abcdef",2,3) &&bcd
? substr("abcdef",3) &&cdef
? substr("中华人民共和国",5,4) &&人民
12.occurs()函数
? occurs("ab","cabkabk") &&2 串ab在串cabkabk中出现了2次 ? occurs("ab","ckk") &&0 串ab在串ckk中出现了0次
13、at()函数
? at("ab","ccabkabk",1) &&3 串ab在串cabkabk中第1次出现的起始位置是3 ? at("ab","ccabkabk",2) &&6 串ab在串cabkabk中第1次出现的起始位置是6 &&5 +为字符连接运算符 &&5 -为字符连接运算符
14.子串替换函数
? stuff("abcdef",2,4,"ok") &&abokef 替换串abcdef第2个位置开始的4个字符,用串ok来替换
? stuff("abcdef",2,0,"ok") &&abokcdef 相当于插入ok
? stuff("abcdef",2,4,"") &&af 相当于删除bcde
15.日期函数
? date() &&
set century on &&
? date()
set date to ansi &&
? date()
? time()
? datetime()
? year({^2004-04-16})
? month({^2004-04-16})
? day({^2004-04-16})
? hour(datetime())
? minute(datetime())
? sec(datetime()) &&
16.转换函数
? str(123.5678,8,2) &&**123.57 *
? str(123.5678,6,3) &&123.57
? val("123.45")+100 &&223.45
? val("12a3.45") &&12
? val("a1212a3.45") &&0
set date to usa &&
? ctod("04-16-05") &
? ctod("04-16-05")+1 &
? dtoc(date()) &&返回系统日期 用4位数字显示年份 设置日期的显示格式为ansi &&以字符串形式返回系统当前时间 &&返回系统日期和时间 &&2004 返回日期中的年份数值 &&4 返回日期中的月份数值 &&16 &&分别显示当前系统时间的小时数 &&分别显示当前系统时间的分钟数 分别显示当前系统时间的秒数 为空格 第1个字符不是数字也不是+-号,返回0 设置日期的显示格式为美国日期格式 将系统日期转换为字符格式
17.宏替换函数
x="123"
? &x+100 && 223 &&相当于? 123+100
? x+"100" && 123100
18.iif()函数
x=100
? iif(x>100,x-50,x+50) &&150
? iif(x
19.数据类型测试函数type()、vartype()
? type("123") &&N
? type("04/06/09") &&N
? type("time()") &&C
? vartype(123) &&N
? vartype(“123”) &&C
? vartype($123) &&Y
? vartype(Datetime()) &&T
? vartype({^2005-04-19}) &&D
? vartype(3>5) &&L
思考题:如何用IIF()函数实现SIGN()的功能?
(提示:IIF(X>0,1,IIF( x=0 ,0,-1)))
20.测试函数bof()、eof()、recno()
use zgda
? bof() &&.f.
? recno() &&1 刚刚打开的表,指针指向首记录
skip –1 && 指针向上移动一条记录
? bof() &&.t.
? recno() &&1 表可访问的最小记录号为1
go bottom && 指针指向尾记录
? eof() &&.f.
? recno() &&8 假设表中只有8条记录,指针指向首记录
skip &&指针向下移动一条记录
? eof() &&.t.
? recno() &&9 表可访问的最大记录号为记录总数+1, 假设表中只有8条记录 ? reccount() &&8 假设表中只有8条记录
21.信息窗口函数MessageBox()
格式:MESSAGEBOX(信息文本, [,对话框类型数值 [,标题栏文本]])
例子:MESSAGEBOX(“您好,VFP!”,64,“提示信息”)
【实训4】运算符与表达式
实训目的:
1.掌握各种类型表达式的书写方法。
2.掌握运算符的优先级别。
实训内容:
依次在命令窗口中输入下列表达式,回车运行来输出表达式的值,并分析运行结果。
1.数值表达式
? -3**2 &&9 负号的运算级别高于乘方
? (3+4)/2^2+int(12.5) &&13.75
相关知识:
(1)书写数值表达式,乘号一定不能省略。
(2)数值表达式是由算术运算符和数值型常数、变量、函数组成,运算结果为数值型数据。算术运算符为:+ - * / % ^ ( ) 。
(3)算术运算符的优先次序由高到低依次为:括号、负号、乘方、乘除、模运算(取余)、加减,同级运算从左到右依次进行。
2.字符表达式
? “abc**”+”*cd*” &&abc***cd* *为空格,+号为字符串完全连接运算 ?“abc**”-”*cd*” &&abc*cd*** *为空格,-号为字符串不完全连接运算 相关知识:
(1)字符表达式是由字符运算符和字符型常数(即用定界符括起来的字符串)、变量、函数组成,运算结果是字符型数据或逻辑值。
(2)二种字符串运算符,优先级别相同。
(3)完全连接是指两个字符串合并,即包括空格在内的字符串中所有字符相加。不完全连接运算是将串1尾部的空格移到串2的尾部后,再连接。
3.关系表达式
set collate to “machine” &&设置数据的比较序列为机内码方式
? 8>100 &&.f.
? “8”>”100” &&.t.
? {^2004-5-19}>{^2003-5-19} && .t.
? $80
? “abc”=”ab” &&.t. 系统默认“=”为非精确比较,右边是左边的左子串,则成立。
Set exact on &&设置“=”为精确比较,off为非精确比较
“abc”=”ab” && .f. 精确比较要求两边的字符串必须完全相等才成立。 ? “ok”$”abokd” &&.t. 前一个串“ok”包含在后一个串中,返回逻辑真 相关知识:
(1)关系表达式描述的同类数据的大小比较关系,其结果是一个逻辑值,关系成立结果取真(.T.),不成立结果取假(.F.)。
(2)关系运算符两边的数据类型要一致,只有同类型的数据才能进行比较。
(3)数据比较规律
①数值和货币类型:数越大,其值越大。如:1000>800 $90>$10
②日期数据:未来>历史 如:{^2007-5-19}>{^2007-5-18}
③逻辑常量:逻辑真大于逻辑假,即:.t.>.f.
④字符串比较:依次对应比较两个串的字符,直到比较出结果即停止比较。例如:"abc">"ab", "abc">"aBc"。
⑤字符的比较规律
ASCII字符:比较字符的ASCII码值的大小。总结规律为:空格注意:上述字符的比较规律的前提是必须设置数据的比较序列为机内码方式。设置的命令为:set collate to “machine” 或者依次单击“工具”菜单中的“选项”菜单项,单击“数据”选项卡,设置“排序序列”为“machine”选项即可。
4.逻辑表达式:逻辑运算符的优先级别为:.NOT. .AND. .OR.
? not(10+3)>5 and ”ab”$”ab”+”cde” or 3>=4 &&.f.
? 3>2 AND NOT 5>6 &&
相关知识:
(1)当表达式中出现了多种运算符时,各种运算符的优先顺序由高到低依次为:
算术或字符或日期运算→关系运算→逻辑运算
(2)相同优先级的运算按从左到右的顺序计算
5.日期和日期时间表达式
? {^2005-3-29}-{^2005-3-21} &&8 两日期相差的天数为8天
? {^2005-3-29}+{^2005-3-21} && 两日期表达式相加,属非法表达式
? {^2005-3-25}+3 &
? {^2005-3-25}-3 &(用严格日期格式表示) ? datetime()+30 &&其值为当前时间的30秒后的日期时间
? datetime()-30 &&其值为当前时间的30秒以前的日期时间
? {^2005-5-5 10:10:20 a}-datetime() &&2个日期时间相差的秒的数值
相关知识:
(1)一个日期与一个数值相加,&&日期,表示从当前日期往后数N天。
(2)一个日期与一个数值相减,&&日期,表示从当前日期向前数N天。
(3)两个日期相减,&&数值,表示两日期之间相差的天数。
【实训5】程序结构
实训目的:
(1)理解VFP的2种工作方式:交互方式和程序执行方式。
(2)掌握程序文件的建立、存盘、调用方法和注释语句的使用方法。
(3)熟悉3种程序结构。
(4)会用调试器来分析程序的执行流程。
相关知识:
行首注释语句: NOTE | * 注释内容
功能:在程序文件中指示注释行的开始,注释行不被执行。
行尾注释语句: && 注释内容
功能:在程序文件中代码行的行尾注释,注释内容不被执行。
实训内容:完善下列程序横线处的代码,并调试运行。
1.建立并执行程序p1.prg,程序功能是判断用户输入的整数是否是偶数。
(1)在命令窗口中输入:modify command p1,在弹出的文本编辑器窗口中输入程序代码如下:
input "一个整数" to x if x/2=int(x/2)
? “您输入的是偶数”
else
? “您输入的不是偶数”
endif
(2)按CTRL+W键,存盘。
(3)在命令窗口中输入命令:DO p1后,回车执行该程序。
2.参照上面的例子来建立并执行p2.prg,程序功能:判断用户输入的整数是正数、负数还是零,代码如下:
input "一个整数" to x
if x>0
? "您输入的是一个正数"
else
if x
? "您输入的是一个负数"
else
? "您输入的是零"
endif
endif
3.参照上面的例子来建立并执行p3.prg,程序功能:根据学生的分数情况给出成绩等级,代码如下:
Input "分数 " to x &&从键盘接收来个成绩的数值赋值给X变量
Do case
Case x>=90 and x
? "优秀"
Case x>=80 and x
? "良好"
Case x>=70 and x
? "中等"
Case x>=60 and x
? "及格" otherwise
? "悲惨,您可能不及格阿!"
Endcase
4.建立sum.prg,程序功能是求 1+2+3+„+10的和,代码如下所示
S=0
K=1
DO WHILE K
S=S+K K=K+1
ENDDO
? “1+2+„+10=”,S
注意:S=S+K为求和表达式,在循环中的作用是累加变量K的值,将结果保存到S变量中。 思考:
(1)若s=s+k分别改为s=s+k**2和s=s+1/k,程序的功能又是什么?
(2)请分析下面的程序段的功能是什么,S中累加的是哪些数的和?
S=0
K=1
DO WHILE K
K=K+1
S=S+K
ENDDO
? “S=”,S
操作练习:使用调试器来跟踪该程序的执行情况,具体步骤为:
(1)单击“工具”菜单中的“调试器”菜单项,打开“调试器”窗口。
(2)在调试器窗口中单击“文件”菜单中的“打开”菜单项,打开要跟踪的程序,如sum.prg。
(3)执行“调试”菜单中的“单步跟踪”命令,来跟踪程序的执行,并观察分析“局部”窗口中变量值的变化情况。
5.在程序功能不变的情况下,用FOR循环来改写第4题sum.prg,并对比FOR循环与DO While循环的区别。
参考代码如下,读者也可以自己写出类似的程序。
S=0
For k=1 to 10 step 1
S=S+k
Endfor
? “S=”,S
6.编写程序JC.PRG,程序功能是求5的阶乘(5!=1*2*3*4*5),参考代码如下。
Y=1 &&存放阶乘结果的变量要赋初值为1
FOR X=1 TO 5 step 1 && step 1 可省略 Y=Y*X &&累计变量X的乘积到变量Y中。
ENDFOR
? "5!=",Y
注:请打开调试器,来跟踪该程序的执行情况。
7.参照上一题的程序,编写程序求S=1!+2!+3!+4!+5!的值。
S=0
Y=1
FOR X=1 TO 5
Y=Y*X &&循环执行过程中,Y中存放的分别是1、2、3、4、5的阶乘值 S=S+Y &&累加Y中存放的分别是1、2、3、4、5的阶乘值
ENDFOR
? "S=",S
8.用调试器跟踪下面程序的执行情况,并写出运行结果。
Store 0 to x, y, s1, s2, s3
Do while x
x=x+1
Do case
Case int(x/2)=x/2 &&判断X是偶数
S1=s1+x/2 &&S1中累加的是2、4、6、8、10几个数和的一半
Case mod(x,3)=0 &&判断X是3的倍数
S2=s2+x/3 &&S2中累加的是3、9两个数和的三分之一
Case x%2!=0 &&判断X不是偶数
s3=s3+1 &&S3存放的是非偶数的个数(1、5、7)
Endcase
Enddo
? s1,s2,s3
运行结果: 15.0000 4.0000 3
9.找出100—900之间的“水仙花数”(指一个三位数,其各位数字的立方和等于该数本身,如:153=1+5+3),下面是部分代码,调试该程序。
*****SXH.PRG求水仙花数****
CLEAR 333
FOR K=100 TO 999
A=INT(K/100) &&取百位数字
B=INT((K-100*A)/10) &&取十位数字
C=MOD(K,10) &&取个位数字,看看取十位是否还有别的方法? IF k=A**3+B**3+c**3
? K
ENDIF
ENDFOR
运行结果:153,370,371,407
10.用scan-endscan循环结构来显示zgda表中所有女讲师的记录信息。
USE ZGDA
SCAN for 性别=“女” and 职称=“讲师”
DISPLAY
ENDSCAN
11、用3种循环显示ZGDA.DBF的所有记录,请对比3种循环。
(1)用SCAN循环显示ZGDA.DBF的所有记录:
USE ZGDA
SCAN
DISPLAY
ENDSCAN
(2)用DO循环显示ZGDA.DBF的所有记录:
USE ZGDA
DO WHILE NOT EOF()
DISP skip
ENDDO
(3)用FOR循环显示ZGDA.DBF的所有记录:
USE ZGDA
K=RECCOUNT()
FOR J=1 TO K
DISP skip
ENDFOR
【实训6】数据表的操作
实训目的:
(1)熟练掌握数据表文件的建立、复制、删除和表记录的插入、删除等命令操作。
(2)会用命令方式来给表建立索引。
实训内容:
1.建立zgda表文件
(1)在D盘新建一个文件夹vfpok。
(2) 设置d:\vfpok为工作目录,在命令窗口中输入命令:set defa to d:\vfpok &&可根据需要设置。
(1)在命令窗口中输入命令:create zgda,打开表设计器。
(2)接下来的操作与项目管理器中的建表操作相同。建立表文件的过程分2步:即先建立表结构(规定表的列数及类型等);输入记录(决定表有多少行的数据)
2.表文件的复制
use zgda &&打开表zgda
list && list显示全部记录后,指针指向文件尾
? eof() && .t.
copy to danew.dbf for 性别='男' &&复制打开的表文件zgda 中男生记录到danew.dbf use danew &&打开danew,此时自动关闭前一个表zgda
disp all &&显示全部记录后,指针指向文件尾
3.表结构的复制与修改
use zgda
display structure &&显示表的结构信息
copy stru to dast.dbf fiel 姓名,性别,年龄,职称 &&复制zgda表文件结构到dast.dbf use dast &&打开danew,此时自动关闭前一个表zgda
list structure &&显示表的结构信息
modi stru &&修改结构danew表的结构
4.文件的复制
close all &&关闭所有文件
copy file zgda.dbf to zgdabak.dbf &&复制zgda表文件到zgdabak表文件中
use zgdabak &&显示错误信息,找不到备注文件
copy file zgda.fpt to zgdabak.fpt &&复制备注文件
use zgdabak &&打开文件
list &&显示全部记录后,指针指向文件尾
5.文件改名、删除与文件目录的显示
dir z*.* &&列出所有z开头的文件
dir &&列出所有表文件
rename zgdabak.dbf to zb.dbf &&表文件zgdabak.dbf改名为zb.dbf
use zb.dbf &&显示错误信息,找不到备注文件
rename zgdabak.fpt to zb.fpt &&表备注文件同时要改名,否则,zb.dbf表打不开。 dele file zb.fpt &&删除zb.fpt
use zb.dbf &&显示错误信息,找不到备注文件
dele file zb.dbf &&删除zb.dbf文件
6.表记录的修改
use zgda
edit &&进入全屏幕状态,修改表的记录
change &&进入全屏幕状态,修改表的记录
browse &&进入全屏幕状态,修改表的记录
*用replace命令修改特定的记录
go 4 &&指针定位记录号为4的记录
disp &&显示当前记录信息
repl 年龄 with 年龄+1 &&当前记录的年龄+1,无范围、条件替换的是当前记录 disp &&显示当前记录信息(对比一下)
*用replace命令成批的修改满足条件的多条记录
clear &&清屏
list &&显示所有记录信息
repl all 年龄 with 年龄+1 for 职称="讲师" &&所有讲师记录的年龄+1
list &&显示所有记录信息(对比一下)
7.表记录的插入
go 3 &&指针定位在第3条记录
insert blank &&在第3条记录后,插入一条空记录
list &&显示所有记录信息
go 3
insert blank before &&在第3条记录前,插入一条空记录
list &&显示所有记录信息
8.表记录的删除
go 3
dele &&逻辑删除当前记录
list &&可以看到第3条记录有删除标记*
pack &&物理删除有删除标记的记录
list &&显示所有记录信息,原来的第3号记录已删除了。
注:
(1)请读者将另一条空记录用命令删除
(2)zap等价于先执行dele all后,再执行pack(请复制一个表文件再试这个命令)。
(3)recall、delete 命令后无任何选项时,只对当前记录操作。
9.表的排序
use zgda
sort on 性别 /D to zgxb &&按照性别降序生成排序表zgxb
use zgxb
list
10.建立索引及索引查找
(1)建立单索引
close all &&关闭所有文件
use zgda &&打开表文件zgda
list &&此时表按照物理顺序显示,即按照记录号顺序显示(用户输入记录的顺序) index on 性别 to xb.idx &&按照性别递增的顺序建立单索引文件
list &&此时表按照性别递增的逻辑顺序来显示(刚刚建立的索引文件正起作用) set index to &&关闭索引文件,记录恢复物理顺序显示
list &&记录恢复物理顺序显示
set index to xb.idx &&打开已经建立单索引文件
(2)建立结构复合索引
index on 年龄 desc tag NL &&在结构复合索引文件中按照年龄降序建立索引,NL为其索引标识。
index on 姓名ascending tag xm &&在结构复合索引文件中按照姓名升序建立索引,xm为其索引标识。
set order to tag nl &&设置结构复合索引文件中年龄索引方式起作用 list &&按照年龄降序显示表的记录
find 45 &&查找年龄为45的记录,如果找到,则指针定位该记录,同时found()返回值为真;没有找到,指针指向文件尾,found()返回值为假。
display
set order to xm &&设置结构复合索引文件中姓名索引方式起作用 list &&按照姓名升序显示记录
seek “王” &&查找姓王的记录
(3)建立非结构复合索引
index on 工作时间 desending tag GT of fjg.cdx &&建立非结构复合索引文件fjg.cdx,索引方式为工作时间降序,其索引标识为GT。
11.顺序查找
use zgda
locate for 姓名=”王” &&查找姓王的职工,=为非精确比较,可以实现模糊查询 ? found() &&.t.
display &&显示当前记录
continue &&继续查找下一个满足条件(姓王的职工)的记录
? found() &&.t. 假设表中有2条姓王的记录
display
注意:locate 与 continue 合用,可以实现查询每一个满足条件的记录。
12.过滤记录
USE ZGDA
set filter to 年龄>40 &&指定过滤条件为年龄大于40岁,满足条件的记录可操作 List &&只会显示年龄大于40岁的记录
set filter to &&取消过滤器,此时,所有记录都可操作
set filter to 性别=”女” and 职称=“讲师” &&指定过滤条件为女讲师
13.统计命令
use zgda
sum 年龄 TO X &&求所有记录年龄字段值的和,结果存放到X变量中。 ? X
AVERGE 年龄 TO Y &&求所有记录年龄的平均值,结果存放到Y变量中。 ? Y
clear
count for性别=”女” to k &&查表中女职工记录个数,结果存放到k变量中。 ? k &&8 表中共有8条记录
注:count命令的结果受set dele on的影响
loca for 性别=”女” &&找到第一条女职工记录
delete &&逻辑删除
set delete on &&屏蔽有删除标记的记录
count for性别=”女” to k &&查表中女职工记录个数,结果存放到k变量中。 ? k &&7 有删除标记的记录被屏蔽不计数
? recount() &&8 该函数不受set dele on的影响,表中共有8条记录
14.分类汇总
use zgda
index on性别 to xb &&汇总的关键字段必先索引
total on 性别 to zgnew &&按照性别分类汇总,生成新表文件,表中只有2个记录 use zgnew
count to x &&统计表记录的个数
? x &&2
List &&显示全部的两条记录信息
【实训7】查询与视图
实训目的:
1.理解查询与视图的概念与二者的区别。
2.了解结构化查询语言SQL。
3.熟练掌握用“查询设计器”和“查询向导”两种方法建立查询。
4.熟练掌握建立视图的操作方法。
实训内容:
1.单表查询:为数据表ZGDA.DBF建立一个查询文件ZGXB.QPR,查询年龄大于40的女职工的全部信息、按照年龄降序来显示查询结果。
操作步骤:
(1) 单击“文件”菜单中的“新建”菜单项,在弹出的窗口中选择文件类别为“查询”。
(2) 单击“新建文件”按钮,打开了“查询设计器”窗口。
(3)在弹出的“打开”对话框,找到要查询的表文件zgda,单击“确定”按钮。
(4)选择“字段”选项卡,单击“全部添加”或者根据查询要求选择要显示的字段,单击添加,选定的字段出现在“选定字段”栏中。
(5)设置筛选条件为年龄大于40的女职工。选择“筛选”选项卡,选择“年龄”字段,条件为“>”,在实例中输入40,逻辑条件为”AND”,在下一行中选择“性别”字段,条件为“=”,在实例中输入“女”。
(6)选择“排序依据”选项卡,选择“年龄”为排序字段,单击“添加”按钮,选择排序选项为“升序”。
(7)保存查询文件。单击“文件”菜单中的“保存”菜单项,输入查询文件名称为ZGXB.QPR,单击“确定”。
(8)执行查询:可以在“查询”菜单中选“运行查询”命令,也可以用命令方式来执行,如执行本例的命令是:DO ZGXB.QPR。
2.单表分组统计查询:为数据表ZGDA.DBF建立一个查询文件ZGXBF.QPR,按照性别分组,并求小组平均年龄、小组人数,查询结果按照小组人数降序显示。
操作步骤:
(1) 单击“文件”菜单中的“新建”菜单项,在弹出的窗口中选择文件类别为“查询”。
(2) 单击“新建文件”按钮,打开了“查询设计器”窗口。
(3)在弹出的“打开”对话框,找到要查询的表文件zgda,单击“确定”按钮。
(4)选择“字段”选项卡,根据要求选择要显示的字段,单击“添加”,选定的字段出现在“选定字段”栏中。
(5)在“函数和表达式”栏中,输入分组计算表达式AVG(年龄),单击“添加”。
(6)在“函数和表达式”栏中,输入分组计算表达式COUNT(*),单击“添加”。
(6)选择“分组依据”选项卡,选择“性别”字段,单击“添加”。
(7)选择“排序依据”选项卡,选择“COUNT(*)”为排序字段,单击“添加”按钮,选择排序选项为“降序”。
(8)保存查询文件。单击“文件”菜单中的“保存”菜单项,输入查询文件名称为ZGXBF.QPR,单击“确定”。
(9)执行查询:在命令窗口中输入:DO ZGDBF.QPR后回车,可以在浏览窗口的看到查询的结果。
(10)设置查询的去向是一个表文件CXB.DBF。回到设计器状态,单击“查询”菜单中的“查询去向”菜单项,在弹出的对话框中选择去向为“表”,在“表名”后面的文本框中输入表名为“CXB”,单击“确定”按钮。
(11) 执行查询:在命令窗口中输入:DO ZGDBF.QPR后回车,就会在当前工作目录下生成表文件CXB.DBF,里面存放查询的结果记录。
3.一对多数据表查询
为职工档案表ZGDA.DBF(一方表)和教师任课表LESSON.DBF(多方表)建立一个查询文件ZGD.QPR,即查询编号为2的职工的姓名、职称、出生日期及该教师所讲授的课程名称、学时信息。
操作步骤:
(1) 单击“文件”菜单中的“新建”菜单项,在弹出的窗口中选择文件类别为“查询”。
(2) 单击“新建文件”按钮,打开了“查询设计器”窗口。
(3) 右键单击“查询设计器”窗口,选择“添加表”菜单项,在数据环境中添加表文件ZGDA.DBF和教师任课表LESSON.DBF。
(4) 选择“联接”选项卡,选择类型为“内部联接”,并按照公共字段“编号”相等来建立连接。
(5)其他操作与前面的例子相同,此处略。
4.创建本地视图操作
单表视图:为数据表ZGDA.DBF建立一个视图名称为view1,视图显示年龄大于40的女职工的全部信息、按照年龄降序来显示视图记录。
操作步骤:
(1)打开已经建好的数据库:如:教工.dbc,进入数据库设计器。
(2)单击“数据库”菜单中的“新建本地视图”菜单项,在弹出的窗口中选择“新建视图”按钮。
(3)在弹出的“添加表和视图”对话框中添加表文件ZGDA.DBF后,单击“关闭”按钮关闭此对话框。
(4)视图设计器各个选项卡的操作方法与查询设计器基本相同,此处省略相同的步骤。
(5)选择“更新条件”选项卡,将“编号”字段设置为主关键字,在“钥匙”图标下面的编号字段的前面单击鼠标将选中标记设置为选中状态,在同样的方法设置要允许修改的字段,在“铅笔”图标下其他字段的前面单击鼠标将选中标记设置为选中状态。
(6)设置“发送SQL更新”选项为选中状态。
(7)单击“文件”菜单中的“保存”菜单项,在弹出的保存窗口中输入视图名称为view1,单击“确定”。
注:
(1)以浏览方式打开视图名称为view1和表文件ZGDA.DBF,在视图中修改某一记录的编号数据后,将指针(光标)移动到其他记录上,观察源表文件ZGDA.DBF中的数据变化。
(2)视图并不形成对应的磁盘文件,视图的定义存储在数据库文件中,因此建立视图前一定要打开一个数据库,否则不能建立视图。
【实训8】数组
实训目的:
1.掌握数组的定义、引用、赋值。
2.掌握二维数组的一维访问方式。
3.掌握用数组求最值的算法。
实训内容:
1.定义数组命令:declare或者dimension命令
dimension ar (10) &&定义一个一维数组ar,该数组有10个元素,数组下标从1开始。 display memory &&已定义一个变量,数组不管有多少个元素,显示内存变量时只算一个变量,但每一个数组元素都可以象一个普通内存变量一样来使用。
dimension ab[3,2] &&定义一个二维数组ab,该数组有6个元素。
display memory &&用户定义的数组但没有赋值,系统自动初始化其值为逻辑假.F 注:二维数组在内存中以行主序方式存放,即先顺序存储第1行的数据元素,再顺序存储其他行的数据元素,可以用一维数组(下标为其排列序号)的方式来访问,即:
ab[1,1]可以看作是ab[1]、ab[1,2] =ab[2] , ab[2,1]= , ab[2,2]= ab[4] ,ab[3,2]= ab[6]
2.数组初始化
ar[1]=1 && 给数组元素ar[1] 赋值为1
ab[1,2]=3 && 给数组元素ab[1,2] 赋值为3
注:每一个数组元素都可以象一个普通内存变量一样来进行赋值。
ar=100 && 给数组ar的所有元素赋值为100
display memory &&看到ar数组的所有元素值为100
ar[1]=“OK” &&给数组元素ar[1] 赋值为OK字符串
?A &&OK 输出数组元素ar[1]的值。
注:数组名在赋值表达式中,代表所有的数组元素;在输出语句中,数组名代表该数组的第一个元素。
3.调试程序MX.PRG,程序功能是从键盘输入10个数保存到数组N中,并输出10个数中的最大值。
Dimesion N[10]
For k=1 to 10
Input “一个数:” to N[k]
Endfor &&用循环初始化数组N
Max=N[1] &&假设数组第一个元素的值最大。
For k=2 to 10
If max
Endif
Endfor &&数组比较完毕,max变量中保存该数组的最大值 ? “本数组的最大值是:”,max &&输出该数组的最大值
注:求最大值算法的思想是先假设第一个元素的值是最大的,并保存到max变量中,然后将max变量与数组后面的元素值依次比较,若遇到的更大的元素值,则将其保存在max变量中,直到所有元素都比较完毕,max变量中保存的就是数组中的最大值。
4.改写上面的最大值程序MX.PRG,使其功能变为求数组中元素的最小值。
将MX.PRG中的max用min替代后,只要改写下面的部分,其他语句不变。
If min>N[k] &&依次与后面的元素比较 &&将遇到的较小元素值保存在min变量中
Endif
5.求ZGDA.DBF表中年龄的最大值,并输出年龄最大的那一条记录。
Use ZGDA
MAX=年龄 skip
If MAX>年龄
MAX=年龄 &&将遇到的较大年龄值保存在max变量中
&&保存记录号
Endif
Enddo
? “年龄的最大值是”,MAX
【实训9】子程序、过程与自定义函数
实训目的:
1.掌握子程序、过程的定义及调用方法。
2.掌握自定义函数的定义及调用方法。
3.理解变量的作用域。
实训内容:
1.不带参数的子程序
(1)建立子程序HELLO.PRG,在命令窗口中输入命令modify comm. Hello后回车,在出现的文本编辑器窗口中输入如下代码。
messagebox("您好,VFP!") &&显示提示窗口
return &&返回主程序
(2)建立主程序MAIN.PRG,在命令窗口中输入命令modify comm. main后回车,在出现的文本编辑器窗口中输入如下代码。
do hello.prg &&调用子程序hello.prg
(3)在命令窗口中输入命令:do main.prg后回车,执行主程序MAIN.PRG,观察执行情况。 do main &&执行主程序
2.带参数的子程序调用
(1) 在命令窗口中输入命令modify comm. SUBJC后回车,建立子程序SUBJC.PRG,功能是求x的阶乘,代码如下:
Parameters x , y && 定义形式参数
N=1
Y=1
Do while n
Y=Y*n &&累计乘积的表达式,结果保存y变量中 N=N+1
Enddo
return &&返回主程序
(2)建立主程序JCMAIN.PRG(方法同上,不再赘述),输入程序代码如下:
S=0
Do SUBJC with 5, S && 调用子程序,并传递参数5,S
? S &&120 5的阶乘值
注意:默认情况下,DO ... WITH 语句以引用传递方式向过程传递变量和数组。当一个值在被调用过程中更改时,新值传递回调用程序中相关的变量或数组。
(3)在命令窗口中执行主程序JCMAIN.PRG,观察执行情况。
do JCMAIN.PRG &&执行主程序
3.带参数的过程文件调用
(1)建立过程文件SP1.PRG,功能是求x的阶乘,代码如下:
Procedure JC &&在过程文件中定义一个名为JC的过程
Parameters x , y && 定义形式参数
N=1
Y=1
Do while N
Y=Y*N N=N+1
Enddo
Return &&返回主程序
注:多个过程可以放在一个过程文件中,用过程名来区分。实际上,过程和子程序是一回事,只不过把多个子程序保存在一个PRG文件中,在PRG文件中每个子程序(过程)用Procedure 语句单独定义罢了,而把这个PRG文件成为过程文件。
(2)建立主程序SPMAIN.PRG,代码如下: &&打开过程文件SP1.PRG
S=0
Do JC with 5,S &&调用过程文件中的JC过程
? S
Set procedure to &&关闭过程文件
(3)在命令窗口中输入DO SPMAIN来执行主程序SPMAIN.PRG,观察执行情况。
4.自定义求圆的面积的函数,程序文件名为:MYFUN.PRG,代码如下:
input "请输入半径" to R
MJ=area(R) &&调用自定义函数AREA,返回值保存到MJ中。
? "半径为"+str(R)+"的圆面积为",MJ &&输出圆的面积
****下面的代码是自定义函数AREA****
FUNCTION AREA &&定义函数名为AREA
Parameters X &&定义形式参数
&&计算面积
RETURN S &&返回S的值
注:上述例子,自定义的函数代码与主程序在一个程序文件中;当然也可以把自定义的函数代码放到过程/子程序文件中,用时要先打开过程文件,即可调用。
5.变量的作用域
全局变量:用PUBLIC命令定义,作用范围为所有的程序,直到用RELEASE命令将其释放掉。
私有变量:用PRIVATE命令定义,作用范围为定义它的本级和各级子程序,一旦本级程序结束,私有变量即被释放掉。
局部变量:用LOCAL命令定义,作用范围为定义它的程序,不能被上级程序和下级子程序所调用,一旦定义它的程序执行结束,局部变量即被释放掉。
(1)分析下面的主程序的执行结果。
运行结果为:13
注:图中1,2,3,4为程序执行的流程顺序。
(2)分析下面的主程序的执行结果。
运行结果为:12
注:
①图中1,2,3为程序流程顺序。
②程序中未加说明的变量是私有变量(private),其作用范围是本级程序及其各级子程序,命令窗口中定义的变量是全局变量。
(3)分析下面的主程序的执行结果
运行结果为:X= 4 Y= 5 Z=9
(4)分析下面的主程序的执行结果
运行结果为:X= 1 Y= 2 Z=9
注意:private命令可将上级程序中创建的与私有变量同名的变量隐藏起来,可以在当前程序中操作这些私有变量,而不影响被隐藏的变量的值。一旦包含 private 命令的程序执行完毕,所有被隐藏起来的内存变量就恢复原值,可继续使用。
【实训10】报表设计
实训目的:
1.掌握报表向导和标签向导使用方法,。
2.学会使用报表设计器来建立、修改报表。
3.掌握用命令的方式来预览报表和标签文件。
实训内容]:
1.用报表向导为ZGDA.DBF表创建报表文件ZGBB.FRX
操作步骤:
(1)单击“文件”菜单中的“新建”菜单项,在弹出的窗口中选择文件类别为“报表”。
(2)点击“向导”按钮,在弹出的对话框中选取“报表向导”,单击“确定”按钮,启动了报表向导程序。
(3)字段选取:首先要打开确定报表的数据源。单击“数据库和表”右边的有省略号标记的“打开”按钮,在打开的窗口中选择ZGDA.DBF表后,单击“确定”按钮。并根据需要选择ZGDA.DBF表中的部分或全部字段,点击“下一步”按钮。
(4)分组记录:不分组,点击“下一步”按钮。
(5)报表样式:选择“账务式”,点击“下一步”按钮。
(6)定义报表布局:设置列数为2,其他选项默认,点击“下一步”按钮。
(7)排序记录:选择“编号”字段,设置排序方式为“升序”,点击“下一步”按钮。
(8)输入该报表的标题,选择“保存报表以备将使用”选项,单击“完成”,输入报表文件名ZGBB.FRX(注意扩展名为FRX),单击“确定”按钮即可。
2.用快速报表为ZGDA.DBF表创建报表文件ZGB1.FRX
(1)单击“文件”菜单中的“新建”菜单项,在弹出的窗口中选择文件类别为“报表”,点击“新文件”按钮来打开“报表设计器”。
(2)单击“报表”菜单/“快速报表”选项,出现“打开”对话框,选择报表的数据源为:ZGDA.DBF表,单击“确定”按钮,出现“快速报表”对话框。
(3)选择字段布局为“列布局”,选中“标题”等复选框。
(4)选择字段:设置了报表布局后,单击“字段”按钮,进入“字段选择器”对话框,为报表选择编号、姓名、年龄、职称等字段。
(5)单击“确定”按钮,返回“报表设计器”。
(6)预览报表:单击“显示”菜单中的“预览”菜单项来预览报表。
(7)单击“文件”菜单下的“保存”命令,保存报表文件名为ZGB1.FRX。
3.使用报表设计器创建与修改报表
(1)单击“文件”菜单中的“新建”菜单项,在弹出的窗口中选择文件类别为“报表”,点击“新文件”按钮来打开“报表设计器”。
(2)向报表添加数据源:单击“报表设计器”工具栏的“数据环境”按钮(或者“显示”菜单下的“数据环境”菜单项),出现“数据环境设计器”对话框,在其中单击“右键”,选择“添加”,将ZGDA.DBF表添加到“数据环境”。
(3) 在“数据环境设计器”中拖动ZGDA表中要选取的字段到“报表设计器”的细节带区,系统会自动生成相应的控件来显示该字段。
(4)合理安排报表布局:可以手动调整所选字段的排列次序、位置和显示的字体格式等。 注:通常情况下,先采用快速报表或报表向导生成报表的大致布局,再利用报表设计器来做进一步的修改,完善报表。
4.预览报表
(1)菜单方式:在报表设计器状态下,单击“报表”菜单中的“预览”菜单项即可预览正在编辑的报表。
(2)命令方式: PREVIEW &&预览报表文件ZGBB.FRX。
5.利用向导为ZGDA.DBF表建立标签文件BQ1.LBX
(1) 单击“文件”菜单中的“新建”菜单项,在弹出的窗口中选择文件类别为“标签”,点击“向导”按钮,即可启动“标签向导”程序窗口。
(2)在打开的向导窗口中“数据库和表”的位置,选择ZGDA.DBF表为标签的数据源。
(3)根据实际需要选择“标签的类型”,这里选择第一项。
(4)定义布局:在“文本”右端的文本框中可以输入要显示的文本,例如输入:“编号:”,单击有蓝色小三角形的“添加”按钮,把文本添加到“选定字段”下面的列表中;在“可用字段”下面的列表中选择“编号”字段,单击有蓝色小三角形的“添加”按钮,把“编号”字段添加到“选定字段”下面的列表中。
注:用户可以输入换行符号、逗号等分割符来定义标签的布局,其他字段的添中方法与此相同,不再赘述。
(5)排序记录:选择“编号”为排序字段,单击“添加”按钮,并选择排序方式为:升序。
(6)选择“保存标签以备将来使用”选项后,可以单击“预览”按钮,来进行预览,效果如下图所示,单击“完成”输入标签文件名BQ1.LBX,单击“保存”按钮。
标签预览图
(7)在命令窗口中输入“report form bq1.lbx preview”来预览标签文件。
【实训11】菜单设计
实训目的:
1.掌握条形菜单的建立、修改、生成和调用的方法。
2.掌握快捷菜单的建立、修改、生成和调用的方法。
3.掌握菜单设计器的使用方法。
实训内容:
1.快捷菜单的定义
(1)打开快捷菜单设计器:单击“文件”菜单中的“新建”菜单项,在弹出的窗口中选择文件类别为“菜单”,单击“新建文件”按钮。
(2)在弹出的“新建菜单”窗口中选择“快捷菜单”,单击“确定”按钮,启动了“快捷菜单设计器”窗口。
(3)设计快捷菜单中的菜单项,如下图所示。具体方法,单击“插入栏”,在打开的对话框中,选择相应的vfp系统菜单命令项如下图所示,单击“插入”按钮。
(4)单击“文件”菜单下的“保存”命令,保存菜单文件名为KJ.MNX。
(5)在“快捷菜单设计器”状态下,单击“菜单”中的“生成”命令,将快捷菜单文件KJ.MNX生成对应的菜单程序文件,该文件的名称为 KJ.MPR 。
2.快捷菜单的调用
(1)新建一个名称为BD1.scx的表单文件,在该表单中填加一个编辑框控件edit1,保存表单文件。
(2) 双击表单,选择过程为rightclick,在表单的右击RIGHTCLICK事件中,输入下列代码: DO KJ.MPR &&调用快捷菜单
(3)保存表单文件。
(4)在窗口中输入命令:do form bd1,来运行表单bd1,在表单上按下鼠标右键就会弹出快捷菜单,测试快捷菜单的功能。
注:上述快捷菜单的定义与调用是步骤相关的,请按步骤进行。
3.在顶层表单中调用一般菜单
(1)建立菜单
操作步骤如下:
①单击“文件”菜单中的“新建”菜单项,在弹出的窗口中选择文件类别为“菜单”,单击“新建文件”按钮。在弹出的“新建菜单”窗口中选择“菜单”,单击“确定”按钮,启动了“菜单设计器”窗口。
②输入菜单项的相应名称,并选择结果为“子菜单”,表示将来单击该项,会弹出一个下拉子菜单,如下图所示。
③单击“文件调用”项右边的“创建”按钮,来设计“文件调用”的下拉子菜单。此时,“菜单设计器”上的菜单级显示为“文件调用”,表示目前正在设计“文件调用”项的子菜单,如下图所示。
④输入相应的菜单名称,在“结果”列中选择“命令”,如图所示。
注:菜单项的结果为“命令”的含义是当单击该菜单项时,会执行一条VFP命令,要执行的命令在后面的框中输入,如:“bd1表单”项的结果为“命令”,命令代码为:do form bd1。 ⑤选择“菜单级”中内容为“菜单栏”后,单击“日期与时间”菜单项右边的“创建”按钮,来设计该项的下拉子菜单,并根据下图所示为相应的菜单项选择相应的“结果”项。
注:
① 单击“日期”项右边的“创建”,输入日期过程代码如下:
RQ=DATE()
Messagebox(ctod(RQ))
② 退出菜单项的命令是:set sysmenu to default &&恢复VFP的菜单为系统默认菜单。 ③ 结果中的“过程”选项的含义是执行多条命令,而结果中的“命令”选项的功能是执行一条命令。
⑥设置该菜单可被一个顶层表单调用
在“显示”菜单中选择“常规选项”命令,在打开的对话框窗口中,选中“顶层表单”复选框。
⑦单击“文件”菜单下的“保存”命令,保存菜单文件名为Mymenu.mnx。
⑧在“菜单设计器”状态下,单击“菜单”中的“生成”命令,可将Mymenu.mnx文件生成Mymenu.mpr的菜单程序文件。
(2)在顶层表单中调用菜单
①新建一个表单文件DCBD.SCX。
②设置DCBD.SCX为顶层表单,即在表单的属性窗口中将该表单的SHOWWINDOW属性设置为2-作为顶层表单。
③双击表单,选择过程为INIT(或load),在表单的INIT(或load)事件中输入如下代码:.
④在窗口中输入命令:do form DCBD.SCX,来运行表单DCBD,测试菜单项的执行情况。
(3)其他要说明的问题
①给菜单项添加热键,方法是在菜单名的后面用“\
③ 添加菜单项目之间的分割线:只需把菜单项的名字写成:“\-”,其他项采用系统默认值
即可。
【实训12】SQL语言
实训目的:
1.掌握查询语句SQL—SELECT的功能与语法。
2.掌握数据操纵语句SQL—INSERT、SQL—UPDATE、SQL—DELETE的功能与语法。
3.掌握数据定义语句SQL—ALTER的功能与语法。
实训内容:
1、建表(建表后,可用modify structure 修改表结构命令 来看表的结构)
前提条件:create database SQLLX &&建立数据库SQLLX,该数据库是打开的 create table zgda1.dbf ;
(编号 c(6) not null,姓名 c(6),年龄 n(2,0),工资 f(6,2),获奖次数 I,出生日期 d,工作时间 t,婚否 l,简历 m,照片 g)
create table zgda2.dbf (编号 c(6) not null,姓名 c(6),年龄 n(2,0),工资 f(6,2))
create table zgda3.dbf (编号 c(6) not null primary key,姓名 c(6),年龄 n(2,0),工资 f(6,2)) create table zgda3.dbf (编号 c(6),姓名 c(6),年龄 n(2,0) check 年龄>0 error "年龄要大于
0" default 30)
create table zgda3.dbf (编号 c(6),姓名 c(6),年龄 n(2,0) check 年龄>0 error "年龄要大于
0" default 30)
create table zgda4 free (编号 c(6),姓名 c(6),年龄 n(2,0)) &&zgda4是自由表 注意:(表zgda1----zgda4是数据库表,并自动加到当前数据库SQLLX中)
(1) c n f类型需要指定宽度 n f b类型要指定精度
(2)UNIQUE 候选索引 primary key 主索引
2、alter table 修改表结构
alter table zgda3 add column 性别 c(2) check 性别="女" or 性别="男" error "性别只能为男或者女" default "男"
功能:添加性别字段并设置有效性规则,默认值为男。
alter table zgda3 alter column 性别 c(4) default "女" &&无有效性规则,默认值为女
alter table zgda3 alter column 性别 c(4) check 性别="女" or 性别="男" error "性别只能为男或者女" default "女"
alter table zgda3 alter column 性别 drop default &&删除性别字段的
默认值
alter table zgda3 alter column 性别 drop check &&删除性别字段的有效性规则
alter table zgda3 alter column 性别 set check 性别="男" or 性别="女" error "男或女?"
alter table zgda3 alter column 性别 set default "男" &&设置或更改性别字段的默认值
alter table zgda3 drop column 性别 &&删除性别字段 alter table zgda3 rename 姓名 to name &&姓名字段改名为name
alter table zgda3 rename column name to NM
3、drop table zgda4 &&删除自由表zgda4(请用close database把数据库关掉,否则删除不掉)
4、insert into:
open database SQLLX &&请打开数据库SQLLX
create table zgda4.dbf (编号 c(6),姓名 c(6),年龄 n(2,0),出生日期 d,婚否 L)
insert into zgda4(编号,姓名,年龄,出生日期,婚否) values ("990011","张三",35,{^1975-7-25},.t.)
insert into zgda4(编号,姓名,年龄,出生日期,婚否) values("990012","李四",40,{^1966-7-25},.f.)
insert into zgda4(编号,姓名,年龄,出生日期,婚否) values("990013","王五",46,{^1960-7-25},.t.)
5、delete
dele from zgda4 where 年龄>=40 &&用list命令显示记录,可看到2条记录加上了删除标记。
6、update
update zgda4 set 年龄=年龄+1,出生日期=出生日期-1 &&没有where条件,则更新全部记录
update zgda4 set 年龄=年龄+1,出生日期=出生日期-1 where 婚否=.t. &&更新已婚记录
7、select查询(运行下面的语句,说出其含义)
select * from zgda
select all 职称 from zgda &&all可省略,查出所有记录的职称字段值
select distinct 职称 from zgda &&查出所有记录的职称字段值,去掉重复行。 select 姓名,性别,年龄,职称 from zgda
select top 3 * from zgda order by 编号 desc &&查编号最大的前3条记录 select top 50 percent * from zgda order by 年龄 desc &&查年龄最大的前一半记录
select 姓名,性别,年龄,职称 from zgda where 性别="男"号 && 等同于:男"
select 姓名,性别,年龄,职称 from zgda where 职称="讲师" order by 性别 asc,年龄 desc select 姓名,性别,年龄,职称 from zgda where 年龄 between 40 and 50 &&包括40和50 select 姓名,性别,年龄,职称 from zgda where 年龄 >= 40 and 年龄
select 姓名,性别,年龄,职称 from zgda where 年龄 not between 40 and 50 &&年龄不在40和50范围内
select * from zgda where 姓名 like "刘%" &&查询所有姓刘的记录 select * from zgda where 姓名 like "王_" &&查询所有姓王且姓名只有两个字符的记录 select 姓名,性别,年龄,职称 from zgda where 姓名 not like "王%" &&查询所有不姓王的记录
where后面的特殊运算符(in ;between and ;like)
select 姓名,性别,年龄,职称 from zgda where 姓名 in ( "刘","王") &&查姓刘和姓王的记录,与下一语句等价。
select 姓名,性别,年龄,工资,职称 from zgda where 姓名 ="刘" or 姓名 ="王"
select 姓名,性别,年龄,职称 from zgda where 职称 in ("讲师","副教授")
select 姓名,性别,年龄,职称 from zgda where 职称="讲师" or 职称="副教授"
注:in 运算符:判断表达式的值是否等于指定列表中几个值中的一个
select 职称,avg(年龄) from zgda group by 职称 &&查每种职称的职工平均年龄
select 职称,avg(年龄) 平均年龄from zgda group by 职称 &&同时给表达式avg(年龄) 命名为 平均年龄
***将上面的两条语句中的avg换成sum后,再运行,看功能是什么?
select 职称,avg(年龄) from zgda group by 职称 having avg(年龄)>40 &&平均年龄>40的分组会显示
select max(年龄) from zgda &&查表中最大年龄值,最小用min
select职称,max(年龄) from zgda group by 职称 &&查每种职称的职工最大年龄,最小用min
select count(*) 职工人数 from zgda &&查表中人数,职工人数为自定义别名 select count(性别) from zgda &&查性别字段值的行数(计重复值) 结果为:8
select count(distinct 性别) from zgda &&查性别字段值的行数(不计重复值)结果为:2
select 性别,count(*) 职工人数 from zgda group by 性别 &&查男女职工人数,职工人数