版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机等级考试复习资料
VFP常用编程命令及常用函数
常用编程命令及常用函数
注:在语法中如用方括号”[「'括起来的词句,表示可以不用。
常用命令
假设(if...endif)
循环(dowhile...enddo)
分支(dodcasc)
返回调用程序(return)
开关命令执行状态(settalkon/ofT)
赋值(store...to)
调用表单(doform)
启动事件处理(readevents)
结束程序(cancel)
调用子程序(do)
清除事件处理(clearevents)
常用函数
数值转换字符(str())
字符转换数值(val())
取系统日期(date。)
取天日(day。)
取月份(month。)
取年份(year。)
取整(intO)
四舍五入(round。)
删除标记(delete。)
找到记录(found。)
记录数(reccount。)
记录号(recno())
表结尾(eof())
消除前导空格(ltrim())
表开头(bof())
消除后续空格(trim())
假设语句
根据一逻辑表达式的值,有条件的执行一组命令。
语法:
IF逻辑表达式[THEN]
程序组1
[ELSE
程序组2\
ENDIF
参数:
建'簿走赵太代表一逻辑值,如果这逻辑值为真,系统执行程序组1,否则不执行程序组1,如果有else及程
序组2的话,则执行程序组2,如没有则什么也不执行,直接执行endif后面的语句。
备注:
在if...endif之间还可以有if...endif,即该命令是可以嵌套的。
then可以有也可以没有,对程序没有影响。
else及程序组2可以有也可以没有,但如果有的话,在逻辑表达式的值为假时,程序组2将被执行。
if与endif必须配对使用,即有一个if必须有一个endif,否则程序会出错。
举例:
例1:假如分数字段的值大于等于90,则让等级字段的值为“优”,并显示该记录。程序如下:
if分数>=90
replace等级with'优,
display
endif
例2:在数据库中可以把性别字段设为逻辑型,“真”代表“男”,“假”代表“女”,但显示时不能显示真、假,
否则别人看不懂,而应显示男、女,因此我们设一变量xb,根据性别字段的具体值,将xb的值设为男或
女,然后在需要的时候显示xb的值即可。程序如卜.:
if性别
xb='男'
else
xb-
endif
其中第一句:if性别,表示“假如性别为真”的意思,不要写成“if性别=.t.”。
以上程序也可以写成如下形式,效果相同:
if.not.性别
xb*
else
xb=W
endif
即,假如性别不为真的话,xb的值就为女,否则为男。
循环语句(dowhile...enddo)
根据条件重复执行•组程序。
语法:
DOWHILElExpression
Commands
[LOOP]
[EXIT]
ENDDO
参数:
lExpression为一逻辑表达式,其值如果是“真",即执行commands程序组,如果表达的值为"假”,则跳过
该段程序组,执行enddo后面的语句。
Commands当表达式[Expression值为真时所要执行的程序组。
LOOP此为dowhile...enddo命令的一个子句,它可以放在commands程序组中间的任何地方,当程序一
旦执行到该子句时,则返回dowhile重新执行。此子句根据需要可以有,也可以没有。
EXIT与loop一样是dowhile...enddo命令的一个子句,它可以放在commands程序组中间的任何地方,
当程序一旦执行到该子句时,则跳出循环,执行enddo后面的语句。此子句根据需要可以有,也可以没有。
备注:
程序一旦执行到dowhile语句,如果[Expression的值为真,则执行commands程序组,该程序组执行完
后,就到enddo语句,enddo会将程序返回dowhile再次验证lExpression是否为真,如仍是,则乂,次
执行commands,如此循环往复,直到lExpression为假,或遇上exit语句。
该语句可以嵌套,即循环中还可以有循环。
dowhile与enddo必须配对使用,即有一个dowhile必须有一个enddo否则程序会出错。
举例:
例1:在数据库中不断将记录指针往下移,直到数据库结尾。程序如下:
dowhile.not.eof()
skip
enddo
例2:在上面的例子加入此功能,当遇到性别字段为“女”时,跳出循环。程序如下:
dowhile.not.eoR)
if性别日女'
exit
endif
skip
enddo
例3:不断将记录指针往下移,当遇到数量字段的值大于等于600时退出循环,如遇到值小于400的,
将其值乘2,然后再检验一次是否大于600,如是则退出循环。程序如下:
dowhile数量<600
if数量<400
replace数量with数量*2
loop
endif
skip
enddo
分支语句(dodcasc)
根据不同的条件执行不同的程序组。
语法:
DOCASE
CASE逻辑表达式1
程序组1
[CASE逻辑表达式2
程序组2
CASE逻辑表达式〃
程序组n\
[OTHERWISE
程序组01
ENDCASE
参数:
CASE逻辑表达式程序组...当程序执行到docase时,便检验第一个case的逻辑表达式(逻辑表达式
/)是否为真,如不为真,接着检验第二个case的逻辑表达式,以此类推直到谡摩表送式〃。当检测到第
一个为真的逻辑表达式时,便执行跟随在其后面的程序组,执行完后跳过后面所有的case,接着执行
endcase后面的语句,也就是说即使后面还有为真的逻辑表达式也不执行了。
如果所有case后面的逻辑表达式都为假,则执行otherwise后面的程序组(如果有的话,otherwise及其
程序组是可以没有的,如果没有则什么都不做,直接执行endcase以后的程序)
备注:
在docase和endcase之间可以有任意多个case。
docase和cndcasc必须配对使用,即有•个docase必须有•个cndcase,否则程序会出错。
举例:
如果工资在200元以下,增加50%;300元以下,增加30%;500元以下,增加20%;其它增加10%。程
序如下:
docase
case工资v=200
replace工资with工资*1.5
case工资v=300
replaceL资with工资*1.3
case工资v=500
replace一匚资with工资*1.2
otherwise
replace.匚资with工资*1.1
endcase
在这里要注意一个问题,不能把300元的ease放在200元之前,否则•个100元的,按理应加50%,但
当遇到小于300元的case时,其逻辑表达式为真(小于200元的肯定小于300元),因此就会执行后面的
程序,加30%,并且执行完后,就不再执行其它的case了,这样就产生了错误的结果,所以应按从小到
大的顺序来排列。
赋值语句(store...to)
将一个数据赋给一个变量。
语法:
STORE表达式TO变量名表
参数:
走赵一式的值即为要赋给变量的数据。
变膏名表W为要被赋值的各变量。在这里可以是一个变量,也可以是多个变量,如果有多个变量,其间用",”
(逗号)隔开。
备注:
如果是给•个变量赋值,该语句可写成如下形式:
变量名=表达式
表达式可以是一个数值,也可以是一个算术式。
举例:
例1:将3赋给ab、xyz、jfz三个变量,程序如F:
store3toab,xyz,jfz
例2:将变量gz的值加10()赋给y短z。程序如下:
yfgz=gz+100
调用表单语句
运行一个由表单设计器设计的表单文件。该文件是经编译过的。
语法:
DOFORM表单文件名[NAME变量名[LINKED]]
参数
表图文岸名即是要运行的由表单设计器设计的表单文件名称。
支鬓名为调用该表单所用的变量名称,做为表单,不能直接用这的名称去调用它,必须将其赋给一个变量,
然后用这个变量来调用它。如果您不会在这个表单之外调用它,也可以不要这个变量。
在程序中产生的所有变量在程序运行结束后将被释放,即这些变量不再存在,因此也就无法继续调用这些
变更,如果为了调试程序需要在程序运行结束后在命令窗口中调用这个表单,必须加上linked子句。
举例:
在程序中调用xy7表单,并将赋给一个变量lucky,程序如下:
doformxy7namelucky
调用子程序语句(do)
运行一个VFP程序。当我们要在一个程序中调用另一个程序(子程序)时使用此命令。
语法:
DO程序名
参数:
瘗旅名即为被调用的程序名称。
备注:
如被调用的程序的扩展名是“prg”,调用时可不用带扩展名,否则要带上扩展名。
举例:
有一个程序,名称为xy7.prg,调用它的程序如下:
doxy7
返回调用程序语句(return)
返回调用本程序(该语句所在程序)的程序。
前面讲过调用子程序的语句,从一个程序A调用另一个程序B后,系统便开始执行B程序中的语句,到一
定时候往往要从程序B返|同程序A,便可使用该语句。
语法:
RETURN
备注:
程序A调用程序B,当从B返回A后,系统接着执行调用语句(dob)卜.面的一条语句。
举例:
程序a.prg如下:
dowhile.not.cof()
if工资<100
dob
endif
skip
enddo
程序b.prg如下:
replace工资with工资*1.5&&将工资增加50%
display&&显示出该记录,这样可以将所有增加了工资的记录显示出来
return
首先执行程序a.prg,当程序执行到dob语句时,便转去执行程序b.prg,在程序b中执行到return语
句时,又返回程序a,并接着执行dob的下一条语句endifo
启动事件处理语句(readevents)
启动VFP的事件处理程序。
语法:
READEVENTS
备注:
当该命令执行后,系统即停止继续执行后续的语句,这时我们可以调用之前所启动的菜单、表单等对象,
并用这些对象的事件程序去完成相应的任务,直到发出clearevents命令,系统才接着执行readevents后
面的命令语句。
可能初学者看了上面的内容还不是很清楚,不要紧,我们在后面课程中会进一步讲解。
清除事件处理语句(clearevents)
终止由readevents语句启动的事件处理程序。
语法:
clearevents
备注:
发出该命令后,系统将继续执行readevents之后的语句。
开关命令执行状态语句(settalkon/off)
确定是否显示VFP命令执行的状态。
语法:
SETTALKON|OFF
参数:
ON显示VFP命令执行的状态。
OFF不显示VFP命令执行的状态。
备注:
使用时,on、off二者之中必须选择一个。
很多VFP命令执行后,会显示执行后的结果状态,如locatefor命令执行,如找到记录的会显示被找到的
记录号,否则会显示“已到文件尾“,但般我们在程序中是不需要这些显示的,比如找到了记录就直接显
示出来,没找到一般用一个对话框来给出更清楚的提示,所以在程序一开始往往要将settalk关闭。
结束程序语句(cancel)
结束当前正在运行的所有程序,返回VFP或操作系统。
语法:
cancel
备注:
数值转换字符函数(str())
返回与指定数值表达式对应的字符。
语法:
str(教弦表送丸长久小数位数》
返回值的类型
字符型
参数:
数值表达式:要被转换为字符的数值表达式。
长度:转换后字符的长度。该长度等于小数点和小数点右边第个数字所占字符的数目总和。
如果指定长度大于所需长度,自动在前面加空格补齐。
如果指定长度小于所需长度,返回一串星(*)号,表示数值溢出。
如省略长度,则默认长度为10。
小数位数:指定返回字符串中的小数位数。
如指定位数小于实际位数,则返回值四舍五入。
如指定位数大于实际位数,则加0补齐。
如省略小数位数,默认为0。
在指定了小数位数的情况下,如指定长度(第二个参数)小于总长度,但大于整数长度,则返回对小数部
分做了四舍五入的字符。
备注:
返回后的值看起来还是数的形式,但它的数据类型已经变了,不再是一个数值,也就是不能再用来做加、
减、乘、除的算术运算,但可以和字符进行加减。比如:
?'季度'+1
就会出错,因为个字符是不能和•个数值相加的。写成如下形式就可以了:
?‘季度'+str(l,l)
结果是:
季度1
注意,这里一定要指定长度,否则由于默认长度是10,就会出现如下结果:
季度1
假如不知道数值有几位数怎么办呢?请参见ltrim()函数。
字符转换数值函数(val())
将数字组成的字符表达式转换成数字值。
语法:
字符表达中
返回值的类型
数值型
参数:
字符表达式:要被转换为数值的字符表达式。该表达式由最多16位的数字组成,若超过16位,则对其圆
整。
备注:
val()函数从左到右返回字符表达式中的数字,直到遇到非数值型字符(忽略前面的空格)时为止。
若字符表达式的第一个字符不是数字,也不是正、负号,则返回0。
举例:
a='123'
如果按下面的写法,就会出错,因为一个字符不能与一个数值相加:
?a+3
写成如卜形式便可以了:
?val(a)+3
结果是126o
取系统日期函数(date。)
返回由操作系统控制的当前系统日期。
语法:
date()
返回值的类型
日期型
取年份函数(year。)
从指定的日期表达式中返回年份。
语法:
year(日期表达式)
返回值的类型
数值型
参数:
日期走赵工G指定的日期表达式,该函数即是返回其年份值。
举例:
?year(date())
如果当前的系统日期是1999年2月5日,则显示的结果为1999。
取月份函数(month。)
从指定的日期表达式中返回月份。
语法:
month(日期表达式)
返回值的类型
数值型
参数:
厅购关送式:指定的日期表达式,该函数即是返回其月份值。
举例:
?month(date())
如果当前的系统日期是1999年2月5日,则显示的结果为2。
取天日函数(day。)
以数值型返回日期表达式是当月的第几天。
语法
day(日期表达式)
返回值的类型
数值型
参数:
日期麦米式:指定的日期表达式,该函数返回该日期是当月的第几天。
举例:
?day(datc())
如果当前的系统日期是1999年2月5日,则显示的结果为5。
取整函数(int())
返回数值表达式值的整数部分。
语法:
冰(数值表达式)
返回值的类型
数值型
参数:
魏成趣式:指定的数值表达式,该函数返回其整数部分。
举例:
?int(123.47)
结果是123o
四舍五入函数(round。)
对指定表达式进行四舍五入运算,并把结果返回。
语法:
round(教澹隆送式,小数位数)
返回值的类型
数值型
参数:
数值表达式•,指定的数值表达式,该函数返回其四舍五入后的值。
小初.数:保留的小数位数。
举例:
?int(123.457,2)
结果是123.46o
删除标记函数(delete。)
确定当前记录是否一做删除标记,若一做删除标记,返回真(」.),否则返回假(.£)。
语法:
delele([表切%Z作出
返回值的类型:
逻辑型
参数:
表别名\工作区:该参数指定所要确定的表的别名或所在工作区,即您可以在一个工作区去检测另一工作区
的表的记录是否做了删除标记,而另一工作区的表可用其别名或工作区号来指定。该参数如省略,隐含为
当前工作区,如有该参数的话,别名或工作区只选一个。
记录号函数(recno())
返回当前表或指定表中的当前记录号。
语法:
tecno汽表别名\工作区
返回值的类型:
数值型
参数:
表别名\工作区:该参数指定所要确定的表的别名或所在工作区,即您可以在一个工作区去得到另一工作区
的表的当前记录号,而另一工作区的表可用其别名或工作区号来指定。该参数如省略,隐含为当前工作区,
如有该参数的话,别名或工作区只选一个。
记录数函数(reccount。)
返回当前表或指定表中的记录数目o
语法:
reccount([表掰^Z作国)
返回值的类型:
数值型
参数:
发别名[工作区、该参数指定所要确定的表的别名或所在工作区,即您可以在•个工作区去得到另•工作区
的表的记录数,而另一工作区的表可用其别名或工作区号来指定。该参数如省略,隐含为当前工作区,如
有该参数的话,别名或工作区只选•个。
找到记录函数(found。)
如果locate>continue>seek等查找记录的命令成功(即找到了记录),该函数返回“真”(t),否则返回“假”(.£)。
语法:
found([表物名)_77作区|)
返回值的类型:
逻辑型
参数:
关切名1上作便:该参数指定所要确定的表的别名或所在工作区,即您可以在•个工作区知道另一个工作区
上次查找记录是否找到,而另一工作区的表可用其别名或工作区号来指定。该参数如省略,隐含为当前工
作区,如有该参数的话,别名或工作区只选一个。
举例:
locatefbr姓名士庄稼,
?found()
如找到记录,显示结果为」.,否则为.£。
表结尾函数(eof())
确定记录指针是否在表的结尾处。
语法:
eof([表别名\工作区D
返回值的类型:
逻辑型
参数:
表别名\工作区:该参数指定所要确定的表的别名或所在工作区,即您可以在一个工作区知道另一个工作区
表的指针是否在尾部,而另•工作区的表可用其别名或工作区号来指定。该参数如省略,隐含为当前工作
区,如有该参数的话,别名或工作区只选一个。
备*上:
这里所说的结尾处,并非是指最后一个记录,而是最后一个记录的后面,即没有记录。
举例:
gobottom
skip
?eofO
显示结果为t。
如果没有skip,仅仅走到最后一个记录,返回的将是而必须再往下跳一下才会是“真”结尾。
此时如输入命令:display,则没有记录显示。这一点与bof()函数不同。
表开头函数(bof())
确定记录指针是否在表的开头。
语法:
bof([表别名作区))
返回值的类型:
逻辑型
参数:
表别符工作区:该参数指定所要确定的表的别名或所在工作区,即您可以在一个工作区知道另一个工作区
表的指针是否在开头,而另一工作区的表可用其别名或工作区号来指定。该参数如省略,隐含为当前工作
区,如有该参数的话,别名或工作区只选一个。
备注:
这里所说的开头,并非是指第一个记录,而是第一个记录的前面。
举例:
gotop
skip-1
?bof()
显示结果为t。
如果没有Skip-1,仅仅走到第一个记录,返回的将是而必须再往上跳一下才会是“真”开头。
但与eof()函数不同,此时如输入命令display,将显示第一条记录。
消除后续空格函数(trim。)
将字符表达式的后续空格全部删除,并将结果返回。
语法:
trim(字符表达式)
返回值的类型:
字符型
参数:
字符表达式:指定的字符表达式,该函数将删除其后续空格。
备注:
trim。函数等同于rtrim()函数。
举例:
如表的“姓名”字段长度为10,当前内容为“张三”,那么如卜语句:
?姓名+'先生:'
其显示结果是:
张三先生:
而语句:
?trim(姓名)+,先生:'
显示结果是:
张三先生
消除前导空格函数(ltrim())
将字符表达式前面的空格全部删除,并将结果返回。
语法:
trim(字符表达式)
返回值的类型:
字符型
参数:完殍走赵三靠指定的字符表达式,该函数将删除其后续空格。
举例:
在讲史。函数时我们举过•个例,即把•个字符与一个数值相加时,应采用如下形式:
?'季度』str(l,l)
但是当我们没有办法确定这个数值的位数时,这个办法就行不通了,您不可能规定它的长度只能是1或2
等等。那么怎么办呢,采用ltrim()函数可以解决了:
?'项RT+ltrim(str(sz))
这里假设事先已有一个数值存入了sz变量,但不知道这个数值是几,也就更不知道有几位数,那么在隐含
状态下,str()函数将把sz转换为长度为10的字符,其前面可能有若干空格,通过ltrim()函数的处理,不论
前面有多少空格,都可以得到如卜.结果(假设数值是15):
项目15
更多编程命令
BLANK
COPYFILE
CALCULATE
COPYSTRUCTUREEXTENDED
FLUSH
FOR...ENDFOR
ONERROR
ONESCAPE
ONKEYLABEL
PACKDATABASE
SCAN...ENDSCAN
SETCONFIRM
SETDEFAULT
SETSKIPTO
SETSKIPOF
VALIDATEDATABASE
BLANK命令
如果发出该命令时不带任何参数,则清除当前记录中所有字段的数据。
语法
BLANK
FELDS字段名列表\
I范围\
[FOR条件]
[WHILE条灯
[NOOPTIMIZE]
说明
如果使用了字段名列表,则清除指定字段中的数据,另外也可以在字段名前面加上别名,以清除其它工作
区的衣中数据,但要注意•点,如果当前工作区的记录指针指在了表的末尾,那么它也不能清除您所指定
的其它工作区中的字段,即使其它工作区的记录指针没有指向末尾。
COPYFILE命令
复制文件。
语法
COPYFILE文件名1文件名2
说明
文件名中可以用“*”和"?",如*.prgo
要注意的一点是“文殍名2”必须有,比如:
copyfile*.prgtoc:\tcmp\*.prg
不象DOS的COPY命令可以没有目的文件名,而且命令中的“FILE”也一定要有。
COPYSTRUCTUREEXTENDED命令
将当前工作区的表结构信息复制到另表中。
语法
COPYSTRUCTUREEXTENDEDTO我文件名[FIELDS字段名为
参数说明
Filename:指定结构信息所存放的表文件名。
FIELDS字段名表:指定需要复制表结构中哪些字段的信息,如省略,则复制所有字段的信息。
说明
该命令将一个表的各字段信息复制到一个新表中,每个字段为一个记录,这是一个专门的表,其字段是固
定,这些字段分别记录各字段的字段名、长度、数据类型等等,各字段的字段名及其意义如下:
字段名数据类型意义
FIELD_NAME字符字段名。
FIELD_TYPE字符数据类型。C=字符型,丫=货币型,N=数值型,F=浮点型,1=整数型,B=
双精度型,口=日期型,T=日期时间型,1=逻辑型,乂=备注型,G=通用
型
FIELD_LEN数值字段长度。
FIELD_DEC数值小数位数。
FIELD_NULL逻辑字段是否可用null值。
FIELD_NOCP逻辑字段是否允许代码页翻译。
FIELD_DEFA备注字段的隐含值。
FIELD_RULE备注字段验证规则。
FIELD_ERR备注字段验证规则出错时的提示信息。
TABLE_RULE备注表验证规则。
TABLE_ERR备注表验证规则出错时的提示信息。
TABLE_NAME字符长表名。
INS_TRIG备注插入触发器代码。
UPD_TRIG备注更新触发器代码。
DEL_TRIG备注删除触发器代码。
TABLE_CMT备注表说明。
如图1,即为用COPYSTRUCTUREEXTENDED命令生成的rsda表的结构信息表,在这个表中就可以
看到rsda.dbf表的各字段情况。
那么用这个命令产生的结构信息表有什么用呢?这可以让我们在编程时改变一个表的结构,因为信息结构
表也是个表,我们可以象操作一般表•样去修改它的内容,当然修改时要遵从表结构的有关规定,比如字
段名不能超过10个字符,字段类型必须是上表中的字符之一,字段名不能重名等等。
当然我们修改了这个表后不会对原表马上产生作用,因为它们已经是分别独立的两个表,在物理上没有任
何联系,但我们可以首先使用以下命令:
CREATE表文件名FROM结构信息表文件名
根据结构信息表创建一个新表,再将原表的数据加到这个新表中,删除原表,将新表改为原表名,这样就
修改了表的结构。比如,我们要将rsda表部门字段的长度改为20,程序如下.:
selectrsda&&选择rsda表。
copystructuretorsdajgextended&&将rsda表的结构信息复制到rsdajg表。
usersdajg&&打开rsdajg表,同时关闭rsda表。
replacefieldJenwith20fortrim(field_name)=='部门,&&将部门字段的字段长度修改为20.
*实际上上一句的意思是将rsdajg表的field_name为“部门”的记录的field_len字段值改为20。
use&&关闭rsdajg表,要从这个表创建新表,必须聘其关闭。
creatersda2fromrsdajg&&从rsdajg中提取信息创建rsda2表。
appendformrsda&&从rsda表中获取数据。
erasersda.dbf&&删除rsda.dbf表。
renamersda2.dbftorsda.dbf&&将rsda2.dbf改名为rsda.dbf。
FLUSH命令
将表和索引中的数据存入磁盘。
语法
FLUSH
说明
当我们修改•个表时,修改完后,我们可能并不马上将表关闭,那么这时所做的修改可能只是在内存中,
而没有真正存到盘,如果这时死机或停电,那么,所以我们可以在程序适当的地方用此命令确保数据存
盘。
比如,我们可以在菜单中加个“保存”命令,该命令就调用FLUSH语句,供操作者在适当的时候调用此命
令来保存数据。
还可以用一个表单,在其中放一个计时器,在计时器的timer事件中用此命令,这样就做成一个具有自
动保存数据的功能,甚至可以在菜单中加•个设置计时器时间的命令,以供操作者设置自动保存数据的问
隔时间。
FOR...ENDFOR命令
按指定的次数循环执行一组命令。
语法
FOR变鼻初始值TO结束值STEP步长宦
命令组
[EXIT]
[LOOP]
ENDFORINEXT
参数描述
变量:指定一个变量作为计数器,该变量可以不预先存在,FOR命令会自动创建。
初始值TO结束值:即计数器的初始值和结束值,也就是指定循环的次数。
STEP步长值:设定计数器每次增加或减少的量,如果省略此子句,则每次增加1,比如forjsq=lto10,
那么将会循环10次,如果是forjsq=lto10step2,那么循环将会是5次,因为每循环1次计数器增加2,
从1到10只需增加5次就行了。
可能有人会问了,既然循环5次,那为什么不forjsq=lto5呢?这往往是为了在某些情况下使程序编起来
方便和易于理解,比如要对数据表中的记录进行某项操作,要求每隔一条记录做•次,起始和结束的记录
是根据具体情况变化的,也就是初始值和结束值都是变量,那么我们就可以使用步长子句,并将步长设为
2,这样就不用具体去计算到底需要多少次循环了,如果再加上步长也是变量,即有时隔一条记录,有时会
隔多条记录,则步长子句就更必要了。
注意步长的变化是指在不同次的完整循环中步长会变,一般在一次完整的循环中不要更改初始值、
结束值和步长。
另外步长可以是负的,这乂有什么必要?当我们需要根据-个数值不断减小来进行某项操作时就需要了,
比如我们需要对记录进行某项操作,这个操作要求先处理第10条记录,再第9条(因为在处理第9条时需
要根据第10条的情况),依次到第1条,那么我们就可以:
forjsq=10tp1step-1
*操作命令组
gojsq&&设上面的操作移动了记录指针,此时己不指在第10条记录上,则不能用skip-1将指针移到
第9条
cndfor
很明显,虽然可以用其它方法,但这样编出的程序最简洁,一目了然。
EXIT和LOOP:与DOWHILE中的意义一样。
说明
计数器只有在大于结束值时才结束循环,即当计数器等于结束值时仍要循环,也就是说:
forjsq=lto10
是循环10次,而不是9次,也就是当jsq的值为10时,还耍循环一次,当它为II时,则退出循环,执行
endfbr之后的程序。
注意DOWHILE...ENDDO与FOR...ENDFOR都是循环,它们有什么区别呢?在需要使用计数器的
情况下,由于FOR...ENDFOR不需要专门的计数语句,所以程序执行的速度快,因此能用FOR...ENDFOR
时尽量用。
ONERROR命令
设置一命令,当系统错误发生时,该命令执行。
这也就是程序员们常说的错误捕获陷井。所谓错误捕获陷井的意思就是在系统中启动一个监控程序,一旦
借误发生,这个监控程序就将错误捕获,并不让错误显示出来,可保证程序的继续运行,然后用一个命令
去对出现的错误进行处理,比如显示一个错误提示等。如果错误不发生,这个命令则始终不执行。
语法
ONERROR[命令]
参数说明
冷令:此即为指定的在捕获错误后所要执行的程序。一旦程序执行到某个语句发生错误,该命令即被执行,
执行完后,接着执行发生错误的卜一条语句。
提示有时为了对错误进行处理,一条命令可能是不够的,则可用该命令调用一个子程序,那么需要
在子程序执行完后才接着执行发生错误的下一条语句。如果子程序中有RETRY命令,该命令将使子程
序返回,并重新执行发生错误的语句,这个命令一般用在这种情况下,当子程序对错误进行了处理,使得
再执行该命令时不会发生错误了,这样就可以使程序按照正常情况运行卜法。
多学一招当处理错误子程序执行时,您还可以用ERRORO,MESSAGEO,LINE(),PROGRAM()等函
数返回出错的编号、信息、出错的语句所在行号以及出错的程序等,这些可能对处理错误有帮助。如省略
命令参数,则取消错误捕获陷井。
说明
ONERROR命令不能嵌套,也就是说在ONERROR所执行的子程序中不能再有ONERROR命令,否则
等于取消错误捕获。
示例
当DBF文件的结构化复合索引损坏时,如果您打开DBF文件就会出错,下面的例子就捕获错误并自动
修复索引:
*主程序
onerrordoxfsy&&设置错误陷井
usersda&&打开表,如果索引损坏,则会产生错误,xfsy程序将会执行
onerror&&取消错误陷井
cancel
*修复子程序
procedurexfsy&&修复子程序的过程名
erasersda.cdx&&删除索引文件
usersda&&打开表
indexon编号tagofrsda.cdx&&重建索引“编号"
indexon姓名tagofrsda.cdx&&重建索引“姓名”
ONESCAPE命令
设置一命令,当按了ESCAPE时I该命令执行。
语法
ONESCAPE
[命包
参数说明
命令:该命令即为指定的按下ESC键后所要执行的命令。
假设当程序执行到第10条语句时您按下了ESC,那么在波令执行完后,将接着执行第11条语句,如果俞
令是调用一个子程序,而子程序中有RETRY语句,则返回重新执行第10句。
说明
假如ONKEYLABEL命令也同时指定了ESC键,ONESCAPE所指定的命令优先执行。
如SETESCAPEOFF则该命令也不起用。
注意这个命令常常用来在•个循环中退出循环,比如:
onescapeexit
dowhile.t.
*循环体中的命令组
enddo
onescape
这样在循环中执行命令时,只要您随时动用您的玉指按下ESC键,即可令程序退出循环。
但别高兴得太早,上面这个程序在执行时常常出错,但也不是总出错,为什么呢?因为exit命令必须在循
环体中,假如程序正执行到dowhile或enddo,这时您动了玉指,程序就会出错,怎么解决这个问题呢?
这样:
onescapetc=.t.
tc=.f.
dowhile.t.
*循环体中的命令组
iftc
exit
endif
enddo
onescape
思考题:上面这个程序为什么不会出错?
ONKEYLABEL命令
指定一个命令,当键盘上某个键(也可以是组合键或鼠标)被按下后,该命令执行。
语法
ONKEYLABEL键名[命令]
参数描述
各键的键名如下:
键键名
<—LEFTARROW
—►RIGHTARROW
TUPARROW
DNARROW
HOMEHOME
ENDEND
PAGEUPPGUP
PAGEDOWNPGDN
DELDEL
BACKSPACEBACKSPACE
SPACEBARSPACEBAR
INSINS
TABTAB
SHIFT+TABBACKTAB
ENTERENTER
FltoF12F1,F2,F3...
CTRL+F1toCTRL+F12CTRL+Fl,CTRL+F2...
SHIFT+F1toSHIFT+F12SHIFT+F1,SHIFT+F2...
ALT+F1toALT+F12ALT+F1,ALT+F2,ALT+F3...
ALT+0toALT+9ALT+0,ALT+1,ALT+2...
ALT+AtoALT+ZALT+A,ALT+B,ALT+C...
CTRL+LEFTARROWCTRL+LEFTARROW
CTRL+RIGHTARROWCTRL+RIGHTARROW
CTRL+HOMECTRL+HOME
CTRL+ENDCTRL+END
CTRL+PAGEUPCTRL+PGUP
CTRL+PAGEDOWNCTRL+PGDN
CTRL+ATOCTRL+ZCTRL+A,CTRL+B,CTRL+C...
CTRL+0CTRL+0
RIGHTMOUSERIGHTMOUSE
BUTTON
LEFTMOUSEBUTTONLEFTMOUSE
MOUSEBUTTONMOUSE
ESCESC
ONKEYLABEL键名后面不跟命令则解除该键所要执行的命令(即解除所设的程序陷井)。
说明
该命令的用法与ONESCAPE的用法嵬本上是一样的。
注意该命令对于在系统菜单及系统对话框上的按键不起作用。
对于onmouse等命令,在鼠标点击件时不起作用。
示例
onkeylabelctrl+etc=.t.
tc=.f.
dowhile.t.
*循环程序组
iftc
exit
endif
enddo
onkeylabelctrl+e
PACKDATABASE命令
将数据库所有表中作了删除标记的记录物理删除,即真正从磁盘上删除。
语法
PACKDATABASE
说明
执行该命令时,数据库必须以独占方式打开。
该命令可用于在程序中定期清理数据库各表中的删除记录,因为软件可能经常要作删除,对大的表会影响
运行速度,所以可以在软件中设置setdeleteon,即隐去作了删除标记的记录,但这些记录并没有真正删除,
但这些垃圾记录太多了也对系统不利,故可设一功能由操作人员在需要时运行此命令来清理整个数据库。
SCAN...ENDSCAN命令
将记录指针由头到尾扫描一遍,每移动一次记录指针可执行一组命令。
类似于循环DO...ENDDO或FOR...ENDFOR,只是这是专门针对表的循环。
语法
SCAN[范阖[FOR[WHILE条件2、
1命令组\
[LOOP]
[EXIT]
ENDSCAN
参数描述
范围:在指定范围内扫描,即不从开头扫描到最后。
FOR条件1及WHILE条件2:只扫描符合条件的记录。
如果不带范围和条件子句,则隐含扫描表中的全部记录。
示例
库存日记帐表(字段有日期、入库数、出库数,库存数),每记录一笔出入库,则计算相应的库存数并放入
表中,有时意外情况可能导致库存数出错,因此需要有功能将库存数重新计算•遍,下面这个程序就是
完成这个功能:
gotop
dqkc=库存数&&记下第一条记录的库存数
skip&&跳到第2条记录
scanrest&&只需扫描从第2条记录起的所有记录
replace库存数withdqkc+入库数-出库数
dqkc=库存数&&记下当前记录的库存数
endscan
上面这段程序与下面这段程序是等价的:
gotop
dqkc=库存数&&记下第一条记录的库存数
skip&&跳到第2条记录
dowhile.not.eof()
replace库存数withdqkc+入库数-出库数
dqkc=库存数&&记下当前记录的库存数
skip
endscan
所不同的就是不用每次都skip,系统自动移动记录指针,这样程序运行的速度快,尤其对于按条件扫描的
情况就更快了,因为用do的话每次都要用locate或continue进行查询,速度很受影响。
与这段程序也是等价的:
gotop
dqkc=库存数&&记下第一条记录的库存数
skip&&跳到第2条记录
forjsq=2toreccount()
replace库存数withdqkc+入库数-出库数
dqkc=库存数&&记下当前记录的库存数
skip
endfbr
您喜欢用哪个呢?
注意上面第三段程序中有个小问题,在for语句中用了reccount()函数,而函数都要经过运算才能得
到结果,比起直接从•个变量中获取值要慢,假如只执行I次,两者相差无儿,但上面是用在循环中,for
这一句可能会执行几1万次,那么就会使速度降低很多,为此可改成下面这样:
jls=reccount()
forjsq=2tojls
SETCONFIRM命令
当输入的内容填满输入区域时是否需要按回车键跳出输入区域。
语法
SETCONFIRMON|OFF
参数描述
ON需要按回车键。也可以按TAB或其它箭头键等。
提示对表单上的文本框也起作用。当对于需要慎重输入的地方,可将其设置为ON,以便让操作者在
离开输入之前可再看一下所输入的内容有没有问题,如果不设置为ON,当输入内容输入满时,光标会口
动离开文本框,不利于发现错误。
OFF不需要按回车键(隐含)。
SETDEFAULT命令
设置隐含的驱动器及目录。
设置了隐含的路径,我们可以在程序运行打开每个隐含路径下的文件时不用再指定路径了。
语法
SETDEFAULTTO[弗符
参数说明
能径:可以是符合操作系统要求的任何路径,比如:
setdefaulttod:\soft\rsgl
setdefaultto\
setdefaultto..
注意如果路径中带有空格,必须用引号将路径括起来,否则会出错。比如:
setdefaultto"d:\soft\rsgl佳帆"
示例
当我们的程序在运行时,一般我们都需要知道该程序运行所在的目录,因为往往许多数据也是放在这个目
录下,我们不能指定一个绝对的路径,因为程序编好后可能拿到另一台电脑上用,其路径可能发生变化,
一旦变化便找不到所需要的数据文件了,因此我们必须有一种方法获取其当前所在的路径,有一种办法是
这样:
cxlj=sys(5)+sys(2003)+V
这在程序编译成独立EXE文件时运行是对的,但在VFP系统中运行PRG程序却不对,它返回的是VFP
所在的目录,为了解决这个问题,可采用如下程序:
CXLJ=SYS(16)&&获取当前运行的程序名及其所在路径
FORJSQ=1TOLEN(CXLJ)&&用一个循环找出最右边一个反斜线,将其后的程序名去掉,只剩路径
CXZF=LEFT(RIGHT(CXLJ,JSQ),1)&&从CXLJ的右边依次取出每个字符
IFCXZF='V&&查看这个字符是不是反斜线
CXLJ=STUFF(CXLJ,LEN(CXLJ)-JSQ+1,JSQ,")&&如果是,就将反斜线之后的字符全删掉并退出循环
EXIT
END1F
ENDFOR
SETDEFAULTTO"&CXLJ"&&用宏替换设置隐含路径,用引号是为了带空格的路径也能正确设置
SETSKIPTO命令
在表之间建立一对多关系。
语法
SETSKIPTO[表表2]...]
参数描述
表^2]...为一对多表中的子表的别名。可以有多个子表,它们之间用逗号隔开。
如省略此参数,则取消一对多关系,但一对一关系仍存在。
说明
我们用SETRELATION命令可创建表之间的一对一关系,也就是当我们将父表的记录指针移到某一个记
录上时,子表的记录指针也会移到相应的关联记录上,比如我们有一个人事档案(rsda,有字段编号、姓
名等),另有一个参加项目表(cjxm,有字段编号和项目,项目中记录该人员所参加过的项目,编号建立了
索引),然后用如F程序:
closeall
usersda
select0
usecjxm
setorderto编号
selectrsda
setrelationto姓名intocjxm
那么当我们将rsda的记录指针移到一个记录上时,cjxm也会移到相同编号的记录上,但由于是一对一关
系,只有cjxm中的相同编号的第1个记录会与rsda中的记录对应,其它的记录不会与之对应。
但我们知道一个人可能参加了多个项目,由于一对一的关系,我们没法从父表中知道子表中有多少个记录
与之对应,比如这时您在父表中键入如下命令:
display编号,姓名,cjxm,项目for编号士10,
那么只会有•条记录出现,因为rsda中只有•个编号为10的记录,虽然可能他参加了多个项目,但这
时不会显示出来,要想显示出来就必须建立一对多的关系,比如我们在rsda所在工作区键入如下命令:
setskiptocjxm
然后再运行上面的display命令,子表中所有对应的记录都会显示出来,即可看到10号人员所参加的所
有项目,而编号和姓名都是•样的。
怎么样,很不错吧!
这时如果您用browse看rsda表,假如cjxm中有多条编号为10的记录,您会发现10号记录下面会多
出几条记录来,它们的内容全部是“*”,且不可修改,这就是系统根据一对多关系增加的假记录,依靠这些
记录,上面的display命令才能带来我们想要的结果。
注意如果这时删除子表中的记录,且做了pack,那么关联将被解除,包括一对多和一对一,如仍需要
一对多关系,必须重新用setrelation和setskipto建立一对多关系。
思考题
大家思考下用setskipto是否能很好地解决问题。
在中文版VFP6.0中,有一些数据分布在三个数据库中,如A库中有各个企业的基本情况,在B库中有各
个企业的董事会组成成员情况,在C库中有各个企业的分支机构情况,三者可以通过企业编号进行索引,
其相互关系是:A库中一个记录即一个企业,对应于B库中的至少三个记录(即不同的组成成员),再对应
于C库中的至少三个记录(即不同的分支机构),现在的问题是,我如何能在一张页面上,同时打印A库
中的一条记录,B库和C库中的三条以上的记录。
SETSKIPOF命令
设置菜单或菜单项是否跳过,即是否可用。
语法
SETSKIPOFMENU主菜单名逻辑表达式
SETSKIPOFPAD主菜单项名OF主菜单名逻辑表达式
SETSKIPOFPOPUP子菜单名逻辑友达式
SETSKIPOFBAR子菜单项OF子菜单名逻辑表达式
参数描述
MENU主菜单名逻辑表达式
设置主菜单是否跳过,逻辑表达式为“真''时跳过,即整个菜单不可用,反之则可用。
例如,可以使用以下命令禁止VFP的系统菜单_MSYSMENU:
setskipofmenumsysmenu.t.
使用以下命令则启用它:
setskipofmenu_msysmenu.1.
PAD主菜单项名OF主菜单名逻辑表达式
设置主:菜单中某个菜单项是否跳过,如果设置为跳过,假如该项下有子菜单,则子菜单不能拉下来。
可用如下命令禁止VFP主菜单上的“编辑”菜单:
setskipofpad_msm_editofmsysmenu.t.
POPUP子菜单名逻辑表达式
设置某个子菜单是否跳过,如设置为跳过,该子菜单可以拉下,但其中的菜单项都不可用。
可用如下命令禁止VFP的“编辑”子菜单:
setskipofpopup_medit.t.
BAR子菜单项OF子菜单名逻辑表达式
设置某个子菜单中的某个菜单项是否跳过。
可以用下面的命令设置VFP“文件”子菜单中的“新建”不可用:
setskipofbarmfinewofmfiie.t.
说明
那么对于菜单设计器设计的我们自己的菜单怎样进行设置呢?其实当我们用菜单设计器设计好一个菜单并
完成生成后,就会生成一个扩展名为mpr的菜单程序,它与prg程序是一样的,我们可以用如下命令将
其打开来看:
modifycommandxxx.mpr
打开后我们就可以看到其中的主菜单名及其相应的主菜单项、子菜单、子菜单项等。下面便是一个mpr文
件:
*菜单的说明信息略
SETSYSMENUTO
SETSYSMENUAUTOMATIC
DEFINEPAD_s950ndhs4OFMSYSMENUPROMPT"系统录入及查询"COLORSCHEME3
DEFINEPAD_s950ndhs6OF_MSYSMENUPROMPT"系统维护"COLORSCHEME3
DEFINEPAD_s950ndhs7OFMSYSMENUPROMPT"统计"COLORSCHEME3
DEFINEPAD_s950ndhs8OF_MSYSMENUPROMPT”备份数据"COLORSCHEME3
ONPAD_s950ndhs4OFMSYSMENUACTIVATEPOPUP系统录入及
ONPAD_s950ndhs6OF_MSYSMENUACTIVATEPOPUP系统维护
ONPAD_s950ndhs7OFMSYSMENUACTIVATEPOPUP统计
ONPAD_s950ndhs8OF_MSYSMENUACTIVATEPOPUP备份数据
*主菜单即为_MSYSMENU
*主菜单中的菜单项分别为_s950ndhs4,_s950ndhs6等
*_s950ndhs4下的子菜单是“系统录入及“
*_s950ndhs6下的子菜单是“系统维护”
DEFINEPOPUP系统录入及MARGINRELATIVESHADOWCOLORSCHEME4
DEFINEBAR1OF系统录入及PROMPT"数据录入";
KEYALT+L,"ALT+L";
MESSAGE'录入房地产广告信息,
DEFINEBAR2OF系统录入及PROMPT”数据查询";
K.EYALT+C,"ALT+C";
MESSAGE'查询和修改录入的房地产广告信息,
DEFINEBAR3OF系统录入及PROMPT”数据整理”;
KEYALT+Z,"ALT+Z";
MESSAGE,如发现数据有问题,可调用此命令进行整理,如整理后仍有问题,请与软件供应商联系,
DEFINEBAR4OF系统录入及PROMPT
DEFINEBAR5OF系统录入及PROMPT"退出系统";
KEYALT+E,"ALT+E"
ONSELECTIONBARIOF系统录入及dosjlr
ONSELECTIONBAR2OF系统录入及doIrsjcx
ONSELECTIONBAR3OF系统录入及dosjzl
ONSELECTIONBAR5OF系统录入及clearevent
*”系统录入及”子菜单中的各菜单项为1、2、3等
*以下略
比如可以在程序中使“系统录入及查询”下的“数据整理”不可用,即“系统录入及”子菜单中的第3个菜单项,
命令为:
setskipofbar3of系统录入及.t.
我们知道在菜单设计器可为每个菜单项设置跳过表达式,那么这个命令还有什么用吗?有时用它还是比较
方便,比如我们要让•个子菜单中的所有菜单项不可用,我们可以设置该子菜单不可用,如用跳过要个
个菜单项去设,或者每个菜单项都设一个比较复杂的表达式,再要不就设调这个子菜单的主菜单项不可用,
那样又看不到子菜单中有什么内容了(有时虽然不可用但也想看看),总之是比较麻烦,那么用这个命令就
好一些。
不好的地方是要把mpr程序打开来记住那些菜单名、菜单项,你们也看到上面了,不是那么好记的。反正
这个世界没有十全十美的东西,我们只好将就点了。
VALIDATEDATABASE命令
保证当前库中表和索引位置的正确性。
语法
VALIDATEDATABASE
[RECOVER]
[NOCONSOLE]
[TOPRINTER[PROMPT]|TOFILE文件名\
参数描述
RECOVER:显示一个对话框,该对话框允许您定位表和索引,这些表和索引不在被检查的数据库,中。必
须在命令窗口中发出VALIDATEDATABASERECOVER命令,在程序中发布该命令会产生错误信息。
NOCONSOLE:如发现数据库中有错误,不向屏幕输出错误信息。
TOPRINTER[PROMPT]:打印错误信息。
TO文件名:将错误信息输出到一个文件。
说明
该命令确保数据库包含的表和索引处于正确位置,确保数据库中的表包含正确的字
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 矿山井下防灭火安全技术与应急处置培训
- 银行综合柜员个人工作述职报告(3篇)
- 2026北师大二下分苹果趣味课件
- 2026北师大二下回收废电池公开课课件
- 新苏教版科学五年级上册2-7《热辐射》表格式教学设计
- 数模与最优化
- Unit 2 School life Section 3 Expressing and communicating ideas Speaking 教学设计2026-2027学年沪教版英语七年级上册
- 2026四下数学小数的意义性质游戏课件
- 2026四下数学第五单元同步课件
- 预制剪力墙模板加固规范
- 2026年山东发展投资控股集团有限公司权属企业社会招聘(82人)考试备考试题及答案详解
- 2026年质量员(土建施工)基础知识模考试题(附参考答案解析)
- 2026中国农业大学烟台研究院非事业编实验系列管理服务岗工勤岗招聘4人(二)笔试题库含答案详解(综合题)
- 2026国企总部招聘笔试真题题库及标准答案(完整版)
- 2026湖北教师招聘统考安陆市城区义务教育学校招聘44人备考题库及答案详解一套
- 2026年职场化学品安全培训
- 13.3.1 等腰三角形的性质 课件(26张)初中数学人教版(2024)八年级上册
- 投标培训讲解
- TGDCKCJH048-2021紫外分析仪性能要求与检测方法
- 未成年人犯罪的预防与矫正法律机制
- 2025年地质勘查企业安全生产管理人员安全生产知识考题及答案解析
评论
0/150
提交评论