2016-08-23 13 views
1

名前がユーザーによって指定されているフォルダにテーブルが開かれています。USEステートメントでのVFPマクロの展開

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

これは通常正常に動作します。ただし、ユーザーが指定した名前のフォルダに「My folder」などの埋め込みスペースがある場合、USE命令は失敗します。しかし、この命令が正常に動作します:

USE (lFilename) IN 0 . . . 

は1つが1ブラケット構造体を使用する必要があるとき構築し、アンパサンド(&)を使用する必要があるとき言うすべてのルールはありますか?これはUSEステートメントにのみ適用できますか?

ありがとうございました。アンドリュー

+1

&()を使用しないでください。 http://www.tomorrowssolutionsllc.com/Articles/Handling%20Code%20that%20Changes%20at%20Runtime.pdf –

+0

ありがとうTamar、非常に参考にして、あなたの記事は明白に埋め込まれたスペースを参照しています。 –

答えて

1

そのコードを書くための適切な方法は次のとおりです。 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」)を保持している可能性があり、「名前式」として使用できず、マクロ展開が必要です。

+0

ありがとうCetin 1.変数lFolder、lFilenameはローカルとして宣言されています。ローカル変数は 'l'または 'lc'で始まります。宣言はコードフラグメントには表示されませんでしたが、そこにあります。 2. VFP9、afaikの下で、GETDIR()は、終わりの '\'(ディレクトリを返す場合)を含む文字列を返します。私が間違っているなら私を修正してください!あなたのADDBS()呼び出しは問題ありません。私はそれを含めていません。 3. mの使用についての助言。 - 注目された。あなたが言うように、タイトなループで役に立つかもしれません。 4.ありがとうございます。あなたのアドバイスを受け取り、ここで名前表現を使用します。とても有難い。 –

+0

@ Andrew_46 - Cetinの長くて思いやりのある答えに感謝すれば、あなたが彼を鼓動させれば良いだろう。 – Missy

+0

はい、それは長い答えでした。私はそれがうまくいったと確信しています。 Cetinにもう一度感謝します。実際、Tamarのコメントには、この件について非常に詳しく説明する非常に役立つリンクが含まれています。 –

関連する問題