FoxPro Club Главная

Конференция Решения Фотоальбом Сайт М.Дроздова Статьи Файловый архив Книга Visual FoxPro 9.0 Русский Help для Visual FoxPro
Пользователей: 9176
Вход

Мы пойдем другим путем

Дополнения к статье:

от Максимова Владимира
от Крылова Юрия


Использование dataenvironment в формах очень удобная штука.
Но, как и все приятное имеет неудобства.В частности там прописаны пути на базы. Обычно , при разработке работают как минимум с двумя экземплярами одной и той же базы. Грязной, отладочной и рабочей.
Если Вы работаете с exe модулем Вашей программы настроить путь на нужную базу проще простого. В Вашей головной программе читаем место, где прописано имя базы и путь к ней ( у меня это файл config.dbf) и делаем

Open database (m.db)
Set path to (m.pth) additive
При этом при работе форм пути в окружении игнорируются, и работает правильная база.


Однако в среде фокса ( или app) этот рецепт не помогает и работают те базы, которые попали в окружение. А хочется их когда нужно, переключать на разные базы.

Первое решение этого неприятнейшего вопроса принадлежит Jonh Koziol
Он написал программу ( можно взять в архиве файлов www.universalthread.com рубрика –кода), которая проходясь по окружению форм, сгенерит код, открывающий нужные таблицы. После этого код можно положить в load forms.

Неведомо почему, но этот рецепт опубликовал в этом году в FoxTalk Jim Booth.
К большому сожалению, это уже не первый случай, когда в литературе предлагают код, заведомо содержащий проблемы. ( примеры статей в FoxTalk про работу с буферизацией заведомо приводят к систематической порче индексных файлов)

Все там хорошо, но если у Вас были классы форм с гридом, а потом Вы цепляли recordsource в коде класса , а затем на базе этого класса создавали формы, будет пренеприятнейший эффект ошибки. Это связано с последовательностью срабатывания кодов. Кое-что в классах срабатывает раньше, чем следовало бы. К тому же таблицы как бы подключаются дважды- один раз в окружении , другой раз в load.

Другими словами , на какой то момент сначала подключается неправильная база, а уж только потом, та , которую хотим. Если поставите autoopen=.f.- будете иметь дополнительную работу по закрытию таблиц при закрытии формы

Предлагается несколько другой рецепт.
Во всех формах в окружении beforeopen table пишем
if type('goApp') = 'O'
goApp.ClearPathEnv(this)
endif


В пользовательском объекте goapp создаем метод ClearPathEnv , который отрывает одни пути на базу данных от курсоров и пришивает им другие.

В этом же объекте заводим векторное свойство aDataPath , где храним нужные переменные. Этот же объект в своем свойстве, которое заполняем в головной программе, читает путь на желаемую базу. Итак, и в режиме отладки в фоксе в любой момент можно переключать базу, куда это требуется

lparameters oThis
if type('this.aDataPath[1,1]') = 'L'
local ch, cName, cb, nCnt
nCnt = 0
cName = this.bazaname
DO WHILE .T.
ch = AT(";",cName)
IF ch > 0
cb=SUBSTR(cName,1,ch-1)
nCnt = nCnt + 1
dimension this.aDataPath[nCnt,3]
this.aDataPath[nCnt,1] = upper(substr(cb,rat('\',cb)+1) + '.dbc')
this.aDataPath[nCnt,2] = upper(cb + '.dbc')
this.aDataPath[nCnt,3] = upper(left(cb,rat('\',cb)-1)) 
ELSE
EXIT 
ENDIF
cName=SUBSTR(cName,ch+1)
ENDDO
endif
if type('oThis') # 'O'
return
endif 
local i, obj, nMember, aCursor[1], cDbc, j, nPos
nMember = amembers(aCursor,oThis,2)
for i = 1 to nMember
if 'CURSOR' $ aCursor[i]
obj = eval('oThis.' + aCursor[i])
if type('obj') # 'U' .and. upper(obj.baseclass) = 'CURSOR'
cDbc = upper(substr(obj.database,rat('\',obj.database)+1))
for j = 1 to alen(this.aDataPath,1)
if this.aDataPath[j,1] == cDbc
nPos = j
exit
endif 
endfor 
obj.database = this.aDataPath[nPos,2]
endif
endif
endfor


Дополнения к статье:

от Максимова Владимира
На сайте недавно опубликована Ваша с Сергеем Лебедевым статья "Мы пойдем другим путем" об изменении пути доступа к таблицам формы. Как мне кажется, есть более простой (хотя менее надежный) способ.

В BeforOpen у всех курсоров установить:
This.Cursor1.DataBase = "" , а конкретный путь к базе регулировать исключительно через SET PATH в командном окне (начальный путь в CONFIG.FPW)

Ненадежность его в том, что обычно в SET PATH указывают относительный, а не абсолютный путь к базе (т.е. зависят от установленной директории по умолчанию), да и кроме пути к базе необходимо иметь путь к другим директориям (формы, классы и т.п.).
Однако, как мне кажется - это очень удобный способ для оперативного изменения пути.

от Крылова Юрия
Прочел сегодня на сайте Visual Foxpro Club Вашу статью. Хочу предложить, как мне кажется, более простой путь решения затронутой в статье проблемы. Хотел направить свои соображения в адрес ведущего рубрики "Статьи", но адреса на сайте не нашел, поэтому пишу Вам. Подозреваю, что Вы и есть ведущий; если нет, но надеюсь, что Вы перешлете это письмо на сайт. Итак к делу.

Я тоже очень привык в Fox-е для DOS использовать указание пути к файлу через переменную, т.е. Use (PATH_DB + 'table.dbf'), где переменной PATH_DB в любое время можно присвоить нужное значение. В Visual Foxpro, через построитель форм этого сделать не удается. Но не надо забывать, что форма - это стандартная таблица Visual Foxpro. Поэтому без проблем открываем форму как таблицу, и для всех полей, соответствующих определению курсора (в поле "class" стоит значение "cursor") корректируем свойства курсора (свойства определяются в поле "properties"): если источником является свободная таблица, то меняем значения для свойства CursorSource курсора на PATH_DB + 'table.dbf'; если источником является таблица базы данных, то меняем значения для свойства Database курсора на PATH_DB + 'my_db.dbc'; базу данных и таблицы я помещаю в один каталог.

Вот собственно и всё know-how, всё прекрасно работает. --
Крылов Юрий seed2@nibulon.comcent.nikolaev.ua


Вернуться к списку статей






© 2000-2017 Fox Club 
При размещении любых материалов с сайта на других ресурсах- прямая ссылка на www.foxclub.ru обязательна
Яндекс.Метрика