powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / наивный вопрос о ДЕ
24 сообщений из 24, страница 1 из 1
наивный вопрос о ДЕ
    #34147249
mary_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня всем!
Начитавшись форума,решила делать новый сетевой проект,используя ДЕ форм.Опыта работы с ДЕ нет совсем.Поэтому сразу наступила на грабли:не знаю,ка заставить ДЕ брать таблицы с другой машины.Путь к базе данных считываю из текстового файла при запуск ехе,путь правильный.
set database to моя_база не помогает.Что не так?
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34147341
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В большинстве случаев, достаточно перед запуском формы вручную открыть контейнер базы данных

Код: plaintext
1.
2.
OPEN DATABASE MyBase.dbc
SET DATABASE TO MyBase

Лучше это сделать в главном (стартовом) файле проекта. Да, надеюсь, все таблицы включены в контейнер базы данных? Речь не идет о свободных таблицах?
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34147498
mary_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да,все таблицы в контейнере есть.
Так главном файле и делаю...Приблизительно так:

автор* -----> считываем путь к базе
STORE FOPEN('db.set') TO gnFileHandle && Open the file
way_db = alltrim(FGETS(gnFileHandle)) && Store contents
= FCLOSE(gnFileHandle)

OPEN DATABASE way_db+'db.dbc' shared
SET DATABASE TO way_db+'db.dbc'

Помогло только в лоб this.cursor1.database=моя_база
Что еще посмотреть?
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34147646
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Form.Load повтори команду

SET DATABASE TO db

Кстати, а в чем ошибка-то? Берет данные с локального компьютера? А как запускаешь приложение? Из среды разработки, из той папки, где и скомпилил или из отдельной папки?

Создай еще одну директорию, скопируй в нее все рабочие файлы и твой exe и запусти из вне среды FoxPro. Из проводника. Т.е. создай ситуацию, аналогичную той, которая будет у пользователя.
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34147698
Cyv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПомогло только в лоб this.cursor1.database=моя_база
Правильно помогло, а главное 100% надёжно.

Можно и унифицировать, особенно в DE-классе.
в BeforeOpenTables :
Код: plaintext
1.
2.
3.
4.
FOR EACH loDteObject IN This.Objects
	IF UPPER(loDteObject.BaseClass) = "CURSOR"		
		loDteObject.Database = "мой_путь\моя_база.dbc"
	ENDIF
ENDFOR
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34147952
mary_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ ,да,берет данные с локальной машины.Пробовала запускать с клиентской(там только ехе,конфиг и файл с путем на базу данных),и создала у себя на машине папку(ехе,конфиг и файл настройки,база на другой машине).В лоад формы написала set database и WAIT WINDOW DBC() ,так ведь лоад грида на форме срабатывает раньше и ругается,что например e:\test\db.dbc not found,и только потом wait window показывает ПРАВИЛЬНЫЙ путь к базе данных.

Cyv ,ДЕ-класс и унификация это пока не для моего уровня знаний :)
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34147997
mary_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
эээ,про лоад грида я загнула конечно...короче ошибка вылазит в лоад формы перед wait window dbc()
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34148060
W
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
W
Гость
Зайди в DE формы. Найди курсор с твоим именем.
Правой кнопкой- Properties-Cursor Source.
Посмотри значение. Видимо стоит ссылка на твою машину.
Удали таблицу.
Добавь таблицу из нужного места.
Cursor Source будет правильным.
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34148241
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mary_nэээ,про лоад грида я загнула конечно...короче ошибка вылазит в лоад формы перед wait window dbc()
Из тебя по одному слову за раз тянуть? Что за ошибка-то? Не нашел базу данных? А ты ее открыл ДО запуска формы?

У тебя в SET PATH TO добавлен путь к сетевой папке, где лежит твоя база данных?

В простом случае, как у тебя, ничего нигде перекрывать не надо. Никаких свойств курсоров. Даже и SET DATABASE по большому счету - лишняя (хотя и не мешает)

