函数(Function)不仅是一种数据元素,而且是许多软件常采用的一种数据处理手段,每一个函数都代表了一个特定的数据操作功能。Visual FoxPro函数有两种:一种是自定义的函数,一种是系统函数。自定义函数是用户根据需要自行编写的,系统函数则是由Visual FoxPro提供的内部函数,可以随时调用。
Visual FoxPro提供了几百个函数,熟悉了这些函数的含义和用法之后,可以极大地提高操作和设计程序的效率。这些函数主要分为:字符型函数、数值处理函数、表和数据库函数、日期时间函数、类型转换函数、测试函数、菜单函数、窗口函数、数组函数、SQL查询函数、位运算函数、对象特征函数、文件管理函数以及系统调用函数等。下面将讲解常用的一些函数。
字符处理是实现文字编辑的重要手段,字符处理的主要任务有:字符串测试、字符串截取、字符串的加长、字符串的生成、字符串的置换以及字符串的替换等。
常见的字符型函数见表4-5~表4-7。
表4-5 字符型函数表(字符位置、频数和长度测试)
语 法 |
功 能 |
举 例 |
AT(<字符表达式1>,<字符 表达式2>)[,<数字>]) |
检索字符表达式1在字符表达2中的位置,数字表示第几次出现 |
? AT("科技","Help科技") 5 |
RAT(<字符表达式1>,<字符 表达式2>)[,<数字>]) |
返回字符表达式1在字符表达式2的右边出现的位置 |
? RAT("世界","美国的世界") 7 |
ATC(<字符表达式1>,<字符 表达式2>)[,<数字>]) |
测定字符表达式1在字符表达式2中的位置 |
同AT函数 |
ATLINE(<字符表达式1>, <字符表达式2>) |
测定字符表达式1在字符表达2中的行号 |
|
RATLINE(<源字符表达式>, <给定字符表达式>) |
返回给定字符表达式在源字符表达式中出现的行号(从后向前搜) |
|
OCCURS(<源字符表达式>, <给定字符表达式>) |
返回字符表达式1在字符表达式2中出现的次数 |
? OCCURS("h","what's this") 2 (区分大小写) |
LEN(<字符表达式>) |
测定字符串的长度 |
? LEN("What's your name") 16 |
BETWEEN(<被测试的表达 式>,<低限>,<高限>) |
测定表达式是否在两个表达式之间,返回的结果为逻辑型 |
? BETWEEN(3*6,12,25) .T. |
续上表
语 法 |
功 能 |
举 例 |
LIKE(<字符表达式1>, <字符表达式2>) |
测定字符表达式1是否在字符表达式2之中 |
? LIKE("世界","Help科技") .F. |
EMPTY(<表达式>) ISNULL(<表达式>) |
测定表达式是否为空 判断表达式结果是否为NULL值 |
TT="HELP WorkRoom" ? EMPTY(TT) .F. |
ISALPHA(<字符表达式>) |
测定字符表达式的内容是否是字符 |
? ISALPHA(TT) .T. |
TYPE(<字符表达式>) VARTYPE(<表达式>) |
返回字符表达式的类型 测试表达式的类型 |
? TYPE("TT") ? VARTYPE(TT) C |
EOF([<工作区号>|<表别名>]) |
表文件尾测试函数,返回逻辑值 |
|
BOF([<工作区号>|<表别名>]) |
表文件首测试函数,返回逻辑值 |
|
RECNO([<工作区号>| <表别名>]) |
记录号测试函数 |
|
表4-6 字符型函数表(字符串截取、加长和置换)
语 法 |
功 能 |
举 例 |
SUBSTR(<源字符表达式>, <起始位置>[,<子串长度>]) |
取一个字符串的子串 |
AB=" HELP WorkRoom " ? SUBSTR(AB,5,4) Work |
LEFT(<字符表达式>, <字符个数>) |
从字符表达式的最左边取N个字符 |
? LEFT(AB,4) HELP |
RIGHT(<字符表达式>, <字符个数>) |
从字符串(字符表达式)的最右边,取N个(数字表达式)字符 |
? RIGHT(AB,4) Room |
TRIM(<字符表达式>) |
截掉字符表达式的尾部空格 |
? TRIM(AB) |
RTRIM(<字符表达式>) |
截去右边的空格 |
? RTRIM(AB) |
LTRIM(<字符表达式>) |
截去左边的空格 |
? LTRIM(AB) |
ALLTRIM(<字符表达式>) |
截去字符表达式中所有的空格 |
?ALLTRIM(AB) |
SPACE(<数字表达式>) |
设置数字表达式数的空格串 |
? SPACE(10)) 产生10个空格 |
REPLICATE(<要生成的 字符>,<重复次数>) |
重复生成一个指定个数的字符的字符串 |
? REPLICATE("*",10) ********** |
PADL(<字符串>,<总长 度>[,<填充字符>]) |
左边填充 |
A1="ABC" ? PADL(A1,7, "*") ****ABC |
PADR(<字符串>,<总长 度>[,<填充字符>]) |
右边填充 |
? PADR(A1,7, "*") ABC**** |
续上表
语 法 |
功 能 |
举 例 |
PADC(<字符串>,<总长 度>[,<填充字符>]) |
中间填充 |
? PADC(A1,5"-") -ABC- |
CHRTRAN(<源字符表达式>, <转换表1>,<转换表2>) |
字符转换 |
A1="foxpro" ? CHRTRAN(A1, "fp","FP") FoxPro |
STUFF(<字符表达式1>, <起始位置>,<替换长度>, <替换字符表达式>) |
指定起始位置字符串替换 |
? STUFF(A1,3,3, "PRO") FoxPRO |
STRTRAN(<字符表达式>, <原字符串>[,<替换字符串>] [,<始点>][,<替换次数>]) |
检索字符替换 |
? STRTRAN(A1, "f","F") Foxpro |
表4-7 字符型函数表(字符转换)
语 法 |
功 能 |
举 例 |
STR(<数字表达式>[,<数字1> [,<数字2>]]) |
将数字转换成字符 |
? STR(10.567,4,1) 10.6 (结果为字符型) |
ASC(<字符表达式>) |
返回字符表达式最左边字符的ASCII码 |
? ASC("HELP") 72 |
CHR(<字符表达式>) |
将数字转换为字符串 |
? ASC("72") H |
UPPER(<字符表达式>) |
将字符串转换成大写形式 |
?UPPER("FoxPro") FOXPRO |
LOWER(<字符表达式>) |
将字符串转换成小写形式 |
? LOWER("HELP") help |
&<内存变量>[,<字符表达式>] |
宏替换 |
A1="ABC",A2="A1" ? &A2 ABC |
常见的数值处理函数见表4-8。
表4-8 数值处理函数
语 法 |
功 能 |
举 例 |
VAL(<字符表达式>) |
将字符表达式的内容转换为数字 |
T1="98765.41" ? VAL(T1) 98765.41 (为数字型) |
续上表 | ||
语 法 |
功 能 |
举 例 |
INT(<数字表达式>) |
取整函数 |
? INT(&T1) 98765 |
MOD(<被除数>,<除数>) |
取余数 |
? MOD(14,5) 4 |
<被除数>%<除数> |
取模 |
? 128%5 3 |
ROUND(<数字>,<小数点位>) |
对小数点后面的数进行四舍五入 |
? ROUND(&T1,1) 98765.4 |
ABS(<数字表达式>) |
返回指定数字表达式的绝对值 |
? ABS(-754.45) 754.45 |
RAND([<数字表达式>]) |
返回0和1之间的随机数 |
? RAND() ? RAND(333) 0.34 0.12 (不定的数) |
SQRT(<数字表达式>) |
返回指定数字表达式的平方根 |
? SQRT(64) 8 |
PI( ) |
返回数字常数3.14159 |
? PI() 3.14159 |
ISDIGIT(<字符表达式>) |
测定字符表达式是否是数据0~9 (返回的值为逻辑值) |
? ISDIGIT(A1) .T. |
MAX(<表达式1>,<表达式2> [,<表达式3>…]) |
返回表达式的最大值 (返回的值为日期,数字) |
A1=735.6, A2=10.8 ,A3=345.2 ? MAX(A1,A2,A3) 735.6 |
MIN(<表达式1>,<表达式2> [,<表达式3>…]) |
返回表达式的最小值 (返回的值为日期,数字) |
? MIN(A1,A2,A3) 10.8 |
FLOOR(<数字表达式>) |
返回小于或等于表达式的最大整数 |
? FLOOR(A1) 735 |
CEILING(<数字表达式>) |
返回大于或等于表达式的最小整数 |
? CEILING(A1) 736 |
常见的日期和时间函数见表4-9。
表4-9 日期和时间函数
语 法 |
功 能 |
举 例 |
结 果 |
DATE( ) |
返回当前系统日期 |
? date() |
2007-01-23 |
YEAR(<日期表达式>) |
返回指定日期表达式的年 |
? year(date()) |
2007 |
续上表 | |||
语 法 |
功 能 |
举 例 |
结 果 |
MONTH(<日期表达式>) |
返回指定日期表达式的月 |
? month(date()) |
1 |
DAY(<日期表达式>) |
返回指定日期的该月的天数 |
? day(date()) |
23 |
DMY(<日期表达式>) |
以日月年的格式返回日期 |
? dmy(date()) |
23 一月2007 |
MDY(<日期表达式>) |
以月日年的格式返回日期 |
? mdy(date()) |
一月23 2007 |
CDOW(<日期表达式>) |
返回一个给定日期的星期几 |
? cdow(date()) |
星期二 |
DOW(<日期表达式>) |
返回一个给定日期的星期几 |
? dow(date()) |
1 |
CTOD(<字符表达式>) |
将一个字符表达式转换为日期 |
? ctod("2007-01-20") |
2007-01-20 |
DTOC(<字符表达式>) |
将日期转换为字符类型日期 |
? dtoc(date()) |
2007-01-20 |
CMONTH(<字符表达式>) |
返回指定日期表达式的月名 |
? cmonth(date()) |
一月 |
SECONDS( ) |
从午夜到现在已经过去多少秒 |
? second() |
60211.640 |
TIME([<数字表达式>]) |
返加当前系统时间 |
? time() |
16:44:30 |
DATETIME() |
当前日期和时间 |
? datetime() |
2007-01-20 16:44:30 |
逻辑函数主要用于对表达式进行测试判断,其函数格式和实例见表4-10。
表4-10 逻辑函数
语 法 |
功 能 |
举 例 |
结 果 |
BETWEEN(表达式,下限,上限) |
测试表达式是否在上、下限之间 |
? BETWEEN(30,11,75) ? BETWEEN(20,1,13) |
.T. .F. |
EMPTY(表达式) |
测试表达式是否为空 |
? EMPTY(ABS(13)) |
.F. |
TYPE("表达式") |
测试表达式类型 |
A1="ABC" ? TYPE("A1") ? TYPE(A1) |
C U |
IIF(逻辑表达式,表达式1,表达式2) |
逻辑表达式为真,返回表达式1 |
? IIF(40>27, "Yes","No") ? IIF(50<27, "Yes","No") |
Yes No |
INLIST(表达式1,表达 式2,…) |
测试表达式1是否在其他表达式中 |
? INLIST(40%5,1,2,5,6) ? INLIST(25%5,0,1,2,5) |
.F. .T. |
除了前面介绍的几种类型函数外,还有一些其他的函数,下面将依次进行讲解。
在程序设计或数据库操作过程中,经常要涉及文件路径问题。
(1)GETFILE()。
格式:GETFILE ([扩展名][,标题])
功能:打开系统内部的“打开”对话框,然后根据用户的选择返回文件名。
例如,取xsda.dbf的完整路径和文件名:
AA=GETFILE('PRG','请选择文件') &&打开如图4-3所示的对话框
? AA &&显示选择的文件名及路径
当选择xsda.dbf文件后,单击“确定”按钮,其显示结果为:
E:\Visual FoxPro程序设计\XSDA.DBF
(2)LOCFILE()。
格式:LOCFILE (文件名[,扩展名])
功能:打开系统内部的“打开”对话框,然后查找指定的文件名。
例如,搜索xscj.dbf的完整路径和文件名:
AB=LOCFILE('DBF') &&打开如图4-4所示的对话框
? AB &&显示查找的文件名及路径
当选择xscj.dbf文件后,并单击“确定”按钮,其显示结果为:
E:\Visual FoxPro程序设计\ xscj.dbf
图4-3 “打开”对话框 图4-4 查找指定的文件
(3)PUTFILE()。
格式:PUTFILE (提示[,文件名][,扩展名])
功能:将当前文件另存为一个指定的文件。
例如,输入如下命令,将打开如图4-5所示的“另存为”对话框。
AC=PUTFILE ("将文件另存","档案","PRG")
(4)CURDIR()。
格式:CURDIR(字符表达式)
功能:返回当前默认目录。
(5)GETDIR()。
格式:GETDIR([目录表达式[,对话框标题]])
功能:打开“选择目录”对话框,并指定目录。
例如,输入如下命令,将打开如图4-6所示的“选择目录”对话框。
AD=GETDIR("E:","当前文件夹的位置")
图4-5 “另存为”对话框 图4-6 “选择目录”对话框
在程序设计过程中经常要显示一些信息,例如提示信息、出错信息等,MESSAGEBOX()函数就是用于显示这些信息的。
格式:MESSAGEBOX(信息文本[,对话框类型][,对话框标题])
功能:以窗口形式显示信息,其返回值为数字。
对话框类型有很多种选择,具体情况见表4-11~表4-13。
表4-11 对话框类型对应的按钮
对话框类型值 |
对话框按钮 |
0 |
“确定”按钮 |
1 |
“确定”和“取消”按钮 |
2 |
“终止”、“重试”和“忽略”按钮 |
3 |
“是”、“否”和“取消”按钮 |
4 |
“是”和“否”按钮 |
5 |
“重试”和“取消”按钮 |
表4-12 对话框类型对应的图标
对话框类型值 |
对话框图标 |
16 |
“终止”图标 |
32 |
“问号”图标 |
48 |
“感叹号”图标 |
64 |
“信息”图标 |
表4-13 对话框类型对应的默认按钮
对话框类型值 |
对话框默认按钮 |
0 |
第1个按钮 |
256 |
第2个按钮 |
512 |
第3个按钮 |
在对话框中给定不同的类型值,则对话框中将显示不同的按钮、图标和默认按钮,注意类型值可以组合使用,如“1+64+0”表示使用“确定”和“取消”按钮、信息图标、默认值为第一个按钮。
例如,在命令窗口中输入如下代码:
AA=MESSAGEBOX("提示信息的内容",1,"对话框的标题")
此时屏幕上给出如图4-7所示的对话框。
在对话框中使用3个按钮,并使用“终止”图标的代码如下:
AA=MESSAGEBOX("提示信息的内容",3+16,"对话框的标题")
此时屏幕给出如图4-8所示的对话框。
图4-7 提示框 图4-8 带有图标的对话框
如果单击“是”按钮,输入“? AA”命令,则返回值是6;如果单击“否”按钮,输入“? AA”命令,则返回值是7;如果单击“取消”按钮,输入“? AA”命令,则返回值是2。