VFP冲刺辅导.docx
- 文档编号:29371273
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:19
- 大小:23.54KB
VFP冲刺辅导.docx
《VFP冲刺辅导.docx》由会员分享,可在线阅读,更多相关《VFP冲刺辅导.docx(19页珍藏版)》请在冰豆网上搜索。
VFP冲刺辅导
第一次课
内容:
数据库、函数、程序结构、变量作用范围
项目、数据库和表操作:
上机操作为主,按惯例,12分
1、记录的修改,删除,运用UPDATE和DELETEFROM,几十条记录,
例如:
删除专业表中所有专业代号最末位为“1”的记录。
DELETEFROMzyWHERERIGHT(zydh,1)="1"
删除学生表中所有“99”级学生的信息
DELETEFROMxsWHERELEFT(xh,2)="99"
将所有kcdh为“01”的学生成绩加5分
UPDATEcjSETcj=cj+5WHEREkcdh="01"
假定cj中存放100分制成绩,cj5中存放5分制成绩,根据cj字段的值在cj5中填入数据。
规则为100分对应分,99~80之间对应4分,79~60之间对应3分,59~40之间对应2分,其余成绩对应1分。
UPDATEcjSET
Cj5=IIF(cj=100,5,IIF(cj>79,4,IIF(cj>59,3,IIF(cj>39,2,1))))
修改xh字段的值,若xh以“9”开头,则在其前插入“19”,否则则在其前插入“20”
UPDATExsSETxh=IIF(LEFT(xh,1)=”9”,”19”,”20”)+xh
2、字段标题、默认值、字段宽度
例如:
将学号字段的标题设置为“学号”,默认值设置为“2004”,宽度修改为10
将教师表的基本工资设置为能容纳6位整数和2位小数。
(9,2)
3、字段注释(字段说明)
例如:
为学号加入字段注释“学生的唯一编号”
4、格式、掩码
例如:
要求输入和显示学号时所有字母均转换成大写字母,在格式中输入!
要求学号接受6个字节的字符,且只接受数字,在掩码中输入999999
学号中可以输入任何字符,在掩码中输入XXXXXXXXX
5、字段有效性和出错信息
控制输入到字段中的数据的取值范围,在字段值改变时发生作用。
有效性规则用表达式来构造
例如:
设置姓名字段的有效性规则和出错信息:
姓名至少要有两个汉字
LEN(ALLTRIM(xm))=>4
性别必须为“男”或“女”:
xb="男".OR.xb="女"
将基本工资的有效性规则设置为“基本工资应该在0~2500之间”:
jbgz>0ANDjbgz<=2500
6、记录有效性
可以校验多个字段之间的关系是否满足某种规则。
例如:
工作年龄不能小于20,YEAR(gzrq)–YEAR(csrq)>=20,不要考虑月份日期。
学分大于或等于3的课程必须是必修课:
(xf=>3.AND.bxk).OR.xf<3
7、索引
索引表达式,一般在界面中设计,三种情况:
如果索引表达式为字符型表达式,则各个字段在索引表达式中的前后顺序将影响索引的结果,如xdh+xb与xb+xdh是不同的
如果索引表达式为算术表达式,则按照表达式的运算结果进行排序,如kss+xf,如果先按kss再按xf,应该STR(kss)+STR(xf)
不同类型字段构成一个表达式时,必须转换为同一类型,(通常为字符型)
索引中做个条件表达式,如xb+STR(jbgz),DTOC(gzrq,1)+STR(jngz)
创建普通索引kccj,要求先按kcdh排序,如果kcdh相同,再按cj排序,设置索引的过滤条件为cj<60:
kcdh+STR(cj))
8、插入/删除/更新触发器
性别为“女”不能删除,在DELETE中写:
xb<>”女”
xh以“99”考试不能更新,在UPDATE中写:
LEFT(xh,2)#"99"
删除出发器设置为不可以删除,在DELETE中写:
.F.
工号为空的记录可以删除,否则不可以,EMPTY(gh)或LEN(ALLT(gh))=0
允许修改2001(含2001年)以后参加工作的教师的记录,在UPDATE中写:
YEAR(gzrq)>=2001
工号为“A0001”的记录可以插入:
gh=”A0001”
9、永久关系和参照完整性
先设置一个住索引,在设置一个普通索引,一拖,1分来了,双击,一设置即可
大家只要看到设置参照完整性,就进入设置界面,依据题目要求就可以轻松完成,比如题目回要求设置“删除级联”或“当父表中记录被删除时,删除子表中所有相关记录”是一样的,只要进入了界面就一目了然,千万别想太多。
“如果在教师表中不存在匹配的关键字,则禁止在任课表中插入记录”,对应一找,为插入限制
10、会将表添加为项目中的数据库表或自由表,项目中文件的添加和移去
11、把项目中的文件设置为包含或排除
函数:
我们常用的
AT()
返回一个字符表达式或备注字段在另一个字符表达式或备注字段中出现的位置(从最左边开始计数)。
区分大小写。
a=”Itistimetogetup”
b=”is”
?
AT(b,a)&&4
c=”IS”
?
AT(c,a)&&0,表示未出现
?
ATC(c,a)&&4
?
AT(“信息”,“管理信息系统”)&&5
SUBSTR()
从给定的字符表达式或备注字段中返回一个子字符串
?
SUBSTR(“abcdefg”,2,3)&&”bcd”
?
SUBSTR(“abcdefg”,2)&&”bcdefg”
DBF()、DBC()
返回当前打开的表/数据库的路径和名称
ALLTRIM()
返回删除前后空格的字符串
?
ALLT(“vfp”)&&”vfp”
YEAR()
从指定的日期表达式或日期时间表达式的值中返回年份,数值型
?
YEAR(DATE())&&2004
MONTH()
从指定的日期表达式或日期时间表达式的值中返回月份值,数值型
?
MONTH(DATE())&&9
DAY()
从指定的日期表达式或日期时间表达式的值中返回某月的第几天,数值型
?
DAY(DATE())&&29
LEFT()
从字符表达式最左边一个字符开始返回指定数目的字符
?
LEFT(“abcdefg”,4)&&”abcd”
RIGHT()
从字符表达式最右边一个字符开始返回指定数目的字符
?
RIGHT(“abcdefg”,4)&&”defg”
STR()
将数值表达式的值转换为对应的字符串
?
STR(314.14,5,2)&&314.1
?
STR(314.14,5)&&314小数位数缺省为0
VAL()
返回由数字组成的字符表达式的数字值,忽略前面的空格。
若字符表达式的第一个字符不是数字,也不是加减号,返回0
?
VAL(“12”)&&12.00
?
VAL(“-12”)&&-12.00
?
VAL(“a12”)&&0.00
DTOC()
由日期表达式或日期时间表达式的值返回字符型日期。
参数1指定以年月日顺序且无分隔符的形式返回字符型日期。
?
DTOC(DATE())&&09/29/04
?
DTOC(DATE(),1)&&20040929
CTOD()
把字符型表达式的值转换成日期型数据
?
CTOD(“7/16/2004”)&&07/16/04
IIF()
根据逻辑表达式的值返回两个值中的一个。
x=60
?
IIF(x>=60,x+10,x-10)&&70
EOF()
测试记录指针是否指向了记录的结束标志
打开空表,.T.
GOTOBOTTOM,SKIP,.T.
Found()=.F.时.T.
FOUND()
查找下一条满足条件的记录,返回.T.或.F.
RECCOUNT()
返回记录个数
SEEK()
在一个已建立索引的表中搜索一个记录的第一次出现位置,该记录的索引关键字与指定表达式相匹配。
SEEK()函数返回一个逻辑值,指示搜索是否成功。
USExsORDERxh&&打开xs表
?
SEEK('990301')&&返回.T.,找到了记录
LEN()
返回字符表达式的值中字符的数目
?
LEN(“vfp”)&&3
宏代换,
搞搞清楚,将连字符&放在变量前,告诉VFP将此变量当作名称使用,并使用一个符号(.)来结束这个宏替换表达式。
X=”OFF”
SETTALK&X
b=”database”
a=”b”
&a=”vfp”
?
a,b,&a&&”b”,”vfp”,”vfp”
程序结构:
数学算法,按惯例5分
结构对称性:
如完型填空,上机改错,输入就有一分
如IF…ELSE…ENDIF
DOCASE…ENDCASE
FOR…ENDFOR
DOWHILE…ENDDO
SCAN…ENDSCAN
LOOP:
“短路”语句
EXIT:
无条件退出
完整性:
语句的结构完整、RETURN、
例1:
下列程序用来求0~100偶数之和,请将它写完整:
N=0
S=0
DOWHILE.T.
IFN>100
_______
ELSE
S=S+N
ENDIF
N=N+2
ENDDO
答案:
EXIT
例2:
已知教师表(JS.DBF)已经按姓名(XM)建立索引,
阅读下列程序:
SELEJS
SETORDERTOxm
SEEK'王一平'
IFFOUND()
DISPLAY
ELSE
WAITWIND'查无此人'
ENDIF
如果要用SEEK函数完成上述相同的功能,应将程序改成:
SELEJS
SETORDERTOxm
IF________
DISPLAY
ELSE
WAITWIND'查无此人'
ENDIF
答案:
SEEK("王一平")
例3:
计算s=1!
+2!
+3!
+4!
+5!
s=0
p=___&&1
FORi=1TO5
p=p*i
s=____&&s+p
ENDFOE
?
s
例4:
函数RV()将任意给定的字符串倒序返回
FUNCTIONRV
PARAMETERch
I=0
Mch=””
DOWHILEI Mch=Mch+SUBSTR(ch,LEN(ch)-I,1) I=I+1 ENDDO RETURNMch 子程序: SETPROCTOxx打开该过程文件即可 程序与函数的最大区别: 函数必须有返回值 返回: 程序RETURN,函数RETURN值 参数传递: 程序传址,函数传值,不提算了 接收: PARAMETER 变量的作用范围: LOCAL PRIVATE PUBLIC Command中默认全局 程序中默认私有 ppt例子 第二次课 内容: 查询和SQL语句 查询设计,按惯例8分 SQL(SELECT)命令按惯例20分 查询掌握双表查询,或者一个表,一个视图,相同的用法。 查询设计器中的各个选项。 ●已知xs表和cj表存在一对多关系,基于xs表和cj表查询学生的平均成绩,要求输出字段为: xh、xm、平均成绩。 结果按平均成绩从高到低顺序排序,查询结果的输出去向为屏幕。 SELECTXs.xh,Xs.xm,AVG(Cj.cj)AS平均成绩; FROMxs,cj; WHEREXs.xh=Cj.xh; GROUPBYCj.xh; ORDERBY3DESC; TOSCREEN ●在sjk数据库中,xs表xh的前两位数字和含义为年级,要求基于xs表,按学号字段的前两个数字(即年级)分组查询学生人数,要求输出字段为: 年级和人数,查询结果按字段年级的升序排序。 SELECTLEFT(Xs.xh,2)AS年级,COUNT(*)AS人数; FROMxs; GROUPBY1; ORDERBY1 ● 已知kc表和cj表存在一对多关系,基于kc表和cj表查询各课程不及格成绩中的最高分。 要求输出字段为: kcdh、kcm、不及格最高分。 查询结果按kcdh升序排列,查询结果的输出去向为临时表tmpb。 SELECTKc.kcdh,Kc.kcm,MAX(Cj.cj)AS不及格最高分; FROMkc,cj; WHEREKc.kcdh=Cj.kcdh; WHERECj.cj<60; GROUPBYCj.kcdh; ORDERBYKc.kcdh; INTOCURSORtmpb ●已知js表和rk表存在一对多关系,基于js表和rk表查询各教师的任课门数。 要求输出字段为: gh、xm、任课门数。 查询结果中只包含任课门数为2门或2门以上的教师。 SELECTJs.gh,Js.xm,COUNT(*)AS任课门数; FROMjs,rk; WHEREJs.gh=Rk.gh; GROUPBYRk.gh; HAVING任课门数>=2 ●基于xs表按学生的姓氏分组查询各姓氏的学生人数,要求输出字段为: 姓氏和人数。 查询结果按人数的降序排列。 SELECTLEFT(Xs.xm,2)AS姓氏,COUNT(*)AS人数; FROMsjk! xs; GROUPBY1; ORDERBY2DESC ●基于js表查询所有的系名,要求输出字段为ximing,查询结果中不允许出现相同的系名,查询结果按系名的升序排序,查询去向为临时表ximing。 SELECTDISTINCTJs.iming; FROMsjk! js; ORDERBYJs.ximing; INTOCURSORximing ● 基于xs表和cj表查询出cj表中的所有孤立记录的学号,要求查询结果中没有重复记录的学号,查询结果按学号升序排序。 SELECTDISTINCTCj.xh; FROMsjk! xsRIGHTOUTERJOINsjk! cj; ONXs.xh=Cj.xh; HAVINGXs.xhISNULL ●联接类型: 内联接: 两张表中仅满足条件的记录,这是最普通的联接类型 左联接: 表中在联接条件左边的所有记录,和表中联接条件右边的且满足联接条件的记录 右联接: 表中在联接条件右边的所有记录,和表中联接条件左边的且满足联接条件的记录 完全联接: 表中不论是否满足条件的所有记录 存在xs表和cj表,由于各种可能的原因,造成了cj表中孤立记录的存在,即cj表中的xh字段值是xs表中所没有的。 请基于这两张表查询出cj表中的所有孤立记录的学号,要求查询结果中没有重复的学号,查询结果按学号的升序排序,查询结果输出到临时表tmp SELECTDISTINCTCj.xh; FROMsjk! xsRIGHTOUTERJOINsjk! cj; ONXs.xh=Cj.xh; HAVINGXs.xhISNULL; ORDERBYCj.xh; INTOCURSORtmp ●基于xs和cj,查询某专业某课程成绩各分数段(99-90,89-80,79-70,…,9-0)的人数情况,99-90分数段用90表示,89-80分数段用80表示,79-70分数段用70表示,依次类推(提示: 某个成绩属于哪个分数段可用表达式INT(cj/10)*10求得),这里指定要查询的专业代号zydh为“110002”,课程代号kcdh为“01”。 要求输出字段为: 分数段、人数。 查询结果按分数段的降序排列。 ● SELECTINT(cj.cj/10)*10AS分数段,COUNT(*)AS人数; FROMsjk! xsINNERJOINsjk! cj; ONXs.xh=Cj.xh; WHEREXs.zydh="110002"ANDCj.kcdh="01"; GROUPBY1; ORDERBY1DESC ●基于js表和gz表查询每个教师的基本工资jbgz,住房公积金zfgj(按jbgz的8%提取)。 要求输出字段为: gh、xm、xb、jbgz、住房公积金,查询结果按gh的升序排序,且只输出住房公积金大于等于100的记录。 SELECTJs.gh,Js.xm,Js.xb,Gz.jbgz,jbgz*0.08AS住房公积金; FROMsjk! jsINNERJOINsjk! gz; ONJs.gh=Gz.gh; HAVING住房公积金>=100; ORDERBYJs.gh ●基于xs和cj查询99级学生成绩总分前3名。 输出字段为: xh、xm、xb、总成绩,查询结果按总成绩降序排序。 SELECTTOP3Xs.xh,Xs.xm,Xs.xb,SUM(Cj.cj)AS总成绩; FROMsjk! xsINNERJOINsjk! cj; ONXs.xh=Cj.xh; WHERELEFT(Xs.xh,2)="99"; GROUPBYXs.xh; ORDERBY4DESC ● 基于rkst视图和kc表,查询每个专业分别开了多少门必修课,多少门选修课。 要求输出字段为: zydh、zymc、必修课门数、选修课门数。 查询结果按zydh升序排序。 SELECTRkst.zydh,Rkst.zymc,SUM(IIF(Kc.bxk,1,0))AS必修课门数,; SUM(IIF(Kc.bxk,0,1))AS选修课门数; FROMsjk! rkstINNERJOINsjk! kc; ONRkst.kcdh=Kc.kcdh; GROUPBYRkst.zydh; ORDERBYRkst.zydh 如果上机,整条语句限于简单的, SELECT语句中要用各种函数,如SUM()、AVG()、MAX()、MIN()、COUNT()等。 会用短语,如INTOCURSOR、GROUPBY、ORDERBY、HAVING、WHERE HAVING和WHERE的区别: 前者针对结果集,后者针对原始数据 基于单张表的查询示例: 查询成绩表中的学号,不允许出现重复值 SELECTDISTINCTxhFROMcj SELECTxs.xh,cj.cjFROMsjk! xsINNERJOINsjk! cjONxs.xh=cj.xh 与SELECTxs.xh,cj.cjFROMxs,cjWHERExs.xh=cj.xh等价 基于多张表的查询示例: 显示每个学生的姓名、课程代号和成绩 SELECTxs.xm,cj.kcdh,cj.cj; FROMxs,cj; WHERExs.xh=cj.xh 含有计算字段的查询: 输出总分前5名的学生学习情况 SELECTTOP5xs.xh,xs.xm,SUM(cj.cj)AS总成绩; FROMxs,cj; WHERExs.xh=cj.xh; GROUPBYxs.xh; ORDERBY3DESC 查询教师表中女教师人数、总人数和女教师所占比例 SELECTSUM(IIF(xb=”女”,1,0))AS女教授人数,COUNT(*)AS总人数,SUM(IIF(xb=”女”,1,0))/COUNT(*)AS女教授比例FROMjs 基于视图的查询示例: xsst是一张视图,包含学生和系名信息,要求查询所有男生信息 SELECT*FROMxsstWHERExb=”男” 子查询示例: 显示js表中已担任课程教师的姓名和系名 SELECTxim.ximing,js.xm; FROMjs,xim; WHEREjs.xdh=xim.xdhANDjs.ghIN(SELECTrk.ghFROMrk) 查询专业表中尚未招收学生的专业 SELECT*FROMzy; WHEREzydhNOTIN(SELECTDISTINCTxs.zydhFROMxs) 组合查询示例: 查询各系科教师工资总额、各系科每个教师的工资以及全校所有教师工资总额。 要求结果中包含三个列: 系名、姓名和工资,并按系名排序。 SELECTxim.ximingAS系名,SPACE(8)AS姓名,SUM(gz.jbgz)AS工资; FROMxim,js,gz; WHERExim.xdh=js.xdh; GROUPBYxim.ximing; UNION; SELECTxim.ximingAS系名,js.xmAS姓名,gz.jbgzAS工资; FROMxim,js,gz; WHEREjs.gh=gz.ghANDxim.xdh=js.xdh; UNION; SELECT“总额”+SPACE(14)AS系名,SPACE(8)AS姓名,SUM(gz.jbgz)AS工资; FROMxim,js,gz; WHEREjs.gh=gz.ghANDxim.xdh=js.xdh; ORDERBY1 基于成绩表,查询各个分数段的学生得分人数。 要求结果中包含两个列: 分数段类型和数量,并按分数段类型降序排序。 SELECT“90~100”AS分数段类型,COUNT(*)AS数量; FROMcj; WHEREcj>=90; UNION; SELECT“80~89”AS分数段类型,COUNT(*)AS数量; FROMcj; WHEREcj>=80ANDcj<90; UNION; SELECT“70~79”AS分数段类型,COUNT(*)AS数量; FROMcj; WHEREcj>=70ANDcj<80; UNION; SELECT“60~69”AS分数段类型,COUNT(*)AS数量; FROMcj; WHEREcj>=60ANDcj<70; UNION; SELECT“60分以下”AS分数段类型,COUNT(*)AS数量; FROMcj; WHEREcj<60; ORDERBY1DESC 练习: ●要求查询结果输出去向是表文件cj1.dbf: SELECT*FROMcjWHEREcj>60INTOTABLEcj1.dbf ●已知教师表js.dbf(含有字段工号(gh,c,6),姓名(xm,c,8),基本工资(jbgz,N,7,2),系名(ximing,c,16))。 完成下列SQL命令以统计js表中系名为“信息管理系”的职工的平均工资,并将结果存放到临时表jstmp中。 SELECTAVG(js.jbgz)AS平均工资; FROMjs; WHEREximing=”信息管理系”GROUPBYximing; INTOCURSORjstmp ● 某数据库有下述结构的两张表brda和mxb,并且已经建立了一对多关系 病人档案表(brda) 病人取药明细情况表(mxb) 字段名 类型 宽度 字段名 类型 宽度 病历号 C 6 病历号 C 6 姓名 C 8 药品编号 C 8 性别 L 1 单价 N 7,2 年龄 N 3 数量 N 3 联系地址 C 40 日期
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VFP 冲刺 辅导
![提示](https://static.bdocx.com/images/bang_tan.gif)