Вполне достаточно корректно указать директорию по умолчанию и пути доступа (SET PATH).
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34148447
Cyv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПуть к базе данных считываю из текстового файла при запуск ехе,путь правильный.

Абсолютно всё правильно делаешь.

авторДЕ-класс и унификация это пока не для моего уровня знаний :)
Тогда так влоб и пиши в BeforeOpenTables в DE формы, только через переменную
конечно, в зависимости от того с локальной или удалённой базой ведёшь работу.
Код: plaintext
this.cursor1.database=gcMyDataBasePathName
Подход правильный, тем более что в SET DATABASE TO предполагается только имя базы
а не имя вкупе с "правильным путём". Добудь его с помощью JUSTSTEM().
С правильным путём она должна быть открыта по OPEN DATABASE, что у тебя прекрасно
и сделано.
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34148464
Cyv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ простом случае, как у тебя, ничего нигде перекрывать не надо. Никаких свойств курсоров.
"Остап Ибрагимович, вы же знаете как я вас уважаю" (С) :)

Проверено кровью, как воинские уставы. Нерадивые программисты периодически
отлаживались на живой сетевой базе, положившись на SET-ы. После данного,
кажущегося излишним указания "свойств курсоров", все стали себя чувствовать
гораздо увереннее.
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34148469
mary_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ
Из тебя по одному слову за раз тянуть? Что за ошибка-то? Не нашел базу данных? А ты ее открыл ДО запуска формы?

Я выше писала,но повторюсь.Есть стартовый файл проекта,в нем открывается база данных
Код: plaintext
1.
OPEN DATABASE way_db+'db.dbc' shared
Из стартового файла вызывается форма,где есть ДЕ и грид на его основе.В Load формы по Вашему совету повторила команду SET DATABASE TO ... и от себя добавила WAIT WINDOW DBC().Ошибка
Код: plaintext
1.
e:\test\db.dbc not found
а потом WAIT WINDOW DBC() показывает правильный путь к сетевой базе данных.

ВладимирМ
У тебя в SET PATH TO добавлен путь к сетевой папке, где лежит твоя база данных?

Вот где собака порылась,на эту папку путь не добавлен.Дело в этом,очевидно.Думала,что хватит OPEN DATABASE+SET DATABASE.
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34148476
mary_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cyv ,да не хотелось в лоб писать,это ж неудобно (ввиду того,что универсальный код для этого я пока не осилю).

Код: plaintext
1.
Абсолютно всё правильно делаешь.
...что у тебя прекрасно и сделано.
Боже,как приятно что хоть что-то делаю правильно,спасибо :)
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34148480
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Порядок действия в простом случае

================================
I) Разработка приложения
================================

-) Создается отдельная папка проекта. Например,

C:\MyProjects\TestProj

-) В этой папке создается ряд подкаталогов для разных исходны файлов проекта. В том числе и для базы данных и таблиц. Например,

C:\MyProjects\TestProj\Data
C:\MyProjects\TestProj\Forms
C:\MyProjects\TestProj\Progs
C:\MyProjects\TestProj\Menu
C:\MyProjects\TestProj\Reports

и т.п.

-) В корневой директории проекта C:\MyProjects\TestProj создается собственно файл проекта

TestProj.pjx

-) В этой же корневой директории создается файл конфигурации CONFIG.FPW. Это обычный текстовый файл. И в нем пишется примерно следующий текст:

Код: plaintext
1.
2.
3.
4.
CODEPAGE= 1251 
RESOURCE=FoxUser.dbf
PATH=DATA,Forms,Progs,Menu,Reports
COMMAND=MODIFY PROJECT TestProj.pjx 

-) Создается ярлык на рабочем столе для запуска среды FoxPro с использованием данного файла конфигурации и указания директории по умолчанию. Для этого можно сначала просто создать ярлык для запуска VFP, а потом изменить его.

Если FoxPro установлено в директорию по умолчанию, то для VFP6 это будет выглядеть так:

Командная строка
"C:\Program Files\Microsoft Visual Studio\Vfp98\VFP6.EXE" -T -C"C:\MyProjects\TestProj\config.fpw"

