FoxPro 命令
FoxPro 的命令通常以动词开头,用于执行特定的操作,如数据操作、程序控制、环境设置等,它们是构建应用程序的基础。

数据库操作命令
这是最常用的一类命令,用于对数据表(.DBF 文件)进行增、删、改、查。
| 命令 | 功能 | 示例 |
|---|---|---|
| USE | 打开或关闭一个表。 | USE customer (打开 customer.dbf)USE (关闭当前打开的表) |
| LIST / DISPLAY | 显示表中的记录。LIST 连续滚动,DISPLAY 分屏显示。 |
LIST FOR city = '北京' FIELDS name, phone (显示北京客户的名字和电话)DISPLAY STRUCTURE (显示表结构) |
| APPEND | 在表末尾添加一条或多条新记录。 | APPEND BLANK (添加一条空记录)APPEND FROM temp.dbf (从另一个表添加记录) |
| INSERT | 在当前记录前或后插入新记录。 | INSERT BEFORE BLANK (在当前记录前插入一条空记录) |
| DELETE | 为记录加上删除标记(*)。 | DELETE FOR age < 18 (标记年龄小于18的记录为删除)PACK (永久删除所有带标记的记录) |
| REPLACE | 修改当前记录或指定记录的字段值。 | REPLACE ALL salary WITH salary * 1.1 (所有员工工资涨10%)REPLACE name WITH '张三' FOR id = 1001 (修改ID为1001的员工姓名) |
| BROWSE | 打开一个浏览窗口,以表格形式查看和编辑数据。 | BROWSE FIELDS name, email, phone (只显示指定字段) |
| SUM / AVERAGE | 对数值型字段求和或求平均值。 | SUM salary TO total_salary (计算所有员工工资总和并存入变量)AVERAGE age FOR dept = '销售' TO avg_age (计算销售部平均年龄) |
| COUNT | 统计满足条件的记录数。 | COUNT FOR gender = '男' TO male_count (统计男性员工人数) |
| INDEX ON ... TO / TAG | 创建索引文件,提高查询速度。 | INDEX ON name TO idx_name (按姓名创建索引文件idx_name.idx)INDEX ON TAG employee_id ON id (在结构化复合索引中创建一个名为employee_id的索引) |
| SEEK / FIND | 在索引表中查找指定值。SEEK是函数式,更常用。 |
SEEK '王五' (查找姓名为'王五'的第一条记录) |
| SET FILTER TO | 筛选记录,使后续操作只作用于符合条件的记录。 | SET FILTER TO city = '上海' (之后所有操作都只针对上海的客户) |
程序流程控制命令
用于控制程序的执行流程。
| 命令 | 功能 | 示例 |
|---|---|---|
| IF ... ELSE ... ENDIF | 条件判断。 | IF salary > 10000?"高薪"ELSE?"普通"ENDIF |
| DO CASE ... ENDCASE | 多分支选择结构。 | DO CASECASE grade == 'A'?"优秀"CASE grade == 'B'?"良好"OTHERWISE?"及格"ENDCASE |
| DO WHILE ... ENDDO | 当型循环。 | n = 1DO WHILE n <= 10? nn = n + 1ENDDO |
| FOR ... ENDFOR | 计数循环。 | FOR i = 1 TO 5? iENDFOR |
| SCAN ... ENDSCAN | 遍历表中的所有记录。 | SCAN FOR gender = '女'DISPLAY name, titleENDSCAN |
| DO / DO CASE | 调用另一个程序(.PRG文件)。 | DO calculate.prg (执行calculate.prg程序) |
环境设置与系统命令
用于配置 FoxPro 的工作环境或与系统交互。
| 命令 | 功能 | 示例 |
|---|---|---|
| SET TALK ON/OFF | 控制是否将命令执行结果返回到屏幕,调试时通常为ON,程序中为OFF。 |
SET TALK OFF |
| SET DELETED ON/OFF | 控制是否忽略带有删除标记(*)的记录。 | SET DELETED ON (后续操作不处理已删除记录) |
| SET DEFAULT TO | 设置默认路径。 | SET DEFAULT TO c:\myproject |
| CLEAR | 清除屏幕。 | CLEAR |
| WAIT / ACCEPT / INPUT | 从键盘接收用户输入。 | WAIT "请按任意键继续..." TO var (接收单个字符)ACCEPT "请输入您的姓名: " TO name (接收字符串)INPUT "请输入年龄: " TO age (接收表达式) |
| DIR / COPY / ERASE | 文件操作命令。 | DIR *.dbf (显示所有DBF文件)COPY FILE old.dbf TO new.dbf (复制文件)ERASE temp.dbf (删除文件) |
FoxPro 函数
函数是执行特定计算并返回一个值的子程序,FoxPro 提供了大量的内置函数,涵盖了字符串处理、数值计算、日期时间、数据类型转换、数据库操作等多个方面。

