USE声明中的VFP宏扩展

时间:2016-08-23 07:33:21

标签: macros visual-foxpro

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

USE (lFilename) IN 0 . . .

这通常可行。但是,如果用户提供名称的文件夹具有嵌入空间,那么“我的文件夹”中的USE指令将失败。但是这条指令成功了:

create table expr(id int,epres varchar(max))

insert into expr values(1,'select 2+2')
insert into expr values(2,'select 2-1')


declare @sql varchar(max),@id int
select top 1 @sql = epres,@id=id from expr where epres is not null order by id
while @@rowcount > 0
begin
    exec(@sql)
    select top 1 @sql = epres ,@id=id from expr where id > @id order by id;
end;

是否有任何规则说何时应该使用&符号(&)构造,何时应该使用括号构造?这仅适用于USE声明吗?

感谢。安德鲁

1 个答案:

答案 0 :(得分:1)

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

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)最后,你原来的问题。文件名是"名称"所以不要使用宏扩展(&)运算符但是"名称表达式"任何有名字的地方。 A"名称表达"只是一组括号。如果某个东西是"名称",那么使用" name expression" (fieldName,fileName,folderName,variableName ...)。

除了规则之外,不幸的是,许多VFP开发者滥用了&并经常使用它。实际上,可能它只有很少的地方使用有意义,这是SQL条款。不是这样的:

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

(通常你也可以看到这种模式)但是这部分SQL使用宏扩展。即:

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

请注意,m.tableName是"名称"因此与"名称表达式"一起使用。 FieldList变量可能包含一个fieldName或一系列fieldNames(即:" CustomerId"或" CustomerId,CompanyName,ContactName")并且不能用作"名称表达式& #34;,需要进行宏扩展。