編寫代碼的正確方法是:
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」)並且不能用作「名稱表達式」,需要進行宏擴展。
永遠不要使用&when()會做。 http://www.tomorrowssolutionsllc.com/Articles/Handling%20Code%20that%20Changes%20at%20Runtime.pdf –
謝謝Tamar,非常有幫助,你的文章明確提到了嵌入式空間,這似乎是最初的問題。 –