字符串处理函数
| 函数 | 功能 | 示例 |
|---|---|---|
SUBSTR(cExpression, nStartPosition [, nCharactersReturned]) |
从字符串中提取一个子串。 | SUBSTR('Hello World', 7, 5) 返回 "World" |
ALLTRIM(cExpression) |
去除字符串前后的空格。 | ALLTRIM(' FoxPro ') 返回 "FoxPro" |
LEN(cExpression) |
返回字符串的长度。 | LEN('FoxPro') 返回 6 |
AT(cSearchExpression, cExpressionSearched [, nOccurrence]) |
返回一个字符串在另一个字符串中首次出现的位置。 | AT('Pro', 'FoxPro') 返回 4 |
UPPER(cExpression) / LOWER(cExpression) |
将字符串转换为大写/小写。 | UPPER('foxpro') 返回 "FOXPRO" |
IIF(lExpression, eExpression1, eExpression2) |
条件函数,如果条件为真,返回表达式1的值,否则返回表达式2的值。 | IIF(salary > 5000, "高", "低") |
数值计算函数
| 函数 | 功能 | 示例 |
|---|---|---|
INT(nExpression) |
返回数值的整数部分。 | INT(123.45) 返回 123 |
ROUND(nExpression, nDecimalPlaces) |
四舍五入。 | ROUND(123.456, 2) 返回 46 |
SQRT(nExpression) |
计算平方根。 | SQRT(16) 返回 4 |
MOD(nDividend, nDivisor) |
返回除法运算的余数。 | MOD(10, 3) 返回 1 |
MAX(eExpression1, eExpression2 [, eExpression3 ...]) |
返回表达式列表中的最大值。 | MAX(10, 20, 15) 返回 20 |
日期时间函数
| 函数 | 功能 | 示例 |
|---|---|---|
DATE() |
返回当前系统日期。 | DATE() 可能返回 {^2025-10-27} |
TIME() |
返回当前系统时间。 | TIME() 可能返回 "11:30:45" |
DATETIME() |
返回当前日期和时间。 | DATETIME() 可能返回 {^2025-10-27 11:30:45} |
YEAR(dExpression) / MONTH(dExpression) / DAY(dExpression) |
从日期中提取年、月、日。 | YEAR(DATE()) 返回当前年份,如 2025 |
CTOT(cTimeString) |
将字符串转换为日期时间型。 | CTOT('2025-10-27 10:00:00') |
TTOS(dExpression) |
将日期时间型转换为字符串。 | TTOS(DATETIME()) |
数据类型转换函数
| 函数 | 功能 | 示例 |
|---|---|---|
TTOC(dExpression) |
将日期时间型转换为字符串。 | TTOC(DATE()) 返回 "10/27/23" (格式取决于设置) |
CTOT(cTimeString) |
将字符串转换为日期时间型。 | CTOT('2025-10-27 10:00:00') |
VAL(cExpression) |
将数字字符串转换为数值型。 | VAL('123.45') 返回 45 |
STR(nExpression [, nLength [, nDecimalPlaces]]) |
将数值型转换为字符串。 | STR(123.45, 6, 2) 返回 " 123.45" |
TYPE(cExpression) |
返回表达式的数据类型。 | TYPE('123') 返回 "N" (Numeric)TYPE('DATE()') 返回 "D" (Date) |
数据库操作函数
| 函数 | 功能 | 示例 |
|---|---|---|
EOF() |
测试记录指针是否指向文件尾。 | IF EOF() ... |
BOF() |
测试记录指针是否指向文件头。 | IF BOF() ... |
RECNO([nWorkArea]) |
返回当前记录的记录号。 | RECNO() 返回 5 (表示当前是第5条记录) |
FOUND([nWorkArea]) |
测试最近一次的 SEEK, FIND, LOCATE 是否成功。 |
IF FOUND() ... |
DBF([nWorkArea]) |
返回当前工作区中打开的表名。 | DBF() 返回 "C:\DATA\CUSTOMER.DBF" |
FCOUNT([nWorkArea]) |
返回当前表的字段数量。 | FCOUNT() 返回 10 |
命令与函数的结合使用
在实际编程中,命令和函数经常结合使用,以实现更复杂的功能。
示例1:循环并处理记录
* 假设已打开一个员工表 employee.dbf
* 目标:找出所有销售部的员工,并计算他们的平均工资
SET TALK OFF * 关闭命令回显
USE employee * 打开员工表
* 使用SCAN循环遍历所有销售部员工
SCAN FOR department = '销售'
* 在循环体内,可以使用函数处理当前记录的字段
? "员工姓名: " + ALLTRIM(name) + ", 工资: " + LTRIM(STR(salary))
ENDSCAN
* 使用函数计算平均值
AVERAGE salary FOR department = '销售' TO avg_sales_salary
?"销售部平均工资为:", avg_sales_salary
USE * 关闭表
SET TALK ON * 恢复命令回显
示例2:使用函数作为命令的参数
* 目标:根据用户输入的ID查找员工信息
CLEAR
INPUT "请输入要查找的员工ID: " TO search_id
* 使用SEEK命令查找,其参数是一个表达式
* 使用STR()函数将数值型的search_id转换为字符串,因为ID字段可能是字符型
SEEK LTRIM(STR(search_id))
* 使用FOUND()函数判断是否找到
IF FOUND()
? "找到员工!"
DISPLAY * 显示当前记录
ELSE
? "未找到ID为 " + LTRIM(STR(search_id)) + " 的员工。"
ENDIF
- 命令:以动词开头,执行一个动作,如打开表、添加记录、循环等,它们通常改变程序的状态或环境。
- 函数:通常以函数名加括号的形式出现,执行一个计算并返回一个值,它们可以嵌入到表达式中,作为命令的参数或赋值给变量。
掌握 FoxPro 的命令和函数是开发 FoxPro 应用程序的关键,虽然 FoxPro 已经过时,但其数据库操作思想、命令式编程风格和面向过程的逻辑,对于理解数据库系统和学习其他编程语言(如 SQL, Python 等)仍然具有很好的参考价值。

