Надлежащим образом, чтобы написать этот код:
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 косвенно объявит их закрытыми. Хорошая практика - объявить локальную, а также помочь с intellisense, если вы используете такие инструменты, как ISX.
2) Использование addbs() обеспечивает обратную косую черту. Это просто безопасное кодирование.
3) Использовать м. (aka mdot) для переменных памяти. Используя mdot, вы явно указываете VFP, что это переменная памяти. Использование mdot не наносит вреда, но если вы этого не сделаете, вы можете столкнуться с трудностями, чтобы поймать ошибки (а также в жестких циклах, это оказалось намного быстрее, используя mdot).
4) Наконец, ваш оригинальный вопрос. Имя файла является «именем», поэтому не используйте расширение макроса (&), но «выражение имени» в любом месте есть Имя. «Имя выражения» - это просто набор круглых скобок. Если что-то есть «имя», используйте «выражение имени» (имя поля, имя_файла, имя_папки, переменнаяName ...).
Помимо правил, к сожалению, многие разработчики VFP злоупотребляют & и используют его слишком часто. На самом деле, вероятно, в нем слишком мало мест, где использование имеет смысл, и это предложения SQL. Не что-то вроде:
lcSQL = "select * from ..." + ... + "..."
&lcSQL
(который часто можно увидеть эту картину, а), но это один, где часть SQL использовать макрораскрытие. то есть:
select &fieldList ;
from (m.tableName) ;
where &lcWhere ;
order by &lcOrder
Обратите внимание: m.tableName является «именем» и, следовательно, используется с «выражением имени». Переменная FieldList может содержать одно имя поля или ряд имен полей (например: «CustomerId» или «CustomerId, CompanyName, ContactName») и не может использоваться как выражение «name», должно быть расширено макрос.
Никогда не используйте & когда() сделают. http://www.tomorrowssolutionsllc.com/Articles/Handling%20Code%20that%20Changes%20at%20Runtime.pdf –
Спасибо, Тамара, очень полезно, и ваша статья явно ссылается на встроенные пространства, которые, по-видимому, являются исходной проблемой. –