そのコードを書くための適切な方法は次のとおりです。 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 . . .
。この宣言がなければ、VFPはそれらを暗黙のうちに非公開と宣言します。 ISXのようなツールを使用する場合は、ローカル宣言すること、またインテリセンスに役立つことは良い習慣です。
2)addbs()を使用すると、バックスラッシュを使用できます。それはちょうど安全なコーディングです。
3)mを使用します。 (別名mdot)をメモリ変数として使用します。 mdotを使用すると、VFPにメモリー変数であることを明示的に伝えます。 mdotを使用すると害はありませんが、そうでないとバグを見つけにくくなります(タイトなループでも、mdotを使用する方がはるかに高速です)。
4)最後に、元の質問。ファイル名は "名前"なので、マクロ展開(&)演算子は使用せず、名前がある場所であれば "名前式"を使用します。 「名前表現」は単にかっこの集合です。何かが "名前"であれば、 "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」)を保持している可能性があり、「名前式」として使用できず、マクロ展開が必要です。
&()を使用しないでください。 http://www.tomorrowssolutionsllc.com/Articles/Handling%20Code%20that%20Changes%20at%20Runtime.pdf –
ありがとうTamar、非常に参考にして、あなたの記事は明白に埋め込まれたスペースを参照しています。 –