语言基础知识复习教学反思
德卧教育集团高中部 王大英
语言知识虽有淡化考核的趋向,但也不可轻视。基础能力不足,也谈不上掌握更高的能力。这一部分至关重要。因为这几个题做得质量好坏,将决定后面或整套考卷的答题质量。如果基础题答得顺手,将会促进后面能力题更好的发挥。
调查显示:高考卷前5题的错误率比较高,这可能与考试开始的紧张有直接关系,但更可能是基础不够扎实所致。所以这一部分的复习,我多次强调学生绝不可掉以轻心,要稳扎稳打,各个突破。
字音、字形部分的复习,我的做法是立足课本,安排了两周的时间,把六册课本的书下注释及第二册书后附录的《审音表》让学生识记一遍,最后将六册课本里的字音字形整理成两张卷子让学生做。可是没想到的是学生的卷子仍是“江山一片红”,可是花的时间已经够多了,只有先这样过了,以后再慢慢巩固吧。
词义辨析和熟语运用部分的复习,只有一个方法,学生自己去背,我只是把一些容易混淆的成语及一些双面成语做了点解释。
标点符号部分的复习,采用的是口诀复习法。先讲口诀再做题,学生这一部分掌握得较好。
修改语病部分的复习,采用的是自己归纳的“快速寻找语病的六大招”,一节课讲方法,一节课考试,效果也挺好。
现在,学生做前五题的准确率还比较高,一般情况下,文科班大部分学生能做对三题,理科班大部分学生可以做对两题,其中标点题和语病题做得最好,辨析字音题和词义辨析题做得稍好一点,字形题和成语运用题得分的把握性还不高。
标点题和语病题的复习,自己也感觉得心应手。这是因为复习时可以把总结出的方法教给学生,学生听得也有劲,而且因为有方法的指导,复习费时少而见效快;一般来说,别的老师需要复习七八个课时,而我二三个课时就可以了。倒是前三个部分的内容,真正体现了语文教学的“慢”、“差”、“费”。这三个部分的内容,需要学生自己花时间积累,最重要的就是学生能够主动学习,而自己偏偏不知道如何才能调动学生的学习主动性。
第二篇:语言基础知识复习
语言基础知识
1. 掌握数据库类型和数据存储(常量、变量、数组、字段、对象);
? 常量的类型及表示:
字符型C:单引号、双引号、方括号 长度为`0~254个字符长度为0的字符:??;SPCACE(0) 备注型M:用来存放超过254个字符的文本 长度0~64K,只能作为字段类型
字段宽度为4,用来存放实际文本在备注文件中的地址;memo Memo 首字母大写表示包含内容。备注字段内容的输入:双击memo,打开编辑窗口,然后输入文本;光标位于该字段,按pagedown/pageup
通用型G:用来存放OLE对象,字段宽度为4,存放实际内容在备注文件中的地址 gen Gen注意它们之间的区别 首字母大写表示包含内容
通用字段的输入:双击gen,打开编辑窗口,在编辑菜单中选中插入对象
如果是已有的图片文件,则选择 通过文件创建
日期型D(日期时间型T):花括号 长度固定 8个字节
空日期: { } 空日期时间:{ / : }
set century on|off(默认) 表示是否采用4位的年份
set date to YMD|MDY(默认)|DMY|LONG(中文日期格式) 设臵年月日的次序 set mark 设臵年月日之间的分隔符
分为两种日期格式:传统日期格式:{mm/dd/yy hh:mm:ss}
严格日期格式:{^yyyy/mm/dd hh:mm:ss } (6.0默认的日期格式 )
set strictdate to 0(传统日期)|1(严格日期格式)|2 (严格日期格式,包括CTOD,DTOC) 系统自动把一个错误的日期数据识别为一个空日期
逻辑型L:.t. .f. .y. .n. 长度固定 1个字节,字母不区分大小写,两边的点号不能省略 货币型Y:长度固定 8个字节 小数位数最多为4位,超出4位则自动四舍五入
在交互状态下(命令窗口)用美元$符号加数字表示
数值型N(浮点型F):在内存中占8个字节,字段中由用户指定
小数形式:3.14 指数形式:3.12E28,3.12E-28
VAL(”3.14”)=3.14 VAL(“3.14E2”)=314.00 VAL(“-3.14”)=-3.14
VAL(“3A4E-2”)=3.00 VAL(“-+3.14”)=0.00 VAL(”3**2”)=3.00
整型I:长度固定 4个字节 无小数位数,且只能作为字段数据类型
INT(3.98)=3 固定取整数部分,无四舍五入
双精度型B :宽度固定为8字节
? 变量:
定义(变量的创建):通过赋值定义变量,由变量中的值确定其数据类型
a=100; 一次只能将一个值赋值给一个变量
store 100 to a,b,c:一次可以将一个值赋值给多个变量
变量的作用范围:
LOCAL(局部变量) 只能在定义它的程序单位中使用,在它的上级或下级程序单位中无效 PRIVATE(私有变量)子程序中的同名变量在运行结束后消失,不影响主调程序的同名变量 PUBLIC(全局变量)在整个程序运行过程中,在每个程序单位中都有效 PUBLIC A 访问变量:通过变量名访问变量
注意:内存变量和字段名同名时,字段变量具有更高优先级,如果要访问内存变量,则须在内存变量名前加M. 或者M->
例如:USE XS ?XH 此处显示的为XS表的XH字段 XH=12345 此处表示定义内存变量XH,而不表示为XH字段 ?XH 此处显示的为XS表的XH字段 ?M.XH 此处显示的为内存变量XH 内存变量的保存与恢复: 保存: SAVE TO Filename.Mem 将内存中的变量信息保存于文件 恢复: RESTORE FROM Fileneme ? 数组: 它也是内存变量,是一个有序的内存数据序列,它的每个值称为元素,可以通过序号来访问 定义(数组的声明): DECLARE | DIMENSION A(10),B(2,3) 私有数组 A(10):表示定义一个10个元素的数组A B(2,3):表示定义一个2行3列的数组B,共6个元素 LOCAL 局部数组 PUBLIC 公有数组(全局数组) 数组的存储:按行的顺序存储 例如:三行四列的数组A(3,4) A(2,3)等价于A(7) 数组的赋值: 对单个元素赋值;A(2,3)=3 第2行第3列的值为3 等价于A(7)=3 这里既可以用元素的逻辑位臵,也可用数组的存储位臵 对数组名进行赋值:A=3 表示A数组的所有元素都为3 数组跟表的关系: scater 将当前记录的每个字段传送到一维数组,作为它的一个元素 gather 将一维数组的每个元素的数据传送到表中作为一条记录的一个字段 copy to array 将整个表中的记录复制到二维数组 append form array 从二维数组中追加多条记录的数据到表 注意 数组的大小可以由命令根据表的字段数自动定义(对已定义的数组,元素个数只会增加不会减少) 数组元素的数据类型:一个数组中,每个元素的数据类型可以不同 定义数组后,数组元素初值为.F. Dimension a(3) A=.null. &&完成对A所有元素的赋值 ?A &&仅显示A的第一个元素 ?Type(?a(1)?) 备注型和通用型字段不能和数组交换数据,即备注字段和通用字段不会成为数组元素 学生表xs(xh c(9),xm c(8),xb c(2),csrq d(8),zp g,jl m) Use xs Scater to a a数组中元素的个数:4 如果已存在的数组,对它进行重新定义,里面的原有数据不会丢失,其元素个数根据重新定义的个数确定。例如: dimension a(5) a=3 dimension a(3)
?a(2) &&a(2)的值还是为3,但a的元素个数为3个,而不是5个 ? 字段:事先必须定义其数据类型,具有固定的数据类型,且宽度也是固定的 ? 对象:是类的实例,它包含数据(属性)和过程(事件代码) 2. 掌握各类型数据运算的操作符以及表达式; 字符操作符:+:直接将两个字符串直接连接 —:将左边字符串尾部空格移到连接后新字符串的最后 $:判断左边的子串是否包含于右边的字符串中 例如: 将必修课的课程名后加上星号 replace kcm with kcm-”*” for bxk[=.t.] replace kcm with alltrim(kcm)+”*” for bxk xb=”男” or xb=”女” 等价 xb$”男女” 职称只能为“助教、讲师、副教授、教授”:alltrim(zc)$” 助教讲师副教授” Inlist(alltrim(zc),”助教”,”讲师”,”副教授”, ”教授”) 注意:运算符两边必须同为字符型数据 以csrq为索引名,按zc和csrq创建普通索引,其索引表达式: zc+csrq(数据类型不同) 错误 CTOD(zc)+csrq(数据类型相同,但zc不可能转换为日期) 错误 zc+DTOC(csrq) 正确 日期操作符:+ (日期+整数=日期)只有一种运算形式 -(日期-整数=日期;日期-日期=相隔的天数,可以为负数)有两种运算形式 日期在进行关系比较时:以前的日期小于现在的日期 删除表中已经毕业的学生记录: DELETE FOR year(date())-val(iif(left(xh,1)=?9?,”19”,”20”)+left(xh,2))>4 关系操作符:!=|#|<> 表示不等 查询设计器中的不等可以用相等再取否 要求课时数大于3或者小于5且不带删除标记的记录
NOT KSS BETWEEN 3 AND 5 AND NOT DELETED()
=(左部匹配、精确相等) set exact on(精确相等) |off(左部匹配、默认状态) 例如: “abc”=”ab” 返回为.t. “ab”=”abc” 返回为.f.
= =(精确相等)
字符的排列序列: 有三种字符排列形式
machine机器序列:按机内码顺序排序;空格、大写、小写、一级汉字、二级汉字
Pinyin拼音序列:按汉语拼音序列排序;空格、小写、大写、汉字按拼音顺序 Stroke笔画序列:按笔画的多少排序;空格、小写、大写、汉字按笔画顺序 注意:系统默认的是拼音序列;
改变字符序列的命令
SET COLIATE TO “machine|Pinyin(默认)|Stroke”
逻辑操作符:not| !(取反) 、and(与、并且)、or(或、或者)
注意:操作符两边必须为逻辑值或返回值为逻辑型的表达式
算术操作符:**|^(乘方;2开3次方 2**(1/3))、
%(取余)结果的符号同第二个参数,
例如: A % B (A、B 以绝对值参与下面的运算)
如果A、B同号,结果为A-B*(INT(A/B))结果符号同B
如果A、B异号,结果为B*(INT(A/B)+1)-A 结果符号同B
3. 掌握常用系统函数的用法;
数学函数:ABS()求绝对值、 INT()取整,不具有四舍五入功能
注意:INT(100.245*100+0.5)/100=100.25 :四舍五入保留两位小数
CEILING()向上取整、 FLOOR()向下取整
ROUND()四舍五入、 例如:round(300.14,1)=300.1 round(345.14,-1)=350
RAND()取大于等于0小于1的随机数、
mod(m,n) 结果的符号由n的符号确定同号m-int(m/n)*n异号(int(m/n)+1)*n-m
MAX() MIN() SUM() COUNT() AVG()
字符函数:
去掉空格函数:ALLTRIM()两边、LTRIM()左边、RTRIM()右边|TRIM() AT(cst, ctring[,n])返回CST在CTRING中第N次出现时首字符的位臵 BTWEEN(dst,start,end)返回逻辑值,判断某个值是否属于某个区间
BTWEEN 操作符: KSS BTWEEN 3 AND 5 BTWEEN(KSS,3,5)
SPACE(n):返回n个空格的字符串
LEN(cst):返回字符串cst的长度,包括首尾空格
例如:学号长度只能为6、8、10 inlist(len(alltrim(xh)),6,8,10)
字符串截取:LEFT(str,n)从左边第一个字符开始
RIGHT(str,n)从右边第一个字符开始
SUBSTR(str,start,n)从指定位臵字符开始,取指定的长度
SUBSTR(str,start)表示从start开始取到字符串结束
REPLICATE(“ABC”,3)=“ABCABCABC”让表达式重复出现多次
日期时间函数:DATE()日期、DATETIME()日期时间、TIME()时间(字符结果) 注意:以上返回值为日期或日期时间型和字符型
YEAR()年、MONTH()月、DAY()日、DOW()|CDOW()星期单词
注意:以上返回值为数值型
转换函数:STR(要转换的数值,总宽度,小数位数)数值——>字符、
注意:默认 总宽度为10,小数位数为0 str(314.159)=(7个空格)314
当总宽度不能满足小数位数时,优先给整数 str(314.159,5,3)=“314.2” 当总宽度不能满足整数位数时,则系统返回星号(个数同总宽度) VAL()字符——>数值
注意:能够识别的:3.14、-3.14、3.14E2
不能识别的:+-3.14、A3.14 这种情况的返回值为0
ASC()字符——>ASCII、返回首字母的ASCII值
ASC(“计算机”) 返回首汉字的第一个字节数据
CHR()ASCII——>字符 返回该整数作为ASCII码所对应的字符
DTOC()日期——>字符
注意:DTOC(日期[,1]) 1表示返回以年月日顺序且无分隔符的字符串 例如:DTOC(DATE(),1)=“20040830”
CTOD()字符——>日期 要求参数必须为一个日期序列字符
注意: 6.0中,如果SET STRICDATE TO 2,则日期必须为严格日期格式序列
UPPER()小写——大写、
LOWER()大写——小写
数据测试函数:
TYPE()返回给定参数的数据类型,为一个表示该数据类型的字符
注意:参数可以为常量、变量或表达式 TYPE(“.F. OR .T.”)=L
参数只能为字符型数据,都必须加引号
(在数据库表设计器中,标题、注释 不需要引号,验证年信息 必须加引号,默
认值 则根据字段的数据类型来确定 )
当其数据类型不能确定时,返回字符U TYPE(“A= .T.”)=?U?
BETWEEN(3.14,4,5)返回.F.
注意:范围只能是从小到大
INLIST(2,1,2,3,4,5,6)第一个参数如果在其后出现,则返回.t.
EMPTY()判断字段是否为空 空串、空格串、逻辑假值、数字0、空日期返回值为真 ISNULL()判断是否为空值 只有为空值时,才返回真值
ISBLANK()判断是否为空格 只有参数为空串、空格串时,才返回真值
IIF(条件,为真的结果,为假的结果) 此函数允许嵌套使用
MESSAGEBOX(提示文本,按钮类型+图标类型+默认光标位臵,标题栏提示文本) 注意:此函数的返回值,可以推断出用户点击哪个按钮
INKEY()返回一个键码值,判断用户按了键盘中的哪个键 回车键为13
GETFILE() 显示打开对话框,返回用户选定的文件名及路径
表、数据库函数:
BOF()、EOF()、RECNO()
DBGETPROP()、DBSETPROP()
TABLEUPDATE()强制更新 TABLEREVERT()放弃更新
RECCOUNT()记录数统计,包括逻辑删除的记录 FCOUNT()字段数统计 USED()判断表是否被打开 DBUSED()判断数据库是否被打开
ORDER() TAG() SELECT()工作区号 ALIAS()别名
DELETED()
4. 掌握NULL值的处理;
NULL 等价于没有确定的值,任何变量被赋空值,都不会改变原来的数据类型
Dimension a(3) &&数组的所有元素将被赋初值.F.
?type(“a(1)”) &&此处返回L 因为定义数组后,每个元素被赋逻辑假值为初值 a(1)=.null.
?type(“a(1)”) &&此处返回L
空值在排序时,将优先于任何值
判断空值的函数:ISNULL() 当值为真时,则该变量为空值
5. 掌握VFP命令格式和基本程序控制语句;
几个常用命令:
*,&& 注释标记,*用来对整行进行注释,只能位于行的开始
? ? 换行显示(从新的一行开始显示后面的数据)
? ?? 从当前行开始显示数据
CLEAR 清除主窗口中的内容
RUN 在命令窗口执行WINOWS 应用程序 run notepad.exe
QUIT 结束VFP应用程序
SET BELL ON|OFF
? SET CENTURY ON|OFF 世纪开关(是否采用四位的年份)
? SET DATE TO YMD|MDY|DMY 设臵日期格式
? SET DEFAULT TO 设臵默认工作路径
SET ESCAPE ON|OFF 设臵是否由ESC键终止程序运行
SET SAFETY ON|OFF 设臵安全开关 (当要修改和替换文件时,是否有警告信息) SET SECONDS ON|OFF
? SET TALK ON|OFF 设臵 打开和关闭显示用户命令的中间结果 ? SET DECI TO n 设臵程序中数值数据的小数位数为n位
? WAIT WINDOWS “提示字符串” 用来返回程序结果的
6. 程序的四种基本结构: 顺序结构、分支结构、循环结构、子程序
顺序结构:最常见的最根本的程序结构。表示程序代码依次执行
分支结构:
1、IF语句(两分支,类似于IIF(条件,表达式1,表达式2)函数)
将100分制转换为5分制:
replace cj5 with iif(cj=100,5,iif(cj>79,4,iif(cj>59,3,iif(cj>39,2,1)))) all
sum(iif(cj>=60,xf,0)) as 总学分
IF 条件 [THEN]
[语句组1] &&条件成立则执行
ELSE
[语句组2] &&条件不成立则执行
ENDIF
2、CASE结构(多分支)
DO CASE
CASE 表达式1
[语句组1]
CASE 表达式2
[语句组2]
……
OTHERWISE &&表示其他情况
[语句组]
ENDCASE
一般情况下,对于命令按钮组和选项按钮组的编程可以用CASE结构
注意:在DO CASE 与第一个CASE之间不允许存在其他任何语句
循环结构:
1.scan……endscan
用来对表中的记录进行操作,能自动改变记录指针的位臵
SCAN [范围,FOR 条件,WHILE 条件]
[循环执行的语句] 循环体
ENDSCAN
例如:统计教师表中性别为男的记录的条数
ncount=0
use js
scan
if xb=”男” then
ncount=ncount+1
endif
&& skip 如果有此语句,则程序功能为统计记录号为奇数的记录中男教师的人数
Endscan
以上代码等价于:
Count to ncount for xb=”男”
&& count to ncount for xb=”男” and recno()%2==1
Select count(*) from sjk!js where xb=”男” into array ncount Nsum=0
Use js
Scan
Nsum=nsum+gl
Skip
Endscan
2.For……endfor
用来对循环次数已知的情况
FOR I=E1 TO E2 STEP E3
[循环执行的语句]
ENDFOR|NEXT I
E1 循环初值 E2 循环终值 E3 步长(增量)
E1<E2 E3>0 从小到大,每次加 E1>E2 E3<0 当E3为1时,STEP E3 可以省略
例:求1!+2!+……+10!的值
nsum=0
for i=10 to 1 step -1 && for i=1 to 10 都正确
nmul=1 &&保存阶乘值
&&外循环每执行一次,nmul都重新赋值
for j=1 to I &&引用外层循环变量的值
nmul=nmul*j
next j &&以上内层循环用来求I的阶乘
nsum=nsum+nmul
next i
?nsum
nsum=0
nmul=1
for i=1 to 10 && for i=10 to 1 step -1 错
nmul=nmul*i
nsum=nsum+nmul
next i
?nsum
3.do while …… enddo
适用于循环次数未知的情况
do while 条件 当条件为真时,执行循环体
[循环执行的语句] 从大到小,每次减
enddo
EXIT: 终止整个循环结构的执行
LOOP:终止本次循环,直接进入下一轮的循环
跳过LOOP和ENDDO之间的所有语句,回到循环开始语句
例如:将一个字母串反序显示 “ABCD” 显示“DCBA”
STORE “ABCD” TO C,CC
P=SPACE(0) && p=0
DO WHILE LEN(C)>0 && do while c>0
P=left(c,1)+p && P=p+left(c,1)
C=substr(c,2) && c=right(c,len(c)-1) 使条件不断向循环终止条件转化 Enddo
? cc+”的反序为”+P
例如:将任意字符(包括汉字)组成的字符串进行反序显示
STORE “AB汉字CD” TO C,CC
P=SPACE(0)
DO WHILE LEN(C)>0
If asc(left(c,1))>127 then ASCII的最大值为01111111(127)
I=2
Else
I=1
Endif
&& 以上分支语句用来判断是对汉字处理还是字母处理
P=left(c,i)+p
C=substr(c, i+1)
&& c=right(c,len(c)-i) 使条件不断向循环终止条件转化
Enddo
? cc+”的反序为”+P
7. 掌握创建此过程化程序、用户自定义函数和过程的方法;
1、用户自定义函数(UDF)格式
function 函数名
parameter 参数列表 &&当该函数需要从外部接受值时,必须有该语句,形式参数
[函数的执行语句部分] &&包括赋初值、处理
retrun 结果表达式 &&返回结果,UDF必须包含该语句
endfunc
注意:函数名不能作为函数体中的变量名
函数的调用
?函数名(参数列表) &&必须保证参数列表中数据的一一对应,实在参数 y=函数名(参数列表)
注意:实参和形参的一一对应包括:个数、次序、类型三个方面的对应
2、过程的格式
procedure 过程名
parameter 参数列表 &&当该过程需要从外部接受值时,必须有该语句
[过程的执行语句部分] &&包括赋初值、处理
?结果 &&显示结果,此处不能用RETURN 结果表达式
return
endproc
过程的调用
do 过程名 with 参数列表
3、过程和函数的存储:有四种形式
1. 放于主程序单元之后,与主程序位于同一个prg文件
2. 每个函数或过程单独以一个PRG文件存放,一个函数或过程存放一个文件
3. 所有的函数和过程存放于同一个PRG文件中,这个PRG文件称为过程文件
如果是第三种存放形式,则在调用该函数或过程之前,必须执行命令:
set procedure to 过程文件名 &&指定过程所在的位臵信息
4. 函数和过程也可存放于数据库文件的存储过程中
如果函数和过程位于数据库的存储过程,则调用之前,必须先打开该数据库
4、参数的传递:两种传递参数的形式
值传递:在函数或过程中改变参数的值,在程序运行结束后,该参数的值仍旧为原来的值
引用传递:将参数的地址传递到函数和过程中,程序运行结束后,对该参数的改变将保留
默认:函数采用值传递来传递参数;过程采用引用传递来传递参数
设臵默认的参数传递方式: SET UDFPARMS TO REFERENCE|VALUE
强行指定参数传递方式: 值传递 变量名前加括号
引用传递:变量名加@
8. 宏替换和名称表达式
名称表达式:由圆括号括起来的一个字符表达式,该字符表达式可以是单个变量或数组元素,还可以是一个由字符运算符连接的字符表达式。
Nvar=100
Var_name=”nvar”
Store 1234 to (var_name) &&红色部分的表达式可以直接用nvar代替
?nvar &&此处nvar的值为1234
db_name=”jxsj”
dbf_name=”js”
use (db_name+”!”+dbf_name) &&等价于 jxsj!js
宏替换:与名称表达式具有相似的作用,在字符变量前面添加符号(&)
宏替换的使用范围比名称表达式更广。但它的运算速度比名称表达式慢
区别:1.宏替换可以用来构成表达式,但名称表达式不能作为其他表达式的组成部分名称表达式只能
作为命令的一部分。
field_name=”js.xm”
locate for (field_name)=”王一平”
&& 错误 名称表达式不能作为表达式的一部分,但可以作为命令的一部分
locate for &field_name=”王一平” && 正确
2.某些命令和函数不能使用名称表达式
var_name=”cvar”
(var_name)=”test1” &&不能正确赋值,赋值语句中不能使用名称表达式
&var_name=”test2” && 正确
cvar=”visul foxpro 5.0”
var_name=”cvar”
?substr((var_name),2,2) &&显示“va”此处名称表达式不起作用
?substr(&var_name,2,2) &&显示“is”
将专业代号第一个字符为1的改成9
replace zydh with “9”+substr(zydh,2) for left(zydh,1)=”1” &&正确
replace left(zydh,1) with “9” for left(zydh,1)=”1” &&错误
3.名称表达式不能充当整条命令,而宏替换可以 充当整条命令
cvar=”use js”
(cvar) &&错误,它只能作为命令的一部分
&cvar &&正确
对本部分内容的学习提出如下意见供参考:
1. 注意不同数据类型的表示格式、最大宽度、允许取值及范围;
2. 下列7种数据类型只能用于表的字段:浮点型、双精度型、整型、备注型、通用型、二进制字符型、二进制备注型;
3. 下列各组不同类型之间可以不经过函数转换直接构成表达式:
⑴.字符型、备注型 例如:xm+jl
⑵.货币型、数值型、浮点型、双精度型、整型 gl+jbgz
⑶.日期型/日期时间型、数值型/整型(日期型在前)
注意:如果是日期和数值构成索引表达式,则必须将它们统一成字符型
4. 下列类型之间可以用函数相互转换 C
VAL() 数值型 字符型 CTODDTOC() TTOC() STR() DTOT()
日期型(D) 日期时间型(T)
TTOD()
5.在程序中使用变量、数组时,要注意他们命名规范、作用域:
6.对于操作符,要注意:
(1)有些操作符被用于多种数据类型,但作用不同。如“-”操作符,对于数值型而言,表示减法运算,对于字符型来说,表示字符串的连接运算,而对于日期型数据来说,运算结果表示两个日期之间相差的天数:
(2)关系操作符可用于任意数据类型:
(3)操作符具有优先级,一个表达式中的多个操作符的运算先后是按照其优先级进行的,同一级的操作符按自左至右的顺序进行运算:
7.对于系统函数的学习,要记住常用函数,学习函数的关键是要注意函数的功能和语法、参数
自由表
1. 掌握表的概念、组成和分类;
表是相关数据的集合,按照一定的组织形式,以DBF为扩展名的文件保存,FPT(表备注文件) 组成:表结构和记录
分类:自由表和数据库表
2. 掌握用表设计器创建和修改表结构的方法及其相关的SQL命令;
创建表的结构
create table|dbf xs(xh c(9),xm c(8) NULL,csrq d(8) not null) 创建自由表和数据库表
create table|dbf xs(xh c(9),xm c(8) check “not empty(“xm”)”,csrq d(8) not null)
create cursor xs(xh c(9),xm c(8) NULL,csrq d not null) 创建临时表
修改表的结构
ALTER TABLE XS ADD|RENAME|DROP COLUMN BJ C(2)|BJ TO BJBH|BJBH
修改字段的类型和宽度
ALTER TABLE XS ALTER COLUMN BJBH N(5,0)
注意:对于数值型字段,必须指定小数位数,哪怕位数为0
3. 掌握字段的基本属性(字段名、数据类型、宽度、小数位数和空值支持);
命名规则:可以包含字母、数字和下划线、汉字;不能以数字开头;长度为1~128(自由表的字段名以及索引标志名长度只能为10)
数据类型:宽度固定的数据类型的名字(8:D,T,B,Y 4:M,G,I 1:L 254:C)
小数位数:包含在总宽度中,同时还要注意总宽度中还包含小数点一位
空值:表示值不确定;空值可以等价于任何一种数据类型 CTRL+0(表的字段中空值的输入)
4. 掌握表记录的追加、浏览、定位、修改、删除和筛选的操作;
追加
APPEND BLANK(可在程序代码中或命令窗口中使用) 在表末尾追加一条空记录
CTRL+Y 快捷键 只能在浏览窗口中使用 追加一条记录
append from 表名 for 条件 追加多条记录 (以同名字段填充)
insert blank (before) (VFP命令)事先应将表打开
insert into xs[(xm,xh,xb) ]values(“ ”,” ”,” ”) (SQL命令)如果该表未打开,则会自动打开该表 如果省略字段名列表,则values后面提供的值必须按照表中字段的先后顺序给出
如果给出字段列表,则values后面提供的值应按照字段列表的顺序给出
浏览
browse for/while display(分屏显示)/list
范围: all next n rest recorde n
FOR:所有满足条件的记录 ALL
WHILE:当遇到第一个不满足条件记录则停止命令的执行 REST
定位
相对定位 skip n(正数|负数)当前记录号为9 SKIP -3 top botton
绝对定位 go (goto) N 定位到记录号为N的记录
条件定位 locate for 条件 (从第一条记录开始搜索,定位在第一个满足条件的记录上)
continue (定位到下一个满足条件的记录)
记录指针 bof() eof() recno()(记录号的变化范围:1~n+1)
空表 .t. .t. 1 表的最大记录号:当前记录总数+1
非空表 .f. .f. 1
记录指针指向BOF时,记录号为1
记录指针指向EOF时,记录号为N+1
修改字段的值(更新记录)
replace 字段名1 with 表达式1[,字段名2 with 表达式2] for 条件 | 范围子句 《vfp命令》 注意:有 条件 表示对满足条件的记录进行修改
无 条件 表示对当前记录进行修改
? replace xb with “男”,csrq with date() FOR 条件:替换多个字段
replace ALL xb with iif(xb=1,”女”,“男”) REPLACE 默认只对当前记录进行处理
根据条件对同一个字段做不同的替换:
replace all jbgz with iif(zc=”教授”,jbgz+400,iif(zc=”副教授”, jbgz+300,iif(zc=”讲师”,jbgz+200,jbgz))) 范围子句:ALL :所有记录 NEXT N:从当前记录开始的N条记录
REST:从当前记录开始,一直到记录的结束 RECORDE N:记录号为N的记录 update 表文件名 set 字段名=表达式 where 条件 《SQL命令》
注意:有where 条件 表示对满足条件的记录进行修改
无where 条件 表示对所有记录进行修改
删除
逻辑删除
delete all for 条件 <VFP命令> 不加范围和条件,仅对当前记录进行操作
delete from 表文件名 where 条件 《SQL命令》
控制对带删除标记记录的访问:set deleted ON|OFF 带删除标记的记录不能|可以访问
reccount():set dele on 对该函数不起作用,它统计的是文件中没有被彻底删除的记录的总条数 物理删除(彻底删除)
pack:把带有删除标记的记录彻底删除,剩余记录重新编号
zap:将所有记录彻底删除,仅保留表结构
以上两条命令,要求表以独占方式打开
恢复记录(去掉删除标记)
recall 范围子句|for 条件 : 该命令如果不加范围和条件,则只恢复当前记录(display|delete|replace) deleted():判断当前记录是否带有删除标记
筛选
记录的筛选: 选择运算
临时筛选:在普通命令后加 for/while 条件
长期性筛选:set filter to 条件
字段的筛选: 投影运算
browse fields 字段列表
set fields to 字段列表
5. 掌握追加、删除、更新记录的SQL命令;
6. 掌握表的打开和关闭方法,掌握工作区和当前工作区的概念;
打开表:use 表名 [alias 别名]
Use 表名 again 在不同工作区打开同一张表
Used(“xs”): 判断xs表是否被使用
关闭表:use ;close table; close all ;close database(如果当前没有打开数据库,则该命令将关闭所有的表) 工作区:内存中的一片区域;在一个工作区中同一个时间只能打开一张表
select()工作区编号:1..N任意一个无符号整数;前10个工作区可用A~J来表示
alias()工作区别名:默认为表的名字 当区号大于10且该表是重复打开,则别名为W+区号
对非当前工作区的表进行操作:
改变当前工作区:用SELECT 工作区号/别名
强行指定工作区:在命令中用IN 工作区号|别名
select 0 :0表示当前未被使用的且编号最小的工作区
close tables|all:执行该命令后,系统将1号工作区臵为当前工作区
use xs in 0: 打开XS表,该命令不改变当前工作区 、
use in xs :关闭别名为XS的工作区中的表
use techer alias xs
go top in xs
7. 掌握表的索引的概念,索引的类型,结构复合索引文件的创建,修改和使用。
索引文件的结构:索引序号+表的记录号
索引的类型:
主索引:适用于数据库表的结构复合索引。一张表只有一个,关键字段的值唯一
候选索引(candidate):关键字段的值唯一
普通索引:
唯一索引(unique):记录中关键字出现了重复值,则只有第一个有效
索引文件的类型:
独立索引文件:idx,文件中只能包含一个索引标志
复合索引文件:cdx,文件中可以包含多个索引标志
结构复合索引:索引文件名与表文件名同名,索引文件随表文件的打开而自动打开
非结构复合索引:
注意:项目管理器不能管理独立索引和复合索引
建立索引
index on 关键字表达式 tag 索引标志名 [candidate|unique] [FOR 条件]
多个字段建立索引表达式应该注意:
1. 多个字符型的字段其先后顺序,影响索引结果:xm+xb 和 xb+xm
2. 多个数值型字段按表达式的和值进行排序 jbgz+gl 合理的排序: str(jbgz,7,2)+str(gl)
3. 多个数据类型不相同的字段建立表达式,必须先统一类型
转换函数:str()数值转换为字符 val()字符转换为数值
dtoc()日期转换为字符 ctod() 字符转换为日期
要求对学生表进行排序,先按照性别排序,性别相同的再按照出生日期排序,出生日期相同的则再按照成绩总分进行排序. Xb+dtoc(csrq)+str(zf)
索引的使用
主控索引:正在起作用的索引标志;注意和主索引的区别。
设定主控索引:
1.打开表的同时指定主控索引 use xs order xh
2.打开表之后指定主控索引 set order to 索引标识名
索引标识的删除 delete tag 索引标识名
索引的修改:使用INDEX命令重建索引
根据索引定位记录
seek 表达式 :set order to xh ; seek “990101”
要求:1 需要对表达式字段建立索引并设臵为主控索引
2 结果将指向第一个满足条件的记录或者记录结束标识(没有找到相关记录) 对定位结果的判断:found() .t. 说明已经找到 .f. 表示没有找到相关记录
Eof() .f. 说明已经找到 .t. 表示没有找到相关记录
seek(表达式):
要求:需要对表达式字段建立索引并设臵为主控索引
结果返回逻辑值,找到:.t.;没找到:.f.
等价于:seek命令+found()函数
8. 掌握表之间的关系及其种类,掌握表的关联及其建立和解除的方法;
关系及其种类:1:n; n:1; m:n; 1:1
9. 掌握表的数据缓冲访问的概念、数据缓冲的类型和设臵数据缓冲的方法;
缓冲类型:表缓冲:整个表修改结束之后,一起更新记录到磁盘
行缓冲:当一个记录修改结束,更新到磁盘
锁定类型:保守式:在整个编辑更新的过程中,不允许使用该表
开放式:仅在更新那一时刻,不允许使用该表
表的共享访问:独占(exclusive)/共享(share)
1 设臵默认打开方式
set exclusive on|off (独占|共享)
此设臵仅对以后打开的表起作用,不影响已经打开的表的状态
2 强行以某种方式打开
use xs share|exclusive
如果一张表已经打开了,则再次打开时仍按照上一次打开的方式打开,此命令中的指定无效。
只能以独占方式打开表的有关操作:modi structure; index; reindex
insert ;pack; zap;
10.了解用CURVAL()和OLDVAL()函数检测缓冲区数据和表数据的一致;
CURVAL():打开表后原始的记录值
OLDVAL():磁盘中表文件的原始值
11.掌握用TABLEUPDATE(.t.)[强制更新]和TABLERVERT(.t.)[放弃更新]函数执行和放弃对缓冲数据的更改;
数据库表
1、 掌握数据库的概念、创建、打开和关闭;
数据库:包容器,相关表的集合,不包含表的记录数据;但是包含字段和表的扩展属性
创建:Create Database JXSJ 形成三个文件:DBC(数据库)、DCT(库备注)、DCX(库索引) Create xs 创建表
注意: 创建数据库后,该数据库自动打开且为当前数据库,但不会添加到项目管理器中
如果存在当前数据库,则此时创建的表如未特别说明(在命令中加FREE关键字),则一定属于该数据库
打开:Open Database 数据库名字
反复执行该命令能同时打开多个数据库,且最后打开的数据库为当前数据库
设臵当前数据库:set database to 数据库名
如果引用非当前数据库中的表,则在库名和表名之间加“!”
关闭数据库:Close Database;Close All(命令、帮助、跟踪、调试);QUIT(退出VFP系统)
2、 掌握数据库的组成(库表、永久关系、视图、存储过程);
数据库表:比自由表具有更多的属性,所有记录以DBF文件保存,扩展属性保存于数据库文件。 永久关系:建立的基础:通过索引建立,主表 主索引或候选索引 子表 普通索引
目的是用来建立表与表之间的参照完整性,某些情况下作为默认的临时关系和默认的联
接条件
关系保存于数据库文件中,一旦建立,永久保存,当其中一张表从数据库中移去时,关
系解除
建立的对象:同一个数据库中的两张表
常见的有一对多、多对多(通过纽带表将其转换成两个一对多关系)
建立步骤:
分别建立主表和子表的相关索引 在数据库设计器中,从主表的主索引标志拖放到子表的普通索引标志上 命令方式建立永久关系 主表和子表都存在:Alter table cj add foreign key xh tag xh reference xs 在创建子表的同时: 视图:不单独以文件的形式保存,保存于数据库文件中;查询数据源为视图,则视图名前一定要加数据库名 从一张表或多张表中按照一定的条件来选取字段和记录 存储过程:在数据库文件中,用来保存用户代码的地方(参照完整性约束代码,用户的过程和函数) Procedure proca function funca …… …… Endproc endfunc 3、 掌握库与表之间的链接以及链接的更新和恢复; 双向链接:前链:位于数据库文件中,记录表文件的信息(路径、文件名) 后链:位于表文件中,记录该表属于哪个数据库 当数据库文件或表文件的位臵发生改变时,它们的双向链接将被破坏 更新和恢复:validate database recover (在数据库中,对所有的表进行重新定位,修改前链) 当数据库或表文件不存在时: 删除前链:remove table [delete] 针对于表文件不存在 删除后链:FREE TABLE 表名 针对于数据库文件不存在 数据库文件的删除:
DELETE DATABASE 删除数据库文件,同时使所有的数据库表变为自由表
DELETE FILE 删除文件,数据库表不会变成自由表(等同于在资源管理器中删除文件)
4、 掌握永久关系的概念、创建和删除、作用;
作用:1、用来建立参照完整性(主要作用) 2、某些场合作为默认的临时关系和联结条件
5、 掌握库表字段的扩展属性(格式、掩码、标题和注释)及其设臵方法;
格式(Format):控制字段的显示方式,如大写、中文日期 (A、K、L、T、!、$)
掩码(Inputmask):控制字段的输入格式,如只能输入字母或数字(X、9、.、,、A)
标题(Caption):在浏览窗口的列标题上显示的说明文字,不同于字段名,但字段名可作为默认的标题(在表设计器中设臵标题时,不需要加引号)
注释(Comment):在项目管理器中,当选中该字段后,在下面的说明栏中显示(在表设计器中设臵注释时,不需要加引号)
默认值(Defaultvalue):当新增记录时,字段预先具有的初值。(在表设计器中设臵时,要根据该字段的数据类型来决定表示形式)
6、 掌握字段有效性规则、记录有效性规则、表触发器、库表之间参照完整性概念及其设臵方法,以及
VFP数据完整性概念;
字段有效性规则:一个逻辑表达式,控制该字段的数据的正确性(不能加引号)
起作用的时间:在设臵规则并保存的过程中,对表中已有的数据进行验证
当修改该字段,光标离开该字段时
字段规则信息:出错时的说明文字,注意要加引号
记录有效性规则:一个逻辑表达式,控制该记录中多个字段之间的数据有效性(不能加引号) 起作用的时间:在设臵规则并保存的过程中,对表中已有的数据进行验证
当修改表中的记录,且光标离开该记录时
记录规则信息:出错时的说明文字,注意要加引号
触发器:绑定在表上的一个逻辑表达式,分为删除、插入、更新。在进行相应操作时,如果该表达式为真,则允许进行操作,否则禁止。
注意:当表达式设臵为.F.时,则永远不能进行该操作。
参照完整性:控制多张表之间的数据一致性。可在同一数据库文件中具有永久关系的两张表之间设
臵。
建立在永久关系的基础上;通过触发器设臵;代码保存于存储过程中
目的是为了防止出现孤立记录:在子表中出现,而主表中没有相关记录的记录
三种规则:更新规则:(父动)级联、限制、忽略
删除规则:(父动)级联、限制、忽略
插入规则:(子动)限制、忽略
VFP数据完整性: 域完整性:字段验证规则
实体完整性:记录验证规则
参照完整性
用户自定义完整性
7、 了解DBGETPROP()和DBSETPROP()函数查看和设臵数据库属性的方法;
DBGETPROP(cname,ctype4种,cproperty):获取属性
DBSETPROP(cname,ctype4种,cproperty,evalue):设臵属性
Ctype: database ,view ,table,field
Cproperty: caption ,comment(注释),buffering,defaultvalue,primarykey,path
如果cname为字段,则必须写成 表名.字段名
8、 掌握临时关系的概念、建立与解除,以及与永久关系的区别和联系。
临时关系:两张打开表之间建立的一种关系,通过它可以使子表的记录指针跟随主表的记录指针一起发生改变,一旦其中的某张表关闭,则该关系消失。(作用:控制记录的访问)
临时关系和永久关系之间的区别和联系
联系:1、必须客观存在 2、永久关系有时作为默认临时关系
区别:
1、建立方式不同
2、作用不同
3、建立的对象不同、存在的形式不同
4、子表所拥有主表个数不同
建立方式:在不同工作区中打开子表和主表
设臵子表的主控索引
在主表工作区执行命令
SET RELATION TO 关联字段名 INTO 子表表名
解除:SET RELATION TO 或者关闭其中的任何一张表
查询和视图
1、 理解查询和视图字段、筛选、排序、分组的含义并掌握其设臵方法;
添加表(from):添加多张表时,注意添加的次序,主表——子表——主表
如果是数据库表,则事先应打开该表所属的数据库
from 数据库名!表名
可添加的数据源表:自由表、数据库表、视图 (注意:不能为查询)
字段: 设定输出字段
字段表达式 AS 字段标题 ; 字符常量 AS 字段标题
如果是字符常量,则表示该字段全部填充该常量的值。 “优秀” AS 等级 字段表达式:销售数量*零售价 AS 销售总额
统计函数的使用
计数:COUNT( * ) 参数可以为星号或者任意输出字段名
求和:SUM( ) 参数可以是一个或多个数值型字段的表达式 SUM(XSSL*LSJ)
SUM(IIF(XB=“女”,1,0)) 实现对满足条件的记录计数
SUM(IIF(XB=“女”,1,0))/count(*) as 女生所占比例
求平均值:AVG( ) 参数同SUM()
求最大值:MAX( )
求最小值:MIN( )
注意:输出字段中如果有统计函数,则一般有分组依据,按分组依据形成多条记录;如不设定分组依据,则整个表将合并成一条记录
可以用星号表示输出表中所有字段。例如:select * from jxsj!js where xb=”男”
IIF(,,)函数在此处的使用
LEFT(XS.XH,2) AS 年级
联结条件:
联结的类型:
内联接(inner join):输出所有满足条件的记录(通常情况下使用)
左联接(left outer join):输出联接表达式左边表的所有记录,以及右边表的满足条件的记录 右联接(right outer join):输出联接表达式右边表的所有记录,以及左边表的满足条件的记录 完全连接(full join):输出的记录数为两张表的记录数的乘积
Xs cj
1 1
2 1
3 2
4 3
5
内联接 4条记录 1 1 2 3
左联接 5条记录 1 1 2 3 4
右联接 5条记录 1 1 2 3 5
完全连接 20条记录
多表查询需注意表的添加顺序,它影响联结条件的形成
基于单张表的查询不需要考虑联接条件
FROM sjk!xs INNER JOIN sjk!cj INNER JOIN sjk!kc ;
ON Cj.kcdh = Kc.kcdh ;
ON Xs.xh = Cj.xh; 注意:表和连接条件之间的对应关系
FROM sjk!xs INNER JOIN sjk!cj ON Xs.xh = Cj.xh;
INNER JOIN sjk!kc ON Cj.kcdh = Kc.kcdh ;
筛选(WHERE):直接从表中选出满足条件的记录;有时还可用来建立表之间的联接
例如: SELE XS.XH,XS.XM,SUM(CJ.CJ)AS ZF;
FROM JXSJ!XS,JXSJ!CJ;
WHERE XS.XH=CJ.XH;该语句作为XS和CJ联接的依据
GROUP BY XS.XH;
ORDER BY 1 CSTR,N
条件类型:
LIKE :表示以什么开头或结尾 js.gh like a* LEFT(GH,1)=“A”
LEFT(CSTR,N) 从CSTR变量的左边开始取N个字符
RIGHT(CSTR,N)从CSTR变量的右边开始取N个字符
SUBSTR(CSTR,NSTART,NLEN)从CSTR变量的NSTART开始取NLEN个字符 BETWEEN :表示在什么和什么之间 csrq between 01/01/81,12/31/82 (查询设计器中) csrq between 01/01/81 and 12/31/82 (SQL语句中) 也可以用逻辑运算符连接两个关系表达式来实现
例如: CSRQ>={01/01/80} .AND. CSRQ<={12/31/82}
IN:表示在某个范围之内
函数 inlist(变量,值的列表)
例如:inlist(len(alltrim(xs.xh)),6,8,10) :学号字段的长度只能为 6、8、10
Select * from xs where xs.xh in():输出在成绩表中有成绩的学生的信息(嵌套子查询)
MODI COMM CHAXUN1.QPR 用命令的方式创建查询文件
实例文本框中应注意:
字符串不需加引号,除非和字段名同名
日期不需加花括号,但日期的格式必须满足VFP系统的日期格式(月/日/年)
逻辑值必须按标准形式(.T.,.F.)
不能用M或G型字段做选定条件
不等于的表示:实际是相等情况的取反 (选定条件前面的“否”按钮)
排序(ORDER BY):默认是按升序 注意字段列表的先后顺序影响排序结果,
按多个字段排序,不能用表达式,只需要将字段按次序列出,中间用逗号分隔,而且必须给出每个字段的顺序(ASCE(升序 可省略)、DESC(降序))
例如:按性别降序排序,性别相同按姓名升序排序
例如:order by xb desc,xm :如果姓名按降序,则也必须给定DESC,不能省略 如果排序字段是一个字段表达式,则可以用该字段在查询输出列表中的序号来代替。 分组(GROUP BY): 分组依据 肯定是输出字段,但不能是通过计算得到的数值输出字段 不能使用的:SUM(CJ.CJ) COUNT(*)
可以使用的:LEFT(XH,2)AS 年级
分组依据可以是一个字段,也可以是多个字段
例如:求各个学生的总分;每个年级的平均分; 基于单个字段
每个年级男女生的平均分(年级,性别) 各年级每门课程的平均分(年级,课程)
满足条件(HAVING):表示在查询结果的基础上进行的再次筛选(或者说是对组的筛选),表达式中的字段不是表中的原始字段
例如:输出平均分在75分以上的学生名单
与筛选条件(WHERE)的区别:
WHERE 表示可直接利用表中的字段或经过函数简单处理来形成的条件
杂项(TOP N PERCENT;DISTINCT):查询结果的范围
例如:查询输出总分的前3名:
首先 结果按总分的降序排序,然后设臵 取前3条记录(TOP 3)
DISTINCT:表示忽略查询结果中的重复记录,重复记录只显示第一条
运行查询:查询文件 扩展名为 QPR;查询文件中保存的是查询的命令
DO 查询文件名.QPR (扩展名不能省略)
选择查询的输出类型(INTO | TO):
默认的输出类型:浏览窗口
其他形式:INTO 自由表TABLE、临时表CURSOR、数组ARRAY
(输出的字段数以及记录数决定数组的形状)
TO 报表REPORT、标签LABEL、屏幕SCREEN、打印机PRINT
交叉表查询:输出字段的个数只能是3个
2、 掌握SELECT-SQL语句
SELECT DISTINCT TOP N (PERCENT)输出字段列表(注意 * 的作用)
FROM 数据源表1 [INNER JOIN 数据源表2 ON 联接条件]
[WHERE 筛选条件 (注意: 多个条件表达式需用逻辑运算符连接)]
[GROUP BY 分组依据]
[HAVING 满足条件] (条件中的字段是经过查询后得到的);
UNION;
SELECT DISTINCT TOP N (PERCENT)输出字段列表 (注意:必须与前一查询的输出列表一致) FROM 数据源表1 INNER JOIN 数据源表2 ON 联接条件
WHERE 筛选条件
GROUP BY 分组依据
HAVING 满足条件
[ORDER BY 排序依据] (注意:依据可以是字段名或字段序号;它是对查询的最终结果进行排序) 最后的ORDER BY 对上两个查询的结果都有效
3、 掌握用用视图设计器设计本地视图的方法;
视图的分类:
本地视图:
远程视图:利用ODBC(开放式数据互连)
创建视图的命令:
CREATE SQL VIEW 视图名 AS SELECT语句
注意:视图不以文件的形式保存,而是保存于数据库文件中
更新条件:(视图设计器区别于查询设计器的地方)
设臵关键字段:每个需修改数据的表中都必须设定;如果表中没有设臵关键字段,则表中的数据不允许修改及更新;关键字段设臵的目的是为了防止更新冲突及出现重复记录
设臵可更新字段:选定需要修改的字段
使表可更新:选定发送SQL更新(SENDUPDATE);它是决定视图中修改的数据是否反映到基表中去的一个开关
参数化视图:实际上是筛选条件不确定的一种视图
需要注意条件实例的表示: ?参数名
设臵视图参数:实际上是确定视图参数的类型
视图的使用:注意视图的打开与查询的打开不同
视图是一张虚表,它的打开方式同表:USE 视图名
(注意:视图打开前,必须打开它所属的数据库)
视图的修改和重命名:MODIFY VIEW 视图名 此命令将打开视图设计器
视图字段属性的设臵:视图的输出字段 可以设臵类似于数据库表的扩展属性
可在字段选项卡中,点击属性按钮;(注意:查询设计器不具有该按钮)
4、 掌握查询和视图的概念、区别与联系;
1. 了解面向对象的程序设计的概念;
面向对象设计:自底向上、功能综合;由事件驱动
过程化程序设计:自顶向下,功能分解;由过程驱动
2. 掌握类和对象的概念、类的特点;
类的定义:面向对象程序设计的核心。将具有相同的结构、操作,并遵守相同规则的对象集合到一起,这组对象就称为类。是某一组对象的模板. 如表单类FROM
对象的定义:对象是类的实例,对象包含数据(对象的属性值)和过程(对象的方法程序)。 类和对象之间的关系:类是静态的(设计状态下),对象是动态的(运行状态下)
类的特点:
继承性:子类沿用父类特征的能力,提高了代码的可重用性
封装性:主要体现为类中信息的隐藏(设计类时指定的代码,在通过类创建对象时不可见) 多态性:同一个类的同名事件,可完成不同的操作,不同类的同名事件也可完成不同操作 抽象性:设计类时,只需要提取该类的某些属性,而不是所有属性
3. 掌握对象的属性、方法和事件概念;
属性:对象某一方面的特征
最小属性集:每个对象都具有的属性集合。Class Baseclass Classlib Parentclass
事件:对象能够识别的一个动作,该动作可由用户或系统产生 如鼠标单击 最小事件集:所有VFP基类都能识别的事件。Init Destroy Error
方法:当用户的某个事件作用于对象上时,对象所产生的操作。实际上是一段过程代码 注意:对于一个对象,它的事件集合是固定不变的,用户不能定义新的事件。
但其属性集合和方法集合是可以无限扩充的。用户可以定义新的属性和方法。
例如:写CLICK事件代码,实际是创建与CLICK同名的方法程序,当该事件发生时, 则执行与该事件同名的方法程序。
4. 掌握基类、子类和父类的概念,类的类型;
基类:由VFP系统提供的类
子类:用户通过基类或其他类重新定义出来的新类。此新类就称为子类,而产生该子类的基类或其他的类就称为父类。
类的类型:
容器类:可以包含其他控件的类。例如:表单类、命令按钮组、页框类 面向对象程序设计
5. 6. 7. 8.
9. 非可视容器类:表单集Formset、页框Pageframe 容器类的组成部分:表单集(表单、工具栏) 页框(页面)表格(列)列(标题、控件) 选项按钮组(选项按钮)只能包含在组中,不能添加到表单 控件类:不可以包含其他控件的类。 例如:命令按钮类、文本框类 非可视控件类:用户自定义类Custom,计时器Timer 掌握引用对象、设臵对象属性和调用对象的方法程序的方法; 引用对象: 绝对引用:从容器的最高层次来描述对象的位臵。 相对引用:描述出相对于该对象的位臵信息。 相对引用的关键字:Thisformset Thisform This(当前对象) 相对引用的属性:Activeform Activepage Activecontrol Parent(该对象的直接容器) 对象容器的层次关系:是我们引用对象的依据 设臵对象的属性:属性窗口、在代码中设臵 引用对象.属性名称=属性值 调用对象的方法程序: 引用对象.方法程序的名称[(方法程序所必须的参数列表)] VFP中,部分方法没有参数,可以直接写方法名称。 Thisform.Setall(?Value?,20,“Textbox”)表示设臵当前表单中的所有文本框的value属性值为20 Thisform.Setall(?fontsize?,15) Thisform.Refresh 刷新表单 Thisform.Command1.Click 了解对象对事件的响应、容器层次与类层次中的事件发生情况以及事件的激发顺序 对象对事件的响应:如果某个对象没有指定事件代码,它不会去执行它容器的事件代码, 而是在类的层次上寻找相关代码。对象只会响应发生在该对象上的事件 特例:命令按钮组和选项按钮组 它们里面的子对象如果没有写相应的事件代码, 则会执行该容器的事件代码,而只要它们的子对象有代码,则肯定会执行自身 的代码。在容器层次上寻找代码 事件的激发顺序: 表单:Load Init(子对象) Init(表单) Activate …… Destroy Unload 焦点: When(得到焦点之前) Gotfocus Valid(失去焦点之前) Lostfocus 了解最小事件集和核心事件集; 最小事件集:所有基类均能识别的事件。 Init Destroy Error 核心事件集:所有对象都能识别的事件,常见事件 Init(创建对象时发生) Destroy Load(表单对象才具有) Click Dbclick Rightclick When Valid Gotfocus Lostfocus Interactivechange(当对象的value属性值发生改变时) Keypress(键盘击键产生) Error Timer(计时器控件特有事件) Activate 注意keypress事件中的nkeycode(按下键的键值)参数的作用 了解事件驱动和事件循环的概念; 事件驱动:当某个事件发生,从而导致跟事件同名的方法程序的运行 建立事件循环: Read Events 取消事件循环: Clear Events 掌握常用事件的方法(见《大纲》)
10.
11.
12.
13. 常用方法:Addobject(向容器中添加对象) Additem (Ctring[,n])向列表框添加数据项 Clear(清除列表框中的数据项,且只有当其数据源类型为“0—无”时有效) Hide Refresh 当对象值发生改变,则需要刷新 Release Setfocus(可接受焦点对象设臵焦点) Show Quit(终止程序运行) 当调用show方法时,同时会产生activate事件 Setall(可以对容器中的所有对象或某一类对象的某个属性进行设臵) 常见属性:Activepage( 页框对象所特有,该属性值决定第几个页面处于最上层) Alignment (对齐方式) Autocenter(表单自动居中) Autosize Borderstyle(边框样式) Boundcolumn(该属性决定列表框和组合框的第几列与其value 属性绑定) Closeable(决定关闭按钮是否可用) Controlbox(决定表单是否有标题图标和右边的按钮) Maxbutton Minbutton Cancel Default Readonly(当该属性为真,控件数据只读,可接受焦点) Enabled(当该属性为假,该控件只读且不能接受焦点 ) Name(引用对象时的名字) Caption(对象的标题 )Passwordchar(设臵口令字符) Wordwrap(文本框是否多行显示) Interval(计时器控件的timer事件响应的事件间隔,以毫秒为单位) Sorted(列表框和组合框内容是否自动排序) Value(控件中的当前值,所有数据绑定型控件所具有) Increment(微调控件在鼠标单击时每次改变的增量) Multiselect(列表框是否支持多行选定) Curvature(形状控件的曲率0直角~99圆) 掌握表单向导和表单设计器的使用。 表单设计器工具栏、表单控件工具栏、布局工具栏、属性窗口、表单设计器主窗口 属性窗口:对象列表(用来选择表单所包含的对象) 掌握表单数据环境的设臵。 数据环境的作用:表单运行时,自动打开表单所基于的表,在表单退出时,自动关闭表 打开数据环境:表单设计器中,单击鼠标右键,在快捷菜单中选择 数据环境中的操作: 添加表和视图、移去表和视图 建立表之间的临时关系:从一张表的某个字段拖放到另一张表的某个字段。 特别注意:在一对多的表单数据环境中,一定要建立它们之间的临时关系。 设臵表和视图的属性:Alias,Readonly,Order,Filter,Exclusive 数据环境对象的名称:dataevironment、relation、cursor 通过数据环境创建对象:(直接通过拖放实现) 拖放数据 对象 整个表 表格GRID 逻辑字段 复选框checkbox 备注字段 编辑框editbox+标签label 通用字段 图象框img+标签 其他类型字段 文本框textbox+标签 掌握在表单中和在容器中添加、删除对象的方法。 在容器中添加对象时需要注意:首先要进入容器对象的编辑状态。(选定对象,在快捷菜单中选择编辑)例如:向表格的列控件中添加其他控件 掌握在表单设计器中设臵表单及表单中对象的属性方法。
设臵单个对象的属性
设臵多个对象的相同属性:
选定多个对象:按住shift,单击需要选定的对象 对象大小的统一、对齐,还可以利用布局工具栏
14. 掌握在表单设计器中编辑表单及表单中对象的事件处理程序代码和方法程序代码的方法。
打开代码编辑窗口:在窗口中,1、要先选定对象,2、再选定方法程序的名字
注意代码的位臵不要出错
15. 掌握表单的运行,向表单传递参数,从表单返回值。
表单的运行:do form 表单文件名
向表单传递参数:
1.给表单添加新的属性(将作为全局变量,在各控件代码中传递)
2.在表单的INIT事件中,输入代码:
parameters 参数列表 &&表单需要从外部接受参数
表单的新属性=参数 &&将参数值传递给表单的属性
3.在运行表单时,使用命令
do form 表单名 with 参数列表
16. 了解用编程方式创建表单的方法。
Createobject() 函数 :创建表单对象
Addobject 方法 :向表单中添加新对象
17. 了解单文档和多文档界面。
单文档界面:整个应用程序由一个窗口组成
多文档界面:整个应用程序由多个窗口组成
顶层表单:独立的、无父表单、无模式的表单
浮动表单:由子表单变化来的,包含于父表单,但可以不位于父表单中
子表单:包含在其他表单中的表单,它不能移出父表单
showwindow:当属性值为2时,该表单为顶层表单
desktop: .t. 表示该表单可位于屏幕任何位臵 (浮动表单)
.f. 表示该表单只能位于父表单中 (子表单)
一、 学习指导
下列对象只能包含指定对象:
CommandGroup命令按钮组 (CommandBoutton)
Formset表单集 (Form,ToolBar)
Grid表格 (Column)
Column列 (Header)
OptionGroup选项按钮组 (OptionBoutton)
PageFrame页框 (Page)
下列控件只能作为其容器类的集成部分,不能单独基于它们创建子类,不能单独放到表单中:
Column列、Header列标头、OptionBoutton选项按钮、Page页面
下列对象可以循环包含:
PageFrame->Page->PageFrame
Grid->Column->Grid
有些内容比较容易混淆。
1.容器类(Containers)、控件类(Controls)和容器(Container)、控件(Control) 容器类(Containers)是类的一种类型。
控件类(Controls)是类的一种类型。
容器(Container)容器类的一个基类,是一个具体的类。
控件(Control)控件类的一个基类,是一个具体的类。
2.子类有时称“自定义类”,而VFP基类中有一个类“Custom”中文也叫“自定义类”,因此严格的讲,
子类最好不要称“自定义类”,以免混淆。
1. 掌握下列常用控件的应用:
根据控件与数据的关系:数据绑定型控件 、非数据绑定型控件
文本框:textbox 显示、输入或编辑保存在表中的非备注型(1~254个字符)字段的数据 属性
controlsource:数据来源与去向 绑定字段
value: 当前值,给value赋初值,将决定文本框数据的类型
inputmask:输入掩码,同数据库表的字段输入掩码 X、A、9、#、$、.、, format:显示格式。同数据库表显示格式 A、D、K、L、T、!
passwordchar:口令字
aligement:对齐方式
事件
keypress:键按下时发生,先发生 nkeycode 参数系统自动返回键值
interactivechange:当value属性值改变时发生,后发生
gotfocus:此事件之前发生when事件
lostfocus:此事件之前发生valid事件
click
方法
setfocus:表示将光标移到文本框
编辑框:editbox 用来显示、输入或编辑大量文字
属性:
scrollbar:滚动条
其余属性同文本框
微调控件:spinner 用来显示、输入或修改数值型数据或字段
数据绑定型控件,且只能和数值型字段绑定
属性
controlsource:和它绑定的字段或变量
value:该控件的当前值
keybordhighvalue:由键盘输入的最大值
keybordlowvalue:由键盘输入的最小值
spinnerhighvalue:由鼠标输入的最大值
spinnerlowvalue:由鼠标输入的最小值
increment:由鼠标改变时的变化步长;默认为1.0
事件
click:
interactivechange:当value属性发生改变时产生
valid:事件代码运行结束后,如果违反规则,光标仍旧会位于原来的对象中
列表框(listbox)和组合框(combobox):用来显示一组预定的数据,数据为字符型 数据绑定型控件
属性
rowsourcetype:决定该控件的行数据源类型
rowsource: 行数据源,数据来源 可以是一列或者是多列
controlsource:数据的保存去向,和value属性绑定的字段
行数据源类型:10种 0— 无:此时可以通过additem(cstr) 方法来添加数据项,也可通过removeitem(n)来移除数据项,n表示数据项在列表框中的序号。也可通过clear方法来清除该对象中的所有数据。 1— 值:此时可以通过rowsource属性来指定一系列的值,它们之间用逗号分隔 2— 别名 当其数据源为表或视图且设臵足够的列数时,将按字段顺序依次输出所有字段;当列数小于字段数时,仅输出前面几个字段 3— SQL 当数据源为SELECT-SQL语句时,此时查询的结果必须输出到临时表 即SELECT语句中必须包含INTO CURSOR 子句 4— 查询 当其数据源为一个查询文件时 5— 数组 此数组必须先定义,一般在表单的LOAD事件中定义 6— 字段 此时可以选定表中的部分字段。第一个字段前需要加别名,其后的其他字段不能加别名,且用逗号隔开 7— 文件 类似于打开对话框中的路径下拉列表框 8— 结构 显示表文件的结构信息 9— 弹出式菜单 columncount:显示数据的列数,默认值为0,表示只有一列,如要增加一列,必须设臵为2 boundcolumn:决定第几列数据和其value属性绑定以及controlsource指定的字段绑定 value:该控件被选定的行的值 multiselect:该属性决定该控件是否支持多行同时选定 columnwidth:指定每一列的宽度,数字之间用逗号分隔 list:该控件所有数据项的集合,可通过list(n)来引用它的第n项,为字符型数据 listindex:返回当前选定数据项在列表框中的位臵(序号) 数值型数据 thisform.list1.removeitem(thisform.list1.listindex) listcount:数据项的个数(总行数) sorted:决定该控件中的数据是否自动排序 事件 interactivechange:当数据项选定被改变 click:此事件在interactivechange之前发生 方法: additem(cstr要添加进去的字符串,n位臵信息):当行数据源类型为0和1时 removeitem(n数据项的序号):当行数据源类型为0和1时 注意:当用该控件来实现一对多表单的数据访问时,要在数据环境中为两张表建立临时关系 组合框特殊属性: style: 为2时,表示是下拉列表框 等同于列表框,数据不能修改 为0时,表示是下拉组合框 等同于文本框+列表框,数据可以修改
标签:label 用来显示说明文字的,不能接受光标,也不能修改其数据,但可以通过代码修改 它是非数据绑定型控件
属性:
caption:标签中显示的说明文字
autosize:决定该控件是否自动根据内容的多少来调节其大小
borderstyle: 决定其边框样式
backstyle: 决定其背景是否透明
wordwrap: 决定标题文字是否支持多行显示
命令按钮(组):commandbutton(commandgroup) 用来完成某个或某组操作 它是非数据绑定型控件
属性
caption: 命令按钮上显示的文字
buttoncount: 命令按钮组中按钮的数目
cancel: 为真,表示按esc键产生该控件的click事件(等同于调用click) default: 为真,表示按enter键产生该控件的click事件
picture: 确定该按钮上显示的图片;用来形成图形按钮
style: 决定其按钮是标准按钮还是图形按钮
value: 命令按钮组具有的属性,表示按钮组中第几个按钮被点击
事件
click: 要注意命令按钮的click和按钮组的click事件之间程序代码写法的不同 命令按钮组的代码可以写在命令按钮中,也可写在组的CLICK事件中 选项按钮组:optiongroup 它用来实现从固定选项中选择单个结果,(单选) 是数据绑定型控件,可以和数值型字段或字符型字段建立关系
组中的选项按钮不能单独出现在表单中
属性
buttoncount: optionbutton(选项按钮)的个数
controlsource:绑定字段
value:具有两种数据类型,由value属性的初值决定采用哪种数据类型 字符型:初值为“无”;value属性的值为每个按钮的caption属性 数值型:初值为“0”;value属性的值为每个按钮的序号
用value属性可以决定按钮的初始选定状态
事件
click: 事件代码可以写在每个按钮中,
也可写在按钮组中(采用DO CASE 结构,由value属性值来判断单击了哪个按钮)
复选框:checkbox 用来表示逻辑型字段的数据
它是数据绑定型控件
属性
controlsource: 设臵绑定的字段
value: 具有两种数据类型 由value初值决定其采用哪种数据类型
逻辑型:.T. 选定 .F. 不选定 .NULL. 灰色
数值型:1 选定 0 不选定 2 灰色
value属性可以决定按钮的初始选定状态
style(样式):0 标准 1 图形
caption:说明文字
aligenment:对齐方式,决定说明文字是位于左还是右边
注意:一般可以用几个复选框来形成多项选择
事件
click:基于单个控件来写代码
表单集:formset
如何创建表单集:在表单设计器中,通过“表单“菜单中的“创建表单集“来实现 如何添加表单:在表单设计器中,通过“表单“菜单中的“添加表单“来实现 如何移除表单:方法同上
如何删除表单集:在系统菜单的“表单”菜单中
注意:当一个应用程序由表单集组成时,在退出时应该使用命令:
thisformset.release
而不能使用:thisform.release
表单之间的切换可以通过调用表单的 show 和 hide 方法实现
formcount:该属性表示表单集中表单的数目,任何时候都是只读。
Forms:该属性是表单集中表单的集合,通过forms(n)来引用第n个表单
页框(pageframe)页面(page):用来扩展表单的表面面积
非数据绑定型控件
属性:
pagecount:页框中页面的数目,默认为2
tabs :决定页框中页面的选项卡是否可见
tabstyle:用于指定页框的选项卡是两端对齐还是非两端对齐
tabstretch:用于指定页框的选项卡是堆积还是裁剪
页面的caption:指定页面选项卡上显示的文字
activepage:用于指定哪个页面为当前活动页面。该属性为数值型数据
事件:
activate 当某个页面被激活时发生
方法:
refresh 页面的刷新
注意:
怎样向页面上添加控件:先进入页框的编辑状态,选定指定的页面,添加控件
表格(grid)、列(column)和列标头(header);用来显示多行数据,一对多关系的子表
数据绑定型控件
属性:
columncount:表格中的列数,默认值为-1,表示输出表中的所有字段
注意:通过修改该属性,可以给表格添加列(添加在最后位臵),但如果想删除指定列,必须进入表格向导(生成器)
recordsourcetype:决定其数据源类型
recordsource:指定数据源
注意:1、要区分和列表框的数据源类型( rowsource,rowsourcetype)
2、数据源有:0 - 表 对于所有的表文件
1- 别名 对于视图,表文件
2- 提示
3- 查询 查询文件
4- SQL 查询命令,查询结果必须输出到临时表
Gridlines:决定表格中采用哪中网格线
列对象:通过表格的编辑状态来选定列
controlsource:与列绑定的字段(表格无此属性)
currentcontrol:当前列中起作用的控件名称
dynamicfontsize:条件格式编排,可以根据条件设臵不同行采用不同字号
dynamicforecolor:
例如:this.column2. dynamicfontsize=”iif(cj.cj<60,14,9)” &&该属性为字符型
列标头:
caption:列标头上显示的文字 backcolor:列标头的背景 注意区分:列的背景和列标题的背景 事件 afterrowcolchange:当光标在表格中移动时发生 方法: refresh:表格控件刷新 计时器:timer 能在指定的时间间隔内反复执行某段代码(操作) 非数据绑定型控件,非可视控件 属性: interval: timer事件产生的时间间隔。以毫秒为单位 enabled:启用和停用计时器控件 事件 timer: 该事件代码中存放需要重复执行的操作代码 方法 reset: 让计时器重新开始计时 线条(line)对表单起美化作用 属性 lineslant:决定线条的倾斜的方向 / 、 \ 形状(shape) 可用来画矩形、正方形、椭圆、正圆 属性 curvature:形状的曲率 0正方形~99正圆 图像;用来显示照片 OLE绑定型控件(引用对象)、OLE容器型控件(复制对象) 2.控件的访问键设臵。TAB键次序、启用和停用控件 设臵访问键:在对象的caption属性中加入“\<字母”,表示用ALT+字母可以实现该控件的单击 TAB键的次序:决定表单中TAB键改变光标位臵时的光标移动顺序 在表单设计器中,通过“查看”菜单的TAB键次序来设臵 也可在属性窗口,通过修改控件的TABINDEX属性来设臵 启用和停用控件:通过对控件的enabled属性设臵 enabled .f. 不能接受光标,也不能修改数据 readonly .t. 能接受光标,但不能修改
菜单和工具栏
1. 了解设计菜单系统和工具栏的目的、设计原则;
设计原则:
2. 掌握菜单的种类,用菜单/快捷菜单设计器设计一般菜单/快捷菜单的方法以及
菜单的种类:两类
一般菜单:常见的系统菜单
快捷菜单:通过单击鼠标右键来调用
菜单文件的存储:菜单文件.mnx 菜单备注文件.mnt
创建菜单的方法:
菜单设计器
快速菜单:基于VFP系统菜单,由用户修改后形成新的菜单
通过编程实现(不要求掌握)
3. 掌握菜单程序(.mpr)的生成、运行和恢复系统菜单的命令;
菜单程序文件(.mpr):是菜单的执行文件,每次修改菜单后,都必须重新生成
菜单的运行: do 菜单程序文件名.mpr
恢复系统菜单的命令: set sysmenu to default
4. 掌握为菜单项指定任务、定义热键和快捷键的方法以及设臵启用和废止菜单项的方法;
为菜单项指定任务:
菜单设计器中结果栏:命令、过程(多条命令)、菜单项、子菜单
在“显示”菜单的“常规选项”:
通用过程:是在菜单项没有指定自己的代码时,执行的公共过程代码
设臵代码:又称为初始化代码,在运行菜单时最先执行
清理代码:在菜单装入之后最后执行的代码
设臵菜单项的位臵:例如 在……之前、追加、替换(默认)
定义菜单热键(访问健):在菜单标题中设臵:\<字母
菜单的提示选项对话框
定义快捷键:CTRL+字母
启用和废止菜单项:跳过(当条件为真,该菜单项为灰色,表示当前不可用) 菜单的信息:当选定该菜单项时,在系统状态栏上显示的文本(要加引号) 菜单项的分组: “\-”产生分组线
5. 掌握SDI菜单的创建方法以及将SDI菜单附加到顶层表单的方法;
SDI菜单的定义:运行于顶层表单中的菜单,称为SDI菜单
创建SDI菜单:将一般菜单建立好,在常规选项对话框中选定顶层表单
创建SDI表单:将普通表单的showwindow属性设臵为2—作为顶层表单
执行SDI菜单:在SDI表单的INIT事件代码中输入命令:
do 菜单程序文件名.mpr with this ,.T.
执行菜单 do 菜单程序文件名.mpr with this ,?abc?
释放菜单 release menus abc extended
在菜单中释放表单: release form_name
6. 掌握创建自定义工具栏类的方法,以及将自定义工具栏添加到表单集的方法。
工具栏:类名toolbar 必须在类设计器中设计工具栏,然后将它添加到表单设计器中 注意:工具栏类可以在类设计器和表单设计器中添加删除工具栏中的控件
可以出现在工具栏中的控件:除表格控件以外所有可以出现在表单中的控件+separater 注意:如果表单要添加工具栏,必须先建立表单集,因为工具栏本身也是一个表单
类的创建
一、学习提要
1. 掌握用类设计器设计子类的方法,子类的存储(类库)及类库文件(.vcx, .vct);
创建类的方法:
类设计器:类名、派生于、存储类库 三个元素
表单设计器:另存为类 类名、存储类库 两个元素
命令:creat class(打开类设计器)
define class 子类名 as 基类名 of 类库文件名 &&在创建类的同时创建类库文件
create classlib 类库文件名 &&创建类库文件专用
2. 掌握添加子类的新属性、新方法以及为新方法编写方法程序;
添加子类的新属性和新方法同表单
注意:在表单设计器中,只能对表单添加新属性和新方法,不能对控件添加新属性和方法
3. 掌握将子类对象添加到表单中的方法;
通过项目管理器,直接拖放到表单设计器中
通过表单控件工具栏“查看类”按钮,添加类库,将自定义的新类显示在表单控件工具栏上
指定默认的表单类:在系统菜单的“选项”对话框中,在“表单”选项卡中来指定表单的模版类
4. 理解默认属性、事件和方法程序的默认过程的含义以及默认属性和默认过程的覆盖;
默认属性、事件、方法程序:指父类的属性、事件和方法,如果设计时,重新指定,则默认的值将被屏蔽(隐藏)
5. 掌握在子类中调用父类方法程序,在子类中防止基类代码的执行。
在子类中调用父类方法程序: &&需要同时执行原来和现在的代码
通过域操作符(::):可在事件代码中调用父类的任何事件代码
通过函数( dodefault()):只有在事件代码中调用父类的同名事件代码时可用该函数
子类中防止基类代码被执行:在代码第一行输入命令:NODEFAULT
注意:如果在通过类创建对象时,在某个事件代码中写入新的代码,则父类的代码自动屏蔽或者说自动被覆盖