USE 语句中的 VFP 宏扩展

VFP macro expansion in USE statement

正在用户提供名称的文件夹中打开 table。

lFolder = Getfile()
lFilename = lFolder + “mytable.dbf”
USE &lFilename IN  0 ALIAS  . . .

这通常工作正常。但是,如果其名称由用户提供的文件夹嵌入了 space,那么“我的文件夹”,USE 指令将失败。但是这条指令成功运行了:

USE (lFilename) IN 0 . . .

是否有任何规则规定何时应使用“&”结构以及何时应使用方括号结构?这是否仅适用于 USE 语句?

谢谢。安德鲁

编写该代码的正确方法是:

local lFolder, lFilename
lFolder = Getdir()
lFilename = addbs(m.lFolder) + 'mytable.dbf'

* or a single GetFile() to select the dbf directly

USE (m.lFilename) IN  0 ALIAS  . . .

这段代码不止一点: 1)将您的变量声明为本地变量。如果没有该声明,它将起作用并且 VFP 会隐式地将它们声明为私有的。如果您使用像 ISX 这样的工具,声明本地是一个很好的做法,这也有助于智能感知。

2) 使用 addbs() 确保反斜杠。它只是编码安全。

3) 使用 m。 (又名 mdot)用于内存变量。使用 mdot,您明确地告诉 VFP 它是一个内存变量。使用 mdot 没有坏处,但如果你不这样做,你可能会很难发现错误(而且在紧密循环中,事实证明使用 mdot 会更快)。

4) 最后,你原来的问题。文件名是 "name",因此不要在任何有名称的地方使用宏扩展 (&) 运算符,而应使用 "name expression"。 "name expression" 只是一组括号。如果某物是 "name",则使用 "name expression"(字段名、文件名、文件夹名、变量名...)。

除了规则之外,不幸的是许多 VFP 开发人员滥用 & 并经常使用它。在现实中,可能 using 有意义的地方太少了,那就是 SQL 子句。不是这样的:

lcSQL = "select * from ..." + ... + "..."
&lcSQL

(您也经常会看到这种模式)但是 SQL 的部分使用宏扩展。即:

select &fieldList ;
from (m.tableName) ;
where &lcWhere ;
order by &lcOrder 

请注意 m.tableName 是一个 "name",因此与 "name expression" 一起使用。 FieldList 变量可能包含单个 fieldName 或一系列 fieldName(即:"CustomerId" 或 "CustomerId, CompanyName, ContactName"),不能用作 "name expression",需要宏扩展。