菜鸟科技网

vfp list命令如何高效查询数据?

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

vfp list命令如何高效查询数据?-图1
(图片来源网络,侵删)

基本语法

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 的记录如下:

vfp list命令如何高效查询数据?-图2
(图片来源网络,侵删)
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 子句也能强制在输出的最左侧显示记录号。

vfp list命令如何高效查询数据?-图3
(图片来源网络,侵删)
* 虽然 OFF 隐藏了默认的记录号,但 NUMBER 又把它加回来了
LIST FIELDS emp_name OFF NUMBER

这个子句用得相对较少,OFF 和不写 OFF 就能满足需求。

[NOOPTIMIZE] - 禁用 Rushmore 优化

VFP 有一个叫做 Rushmore 的技术,可以极大地优化 FORWHILE 子句的查询速度,在绝大多数情况下,你不需要关心这个,只有在你怀疑 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 命令!

分享:
扫描分享到社交APP
上一篇
下一篇