2016-08-23 2 views
1

Стол открывается в папке, имя которой предоставляется пользователем.Расширение макроса VFP в заявлении USE

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

Обычно это нормально. Однако, если папка, имя которой предоставлено пользователем, имеет встроенное пространство, поэтому «Моя папка», инструкция USE терпит неудачу. Но эта команда работает успешно:

USE (lFilename) IN 0 . . . 

Есть ли какие-то правила, которые говорят, когда один следует использовать амперсанд (&) построить и когда следует использовать кронштейн построить? И это применимо только к заявлению USE?

Спасибо. Эндрю

+1

Никогда не используйте & когда() сделают. http://www.tomorrowssolutionsllc.com/Articles/Handling%20Code%20that%20Changes%20at%20Runtime.pdf –

+0

Спасибо, Тамара, очень полезно, и ваша статья явно ссылается на встроенные пространства, которые, по-видимому, являются исходной проблемой. –

ответ

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 косвенно объявит их закрытыми. Хорошая практика - объявить локальную, а также помочь с 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», должно быть расширено макрос.

+0

Thanks Cetin 1. Переменные lFolder, lFilename были объявлены локальными. Локальные переменные начинаются с «l» или даже «lc». Объявления не были показаны в фрагменте кода, но есть. 2. В разделе VFP9, afaik, GETDIR() возвращает строку с завершающим «\» (если она возвращает каталог); пожалуйста, поправьте меня, если я ошибаюсь! Ваш вызов ADDBS() не наносит вреда; но я не включил его. 3. Рекомендации по использованию м. - отметил. Как вы говорите, это может быть полезно в трудной петле. 4. Спасибо за это. Послушайте ваши советы и используйте выражение имени здесь. Очень признателен. –

+0

@ Andrew_46 - если вы цените долгий и вдумчивый ответ Цетина, было бы хорошо, если бы вы его разозлили. – Missy

+0

Да, это был длинный ответ, и я уверен, что это было хорошо. Еще раз спасибо Цетину. На самом деле комментарий Тамара включает очень полезную ссылку, которая подробно объясняет этот вопрос. –