Директория по умолчанию "C:\MyProjects\TestProj"

-) Запускаем созданный ярлык и получаем открытым новый проект. Если файла проекта не было, то он будет создан автоматически.

-) В главном стартовом файле делаем открытие базы данных БЕЗ УКАЗАНИЯ ПУТЕЙ ДОСТУПА

Код: plaintext
1.
2.
OPEN DATABASE db.dbc
SET DATABASE TO db

-) Создаем форму с использованием DataEnvironment, БЕЗ ДОПОЛНИТЕЛЬНОГО КОДИРОВАНИЯ. Как FoxPro сам настроит пути, так и сойдет. Ничего нигде никуда прописывать не надо.

================================
II) Перенос на машину клиента и изменение путей доступа
================================

-) На машине клиента создаем директорию, где будет лежать исполняемый файл. Например,

C:\WorkDir

-) Кладем в него скомпилированный файл EXE

-) Туда же кладем файл конфигурации CONFIG.FPW. Но уже не тот, который был на этапе разработки, а другой, специально созданный для работы приложения. В нем пишется примерно такой текст

Код: plaintext
1.
2.
3.
CODEPAGE= 1251 
RESOURCE=OFF
PATH=(вот здесь путь доступа к сетевой папке, где лежит база данных)

-) Стартуем файл EXE из проводника Windows и смотрим как работает приложение

================================
III) Отладка процесса перенос на машину клиента и изменение путей доступа
================================

Делается все то же самое, что и на машине клиента, но на отладочной машине. Здесь важен факт переноса всех исполняемых файлов в другую директорию и запуск их именно из этой другой директории, а не из среды FoxPro, где происходит отладка.
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34148482
Cyv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторэто ж неудобно
"За дёшево, надёжно и практично" (С)Лёлик
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34148487
Cyv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМКак FoxPro сам настроит пути, так и сойдет. Ничего нигде никуда прописывать не надо.
Жизнь к сожалению доказывает обратное. Программистам свойственно в процессе
работы переключаться туда-сюда, независимо от абсолютно правильных стартовых
конфигураций. Творческие люди, пишут в командное окно что ни попадя, легко
перекрывая любые конфиги Такие дела. Ну а "академически" - вы абсолютно правы.
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34148494
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyv ВладимирМКак FoxPro сам настроит пути, так и сойдет. Ничего нигде никуда прописывать не надо.
Жизнь к сожалению доказывает обратное. Программистам свойственно в процессе
работы переключаться туда-сюда, независимо от абсолютно правильных стартовых
конфигураций. Творческие люди, пишут в командное окно что ни попадя, легко
перекрывая любые конфиги Такие дела. Ну а "академически" - вы абсолютно правы.
Ну, значит я не творческий человек Почему-то у меня ничто ничего не перекрывает.

В такой простой задаче это вопрос не "творчества", а самодисциплины.

FoxPro в этом смысле особенно строг. Имеенно в силу своей "вседозволенности". Он сам попытается найти то, что ему нужно. Если программа писалась "творчески", то FoxPro "творчески" и будет искать. Отсюда такие недоразумения.

"Разруха начинается в головах" (с)
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34148725
Jura.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я делаю так
При старте программы в глобальную переменную или в объект goAPP (который создается при старте приложения) в свойство goAPP.PathBase прописывается путь который у меня читается из таблицы настроек
goAPP.PathBase="\\SERVER\NAME_PROG\DATA\"

кроме этого создается обычный PRG файл содержащий примерно следующий текст и имеющий название например DefaultDE.PRG

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
.AddObject('curT60','cursor')
.curT60.alias='T60'
.curT60.BufferModeOverride= 5 
.curT60.CursorSource='T60'
.curT60.Database=GoApp.PathBase+'stat.dbc'

.AddObject('curT60D','cursor')
.curT60D.alias='T60D'
.curT60D.BufferModeOverride= 5 
.curT60D.CursorSource='T60D'
.curT60D.Database=GoApp.PathBase+'stat.dbc'

