LIST 命令用于在 VFP 的主窗口中显示打开表中的记录,它与功能几乎完全相同的 DISPLAY 命令最主要的区别在于:当显示的记录超过一屏时,LIST 会连续滚动显示,而 DISPLAY 则会暂停并等待用户按任意键后继续显示下一屏。

基本语法
LIST [FIELDS FieldList] [Scope] [FOR lForCondition] [WHILE lWhileCondition] [OFF] [NOCONSOLE] [NOOPTIMIZE] [TO PRINTER [PROMPT] | TO FILE FileName] [NUMBER]
命令各子句详解
[FIELDS FieldList] - 指定要显示的字段
这是最常用的子句之一,如果不使用 FIELDS,默认会显示表中的所有字段。
- 语法:
FIELDS Field1, Field2, ... - 示例:
* 只显示员工表的员工号、姓名和职位 LIST FIELDS emp_id, emp_name, position
- 特殊用法:
FIELDS *: 显示所有字段,等同于不写FIELDS子句。FIELDS 字段表达式: 可以计算显示表达式的值。* 显示员工姓名和其年薪(假设月薪是 salary 字段) LIST FIELDS emp_name, salary * 12 AS annual_salary
[Scope] - 指定记录范围
用于限定命令操作哪些记录,范围选项有三种:
- ALL: 默认值,表示操作所有记录。
LIST FIELDS emp_name ALL * -- 虽然是多余的,但可以明确表示所有记录
- NEXT n: 从当前记录开始的 n 条记录。
USE employees GO 5 LIST FIELDS emp_name NEXT 3 * -- 从第5条记录开始,显示3条记录(5, 6, 7)
- RECORD n: 仅操作第 n 条记录。
LIST FIELDS emp_name RECORD 10 * -- 仅显示第10条记录
- REST: 从当前记录开始到文件末尾的所有记录。
GO 10 LIST FIELDS emp_name REST * -- 从第10条记录开始,显示到最后一条记录
[FOR lForCondition] 和 [WHILE lWhileCondition] - 指定记录筛选条件
这两个子句用于根据条件筛选记录,只显示满足条件的记录。
FOR lForCondition: 在整个指定范围内扫描所有记录,找出所有满足条件的记录,即使指针已经跳过符合条件的记录,FOR也会回溯查找。WHILE lForCondition: 从当前记录开始,一旦遇到不满足条件的记录,就立即停止扫描,不再检查后续记录。
示例对比:
假设员工表 employees 的记录如下:

RecNo dept_id emp_name
1 101 张三
2 102 李四
3 101 王五
4 103 赵六
5 101 孙七
USE employees GO 2 * -- 当前记录指针指向第2条 * 使用 FOR,会扫描整个表(ALL) LIST FOR dept_id = 101 * -- 会显示 张三(1)、王五(3)、孙七(5) * 使用 WHILE,从当前记录(2)开始扫描 LIST WHILE dept_id = 101 * -- 李四(2)的 dept_id 是 102,不满足,立即停止,一条记录都不显示。
FOR 用于“查找所有符合条件的”,WHILE 用于“从当前位置开始,连续符合条件的”。
[OFF] - 隐藏记录号
默认情况下,LIST 命令输出的左侧会显示记录号(RecNo),使用 OFF 可以隐藏这个记录号。
* 显示记录号 LIST FIELDS emp_name * 不显示记录号 LIST FIELDS emp_name OFF
[TO PRINTER [PROMPT] | TO FILE FileName] - 输出到打印机或文件
TO PRINTER: 将输出结果直接发送到默认打印机。TO PRINTER PROMPT: 在发送到打印机前先弹出打印对话框,用户可以选择打印机、设置份数等。TO FILE FileName: 将输出结果保存到一个文本文件中,如果文件已存在,默认会覆盖。
* 将所有员工信息打印出来 LIST TO PRINTER PROMPT * 将销售部门员工信息保存到 a.txt 文件 LIST FOR department = '销售' TO FILE a.txt
[NOCONSOLE] - 禁止在主窗口显示
当输出到打印机或文件时,如果不想同时在 VFP 主窗口看到结果,可以使用 NOCONSOLE。
* 保存到文件,但不在屏幕上显示 LIST TO FILE report.txt NOCONSOLE
[NUMBER] - 在输出中显示记录号
即使使用了 OFF 子句,NUMBER 子句也能强制在输出的最左侧显示记录号。

* 虽然 OFF 隐藏了默认的记录号,但 NUMBER 又把它加回来了 LIST FIELDS emp_name OFF NUMBER
这个子句用得相对较少,OFF 和不写 OFF 就能满足需求。
[NOOPTIMIZE] - 禁用 Rushmore 优化
VFP 有一个叫做 Rushmore 的技术,可以极大地优化 FOR 和 WHILE 子句的查询速度,在绝大多数情况下,你不需要关心这个,只有在你怀疑 FOR/WHILE 条件与 Rushmore 冲突导致逻辑错误时,才需要使用 NOOPTIMIZE 来禁用优化。
LIST 与 DISPLAY 的核心区别
| 特性 | LIST |
DISPLAY |
|---|---|---|
| 分页显示 | 否,记录超过一屏时,会自动向上滚动,直到显示完毕。 | 是,显示一屏后暂停,等待用户按任意键后继续显示下一屏。 |
| 默认范围 | ALL |
当前记录 (当不指定范围时) |
| 记录号显示 | 默认显示 | 默认显示 |
综合示例
假设我们有一个 products.dbf 表,包含字段 product_id, product_name, price, in_stock。
* 1. 显示所有产品的产品名称和价格 LIST FIELDS product_name, price * 2. 显示库存大于10的所有产品信息,不显示记录号 LIST FOR in_stock > 10 OFF * 3. 从当前记录开始,显示接下来的5条产品记录,只显示ID和名称 LIST FIELDS product_id, product_name NEXT 5 * 4. 将价格高于1000的产品信息打印出来 LIST FOR price > 1000 TO PRINTER PROMPT * 5. 显示所有产品,并将结果保存到 "products.txt" 文件中 LIST TO FILE products.txt * 6. 结合多个子句:显示所有"笔记本电脑"的ID、名称和库存,不显示记录号,并保存到文件 LIST FIELDS product_id, product_name, in_stock ; FOR product_name $ "笔记本电脑" ; OFF ; TO FILE laptops.txt
注意: 在 VFP 命令窗口中,如果一条命令太长,可以在行尾使用分号 来表示续行。
相关命令
DISPLAY: 功能与LIST几乎一样,主要区别在于分页。BROWSE: 以表格形式打开一个可编辑的窗口,查看和修改数据。REPORT FORM: 根据报表文件格式化输出数据,通常用于生成更复杂的打印报表。SET DELETED ON/OFF: 这是一个非常重要的环境设置,当设置为ON时,所有命令(包括LIST)都会忽略已标记为删除(DELETE)的记录。
希望这份详细的解释能帮助你完全掌握 VFP 的 LIST 命令!
