2016-08-23 90 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的評論包含一個非常有用的鏈接,詳細解釋了這個問題。 –