.AddObject('RelT60T60D','Relation')
.RelT60T60D.ParentAlias='T60'
.RelT60T60D.RelationalExpr='F60ID'
.RelT60T60D.ChildAlias='T60D'
.RelT60T60D.ChildOrder='F60DF60ID'

и в событии BeforeOpenTables DE формы пишем следующий текст

Код: plaintext
1.
2.
3.
WITH this
=SETDEFAULT()
=DefaultDe()
ENDWITH 

Все теперь можно менять пути к базе данных даже в режиме проектирования просто меняем строку в свойстве goAPP.PathBase
А в процедуре SETDEFAULT прописаны первоначальные установки по умолчанию для Private Data Session
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34148733
Jura.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да и еще можно открыть и дополнительно свободные таблицы, которые всегда храняться локально или в совершенно другой дирректории.
Так например словари у меня храняться локально (они меняются очень редко, поэтому не надо баталий по поводу того что словари тоже надо хранить на сервере), словарь конечно храниться на сервере, при старте программы проверяется его версия (время создания и размер), если поменялся значит обновляется локальная версия). Поэтому путь к ним другой и содержится в свойстве объекта goAPP.PathSLV

Для этого добавим в DefaultDE.PRG

Код: plaintext
1.
2.
3.
.AddObject('curSLVA','cursor')
.curSLVA.alias='Slva'
.curSLVA.CursorSource=GoApp.PathSlv+'Slva.dbf'
.curSLVA.ReadOnly=.T.  
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34149161
Cyv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМПочему-то у меня ничто ничего не перекрывает.
Да у меня тоже :).

Мысль была о том что изменение свойства которое "read/write at run time",
не есть что-то нехорошее.
Имя базы и локальной и удалёной - одно и то же, а в данное свойство
можно записать ещё и полный путь:
Код: plaintext
DataEnvironment.Cursor.Database [ = cPath ]
cPath
Specifies the full path to the database (.dbc) file.

Это наверное зависит от характера человека. Кто-то полагается только на
автоматические настройки, кто-то хочет держать такие вещи под контролем.
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34149184
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень давно сталкивался с такими граблями.
Фокс (вот редиска) прописывает полные пути к базе.
Конечно организованоость и аккуратность хорошо - но лень родилась раньше их.
Для того чтобы гарантированно открывалось по пути указанном в set path или из уже открытой базы - нужно чтобы этих самых путей небыло - только имена базы или таблиц

Для этого
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
* Это пишем в BeforOpenTanble DE

no_patch(this)

*а сама функция 

Function no_patch(nObj)

Private	aCursors
Local sDb,sCs,sp

Amembers( aCursors , nObj,  2  )
For i =  1  To Alen( aCursors ,  1  )
	If At( "CURSOR" , Upper( aCursors(i) ) ) >  0 
		sDb = aCursors(i) + '.Database'
		sCs = aCursors(i) + '.CursorSource'
		nObj.&sDb = Justfname( nObj.&sDb )
		nObj.&sCs = Justfname( nObj.&sCs )
	Endif
Endfor
Return .T.

В результате нам абсолютно наплевать где находилась база в момент создания DE.
Если сильно хочется можно не просто чистить пути , а "прикреплять" свой путь
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34149212
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyv
Да. Согласен.

Полный контроль через изменение Cursor.DataBase - надежнее. Просто, пока не возникало в этом необходимости...
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34150492
FOX_user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поправьте, если ошибаюсь.
Путь в базе можно проследить в Init курсоров, находящихся в Dataenvironment. Там он задается через локальную переменную. В принципе можно заменить ее на глобальную или на свойство какого-либо объекта.
...
Рейтинг: 0 / 0
наивный вопрос о ДЕ
    #34154577
mary_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как и следовало ожидать,проблема была в SET PATH. ВладимирМ ,спасибо.Сожалею,что Вам в n-й раз пришлось пересказывать "Советы для начинающих,часть 1' :) (хоть вроде и так наизусть ее знаю,но вот...)
Всем откликнувшимся - спасибо!
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / наивный вопрос о ДЕ
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]