2016-08-23 92 views
1

在用户提供名称的文件夹中正在打开一个表。USE语句中的VFP宏扩展

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

这通常工作正常。但是,如果名称由用户提供的文件夹具有嵌入的空间,因此'我的文件夹',USE指令将失败。但此指令成功:

USE (lFilename) IN 0 . . . 

是否有该说什么时候应该使用号(&)构造以及何时应该使用支架构建任何规则?这仅适用于USE声明吗?

谢谢。安德鲁

+1

永远不要使用&when()会做。 http://www.tomorrowssolutionsllc.com/Articles/Handling%20Code%20that%20Changes%20at%20Runtime.pdf –

+0

谢谢Tamar,非常有帮助,你的文章明确提到了嵌入式空间,这似乎是最初的问题。 –

回答

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这样的工具,这是一个很好的做法,可以声明本地,也可以帮助intellisense。

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

3)使用m。 (又名mdot)的内存变量。使用mdot,你明确告诉VFP它是一个内存变量。使用mdot并没有什么坏处,但是如果你不这样做,你可能很难找到bug(并且在紧密的循环中,使用mdot证明它会快得多)。

4)最后,你的原始问题。文件名是一个“名称”,因此不要使用宏扩展(&)运算符,而是在名称的任何位置使用“名称表达式”。 “名称表达”只是一组括号。如果某物是“名称”,则使用“名称表达式”(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”)并且不能用作“名称表达式”,需要进行宏扩展。

+0

谢谢采蒂 1.变量lFolder,lFilename被声明为本地。局部变量以'l'或甚至'lc'开头。声明未在代码片段中显示,但在那里。 2.在VFP9中,afaik,GETDIR()返回一个带终止'\'的字符串(如果它返回一个目录);如果我错了,请纠正我!你的ADDBS()调用没有任何伤害;但我没有包括它。 3.关于使用m的建议。 - 注意到。正如你所说,它可能在紧密的循环中有用。 4.谢谢你。将采取你的意见,并在这里使用名称表达。非常感激。 –

+0

@ Andrew_46 - 如果你认识切廷的长期和深思熟虑的答案,如果你提高了他的话,这将是一件好事。 – Missy

+0

是的,这是一个很长的回答,我相信这是很好的意思。再次感谢切廷。事实上,Tamar的评论包含一个非常有用的链接,详细解释了这个问题。 –