Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Пути к таблицам в базе данных. / 8 сообщений из 8, страница 1 из 1
28.01.2004, 11:50
    #32390391
Vladislav1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пути к таблицам в базе данных.
Привет!

Есть база данных, с таблицами находящимися по пути c:\database\
Если я переношу базу на другой компьютер, то для того чтобы база была работоспосбной мне надо будет создать на нем такую же папку на таком же диске, т.е. c:\database\.

А можно ли не привязываться к папке, а сделать так чтобы базу, таблицы которой находятся в той же папке где и сам файл .dbc, можно было бы размещать где угодно?

Спасибо!
...
Рейтинг: 0 / 0
28.01.2004, 12:34
    #32390505
FM32YO aka KID
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пути к таблицам в базе данных.
я делаю так
в файле Paths.ini
пишу
[System]
Base=C:\\Data\
Program=C:\MyPrg

а в основной программе

DataBasePath = ProfileString( "PATHS.INI", "System", "Base", 0)
ProgramPath = ProfileString( "PATHS.INI", "System", "Program", 0)
SET PATH TO &DataBasePath
SET DEFAULT TO &ProgramPath

*** Где ProfileString - ф-я чтения из ИНИ файла ****
****************
**
** Functions for reading and writing .INI files.
**
** PUBLIC FUNCTIONS:
**
** =ProfileString( cINIFile, cSection, cKey, cDefault )
** =ProfileNum( cINIFile, cSection, cKey, nDefault )
** =ProfileDate( cINIFile, cSection, cKey, dDefault )
** =SetProfile( cINIFile, cSection, cKey, xValue )
**
** ProfileString is used to read a string from the specified .INI file.
**
** Eg. cSystemPath = ProfileString( "TEST.INI", "System", "Path", "." )
**
**
** ProfileNum is used to read a numeric value from the specified .INI file,
** including logical values (stored as 0 or 1).
**
** Eg. nMaxUsers = ProfileNum( "TEST.INI", "System", "MaxUsers", 20 )
**
** ProfileDate is used to read a date value from the specified .INI file.
** ( SetProfile stores dates in the format YYYYMMDD. )
**
** Eg. dDownload = ProfileDate( "TEST.INI", "System", "LastDnld", DATE() )
**
**
** SetProfile is used to store a value of any data type except objects,
** code blocks & arrays in the .INI file.
**
** lSuccess = SetProfile( "TEST.INI", "System", "MaxUsers", 20 )
**
**

** FSEEK() modes for FoxPro

#define FS_SET 0 && Seek from beginning of file
#define FS_RELATIVE 1 && Seek from current file position
#define FS_END 2 && Seek from end of file


** FOPEN() access modes for FoxPro

#define FO_READ 0 && Open for reading buffered (default)
#define FO_WRITE 1 && Open for writing buffered
#define FO_READWRITE 2 && Open for reading or writing buffered
#define FO_UREAD 10 && Open for reading unbuffered
#define FO_UWRITE 11 && Open for writing unbuffered
#define FO_UREADWRITE 12 && Open for reading or writing unbuffered

** FCREATE() file attribute modes for FoxPro

#define FC_NORMAL 0 && Create normal read/write file (default)
#define FC_READONLY 1 && Create read-only file
#define FC_HIDDEN 2 && Create hidden file
#define FC_RO_HIDDEN 3 && Read Only/Hidden
#define FC_SYSTEM 4 && Create system file
#define FC_SYS_RO 5 && Read Only/System
#define FC_SYS_HID 6 && System/Hidden
#define FC_SYS_ROH 7 && Read Only/Hidden/System


** define Carriage Return/Linefeed _CRLF

#define _CRLF CHR(13) + CHR(10)



******************************
** FUNCTION ProfileString **
*****************************************************************************
**
** This function reads a string from the specified .INI file.
**
** Parameters: cFile - The .INI file name to be used
** cSection - The section from which to read
** cKey - The key value for which to search
** cDefault - The default value if not found (optional)
**
** Returns: cString - The string read from the file.
**

FUNCTION ProfileString
PARAMETERS cFile, cSection, cKey, cDefault

** cString := The string read from the file
** nHandle := File handle for the read
** cBuffer := Buffer for the read
** nFileLen := Length of the file in bytes
** nSecPos := Position in the file of the specified section
** cSecBuf := Section subtring
** nKeyPos := Position in the file of the specified key value
** cChar := Single character read from buffer

PRIVATE cString,nHandle,cBuffer,nFileLen,nSecPos,cSecBuf,nKeyPos,cChar

IF LEFT( cSection, 1 ) <> "["
cSection = "[" + cSection
ENDIF

IF RIGHT( cSection, 1 ) <> "]"
cSection = cSection + "]"
ENDIF

IF EMPTY(cDefault) && was = NIL
cDefault = ""
ENDIF

cString = cDefault

**
** If no extension is provided for the file, assume .INI.
**
IF RAT( ".", cFile ) = 0
cFile = UPPER( ALLTRIM( cFile )) + ".INI"
ENDIF

nHandle = FOPEN( cFile, FO_READWRITE )

IF nHandle > 0
nFileLen = FSEEK( nHandle, 0, FS_END )

=FSEEK( nHandle, 0 , FS_SET )

cBuffer = SPACE( nFileLen )

**
** Read in the entire file (.INI files should be less than 64K!).
**
cBuffer = FREAD( nHandle, 64000 )
IF LEN(cBuffer) = nFileLen
**
** Determine the position in the buffer
** of the requested section.
**
nSecPos = ATC( cSection, cBuffer )

IF nSecPos > 0
**
** Extract the section from the buffer.
**
cSecBuf = RIGHT( cBuffer, nFileLen - ( nSecPos + LEN( cSection )))

IF !EMPTY( cSecBuf )
**
** Get the position of the end of the section...
**
nSecPos = ATC( "[", cSecBuf )

**
** ...and extract the section!
**
IF nSecPos > 0
cSecBuf = LEFT( cSecBuf, nSecPos - 1 )
ENDIF

**
** Now find the key within the section.
**
nKeyPos = ATC( cKey, cSecBuf )

IF nKeyPos > 0
**
** Load the return string with the value
** until a carriage return is found.
**
nKeyPos = nKeyPos + LEN( cKey ) + 1

cString = ""
cChar = ""

DO WHILE cChar <> CHR(13)
cChar = SUBSTR( cSecBuf, nKeyPos, 1 )

IF cChar <> CHR(13)
cString = cString + cChar

nKeyPos = nKeyPos + 1
ENDIF
ENDDO
ENDIF
ENDIF
ENDIF
ENDIF

=FCLOSE( nHandle )
ENDIF

RETURN cString
**
** EOP: ProfileString
**


***************************
** FUNCTION ProfileNum **
*****************************************************************************
**
** This function reads a number from the specified .INI file.
**
** Parameters: cFile - The .INI file name to be used
** cSection - The section from which to read
** cKey - The key value for which to search
** nDefault - The default value if not found (optional)
**
** Returns: nValue - The numeric value read from the file.
**

FUNCTION ProfileNum
PARAMETERS cFile, cSection, cKey, nDefault

** cValue := Profile string read from file
** cDefault := Default value converted to string
** nValue := Profile string converted to numeric

PRIVATE cValue,cDefault,nValue

IF EMPTY(nDefault) && was = NIL
nDefault = 0
ENDIF

nValue = nDefault
cDefault = ALLTRIM( STR( nDefault ))

cValue = ProfileString( cFile, cSection, cKey, cDefault )

IF !EMPTY( cValue )
nValue = VAL( cValue )
ENDIF

RETURN nValue
**
** EOP: ProfileNum
**


****************************
** FUNCTION ProfileDate **
*****************************************************************************
**
** This function reads a date from the specified .INI file.
**
** Parameters: cFile - The .INI file name to be used
** cSection - The section from which to read
** cKey - The key value for which to search
** dDefault - The default date if not found (optional)
**
** Returns: dDate - The date value read from the file.
**

FUNCTION ProfileDate
PARAMETERS cFile, cSection, cKey, dDefault

** cDateFmt := Date format on entry
** cValue := Profile string read from file
** cDefault := Default value converted to string
** dDate := Profile string converted to numeric

PRIVATE cDateFmt,cValue,cDefault,dDate

IF TYPE( dDefault ) <> "D"
dDefault = CTOD( "" )
ENDIF

dDate = dDefault
cDefault = ALLTRIM( DTOS( dDefault ))

cValue = ProfileString( cFile, cSection, cKey, cDefault )

IF !EMPTY( cValue )
**
** Try just converting the date as is.
**
dDate = CTOD( cValue )

IF EMPTY( dDate )
**
** If that doesn't work, convert
** using a standard date format.
**
cDateFmt = SET( "DATE" )
SET DATE AMERICAN
dDate = CTOD( SUBSTR( cValue, 5, 2 ) + "/" + RIGHT( cValue, 2 ) + ;
"/" + LEFT( cValue, 4 ))

SET DATE ( cDateFmt )
ENDIF
ENDIF

RETURN dDate
**
** EOP: ProfileDate
**


***************************
** FUNCTION SetProfile **
*****************************************************************************
**
** This function writes a value to the .INI file specified.
**
** Parameters: cFile - The .INI file name to be used
** cSection - The section for which to search
** cKey - The key value for which to search
** xValue - The new value to be written
**
** Returns: .T. if successful, .F. otherwise.
**

FUNCTION SetProfile
PARAMETERS cFile, cSection, cKey, xValue

** lRetCode := Function's return code
** cType := Data type of the value
** cOldValue := Current value
** cNewValue := New value to be written
** nHandle := File handle for the read
** cBuffer := Buffer for the read
** nFileLen := Length of the file in bytes
** nSecStart := Start position in the file of the section
** nSecEnd := Ending position in the file of the section
** nSecLen := Initial length of the section
** cSecBuf := Section subtring
** nKeyStart := Start position in the file of the key
** nKeyEnd := Ending position in the file of the key
** nKeyLen := Initial length of the key
** lProceed := .T. if proceeding with the change
** cChar := Single character read from file

PRIVATE lRetCode,cType,cOldValue,cNewValue,nHandle,cBuffer,nFileLen,;
nSecStart,nSecEnd,nSecLen,cSecBuf,nKeyStart,nKeyEnd,nKeyLen,;
lProceed,cChar

IF LEFT( cSection, 1 ) <> "["
cSection = "[" + cSection
ENDIF

IF RIGHT( cSection, 1 ) <> "]"
cSection = cSection + "]"
ENDIF

**
** If no extension is provided for the file, assume .INI.
**
IF RAT( ".", cFile ) = 0
cFile = UPPER( ALLTRIM( cFile )) + ".INI"
ENDIF

lRetcode = .F.
lProceed = .F.
nSecLen = 0
cType = TYPE( "xValue" )

DO CASE
CASE cType = "C"
cNewValue = xValue

CASE cType = "N"
**** changeded by PdF - must check for decimals or fails in FoxPro
IF MOD(xValue,1) > 0
** there are decimals - allow for 5 - extras will disapper in the trim
cNewValue = ALLTRIM( STR( xValue,10,5 ))
ELSE
cNewValue = ALLTRIM( STR( xValue ))
ENDIF

CASE cType = "L"
cNewValue = IIF( xValue, "1", "0" )

CASE cType = "D"
cNewValue = DTOS( xValue )

OTHERWISE
cNewValue = ""

ENDCASE

nHandle = FOPEN( cFile, FO_READ ) && FoxPro does not support Exclusive Open

IF FERROR() = 2
nHandle = FCREATE( cFile, 0 )
ENDIF

IF nHandle > 0
nFileLen = FSEEK( nHandle, 0, FS_END )

=FSEEK( nHandle, 0 , FS_SET )

cBuffer = SPACE( nFileLen )

**
** Read in the entire file (.INI files should be less than 64K!).
**
cBuffer = FREAD( nHandle, 64000 )
IF LEN(cBuffer) = nFileLen
**
** Determine the position in the buffer
** of the requested section.
**
nSecStart = ATC( cSection, cBuffer )

IF nSecStart > 0
nSecStart = nSecStart + LEN( cSection ) + 2 && Length of cSection + CR/LF

**
** Extract the section from the buffer.
**
cSecBuf = RIGHT( cBuffer, nFileLen - nSecStart + 1 )

IF !EMPTY( cSecBuf )
**
** Get the position of the end of the section...
**
nSecEnd = ATC( "[", cSecBuf )

**
** ...and extract the section!
**
IF nSecEnd > 0
cSecBuf = LEFT( cSecBuf, nSecEnd - 1 )
ENDIF

nSecLen = LEN( cSecBuf )

**
** Now find the key within the section.
**
nKeyStart = ATC( cKey, cSecBuf )

IF nKeyStart > 0
**
** Load the return string with the value
** until a carriage return is found.
**
nKeyStart = nKeyStart + LEN( cKey ) + 1
nKeyEnd = nKeyStart

cOldValue = ""
cChar = ""

DO WHILE cChar <> CHR(13)
cChar = SUBSTR( cSecBuf, nKeyEnd, 1 )

IF cChar <> CHR(13)
cOldValue = cOldValue + cChar

nKeyEnd = nKeyEnd + 1
ENDIF
ENDDO

**
** Change the old value to the new one.
**
nKeyLen = LEN( cOldValue )
cSecBuf = STUFF( cSecBuf, nKeyStart, nKeyLen, cNewValue )

lProceed = .T.
ELSE
**
** The key was not found - add it now!
**
**cSecBuf = _CRLF + cKey + "=" + cNewValue + _CRLF

cSecBuf = cKey + "=" + cNewValue + _CRLF + cSecBuf

lProceed = .T.
ENDIF
ENDIF
ELSE
**
** The section was not found - add it now!
**
**cSecBuf = _CRLF + cSection + _CRLF + cKey + "=" + ;
** cNewValue + _CRLF

cSecBuf = cSection + _CRLF + cKey + "=" + cNewValue + ;
_CRLF + _CRLF

lProceed = .T.
ENDIF
ENDIF

IF lProceed
**
** Update the buffer with the new section.
**
IF nSecStart = 0
nSecStart = LEN( cBuffer )
ENDIF

cBuffer = STUFF( cBuffer, nSecStart, nSecLen, cSecBuf )

**
** Replace the existing .INI file.
**
=FCLOSE( nHandle )

nHandle = FCREATE( cFile, 0 )

IF FWRITE( nHandle, cBuffer ) = LEN( cBuffer )
lRetCode = .T.
ENDIF
ENDIF

=FCLOSE( nHandle )
ENDIF

RETURN lRetCode
...
Рейтинг: 0 / 0
28.01.2004, 12:51
    #32390535
Hel!Riser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пути к таблицам в базе данных.
а я чиста создаю Config.FPW со строка DEFAULT= & PATH= ну и прочей настройкой :)
...
Рейтинг: 0 / 0
29.01.2004, 09:23
    #32391766
Samir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пути к таблицам в базе данных.
А нельзя ли перенести папку "database" в папку с программой?
Тогда все проблемы исчезнут.
Set path to DATABASE
...
Рейтинг: 0 / 0
30.01.2004, 15:18
    #32393906
Васек
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пути к таблицам в базе данных.
От:Igor Korolyov (k1i2v3@km.ru)
Тема:Re: Динамический путь к базе данных

View: Complete Thread (17 сообщений)
Original Format
Группы новостей:fido7.ru.visual.foxpro
Дата:2003-07-16 16:28:16 PST


Hi, Valentin!
You wrote on Wed, 16 Jul 2003 05:47:35 +0000 (UTC):
VJ> Прошу прощение за столь запоздалое сообщение. Пока я был в
VJ> командировке, то в эхе в мае прошло обсуждение, не замеченное мною
VJ> во-время. Речь идет о необычном способе указания пути к базе данных, о
VJ> котором рассказал Александр Королев.
Да вроде ничего необычного в нём нет... сам MS так рекомендует решать
проблему с путями прописываемыми в свойствах объектов DE на этапе
проектирования. КСТАТИ - если НЕ использовать DE то и проблемы не будет
VJ> Я хотел бы спросить о некоторых моментах.
VJ> Получается, что использование базы данных (то есть не свободных
VJ> таблиц) заставляет использовать Data Environment, чтобы заменить через
VJ> процедуру (показанную А.Королевым) путь к базе, записанный в файле .dbf
VJ> при проектировании при привязке таблицы к базе, на новый путь, в
VJ> котором находится база данных, установленная у конкретного пользователя
VJ> на момент запуска программы.
Не совсем. Нужно заменять ВСЕ пути - т.е. для объектов из БД (как таблиц,
так и представлений!!!) заменять путь к БД (свойство Database), для
свободных таблиц заменять путь к таблице (свойство CursorSource). Иначе на
этапе выполнения может возникнуть ситуация а) - таблица/вью не может быть
найдена в папке по умолчанию (SET DEFAULT) плюс относительный путь из
свойств объекта из DE (там на самом деле чаще всего относительный путь и
хранится, несмотря на то что в Property Sheet он раскрывается в полный
путь) - тогда будет идти поиск в DEFAULT папке и по SET PATH. б) -
вышеуказанная комбинация (или например абсолютный путь прописанный в DE -
если скажем данные и сам проект были на разных дисках) приведёт нас к
неверному местоположению, и к не тем данным, что мы думаем - очень часто в
_ненаших_ конфах люди удивляются - чего это моя прога полезла не в реальную
базу, а в мою отладочную копию
В общем упорядочивать пути нужно!
VJ> А обязательное использование Data Environment
Это почему оно у тебя обязательное? Можно спокойно жить и без него :) Но уж
если назвался груздём - полезай в короб
VJ> заставляет использовать обьект приложения goApp (запускаемый в самом
VJ> начале программы),
Или иной глобально доступный объект (да хоть ты каждый раз открывай таблицу
конфигурации и меняй пути - это уж твоё решение). хотя мне нравится считать
пуи один раз и потом работать именно со свойствами goApp.
VJ> чтобы сразу же иметь Data Environment и открывать
VJ> таблицы вне форм.
Вот этого я совсем не понял. Зачем тебе открывать DE вне форм ? Чтобы потом
поиметь проблему "прицепления" свободно плавающей DE (точнее объекта
Session) к запускаемой форме? Не знаю, не пробовал так извращаться...
VJ> Hапример, если сразу все таблицы открываются в начале
VJ> программы.
Ну и что в этом хорошего? Тогда уж проще всё сложить в одну датасессию и
мучаться с совместным доступом из разных форм к одним и тем-же курсорам (а
проблем будет короб и ещё лукошко :))...
VJ> Так ли это?
Ну вот например как я заменяю пути к данным в DE форм и отчётов:
DEFINE CLASS DEHook AS DataEnvironment
Name = "DataEnvironment"
__cversion = "0.17 от 18/4/2003 IK"
PROCEDURE BeforeOpenTables
IF TYPE ("m.goApp.Name") == "C"
LOCAL loCursor, lcDBC, lnDSID
m.lnDSID = SET ("Datasession")
IF m.goApp._DEBeforeOpenTablesHook (This, m.lnDSID)
* Не заблокировали в методе объекта приложения
FOR EACH loCursor IN This.Objects
IF "CURSOR" $ UPPER (m.loCursor.Class)
IF EMPTY (m.loCursor.Database)
* Свободная таблица
IF m.goApp.oFreeTableList.Count > 0 AND ;
m.goApp.oFreeTableList.GetKey (UPPER (JUSTSTEM
(m.loCursor.CursorSource))) # 0
m.loCursor.CursorSource = m.goApp.oFreeTableList.Item (UPPER (JUSTSTEM
(m.loCursor.CursorSource)))
ELSE
m.loCursor.CursorSource = FULLPATH (JUSTFNAME
(m.loCursor.CursorSource))
* Если не зарегистрированна, то будет искаться по SET PATH
ENDIF
ELSE
* Обзор или таблица БД
IF m.goApp.oDBCList.Count > 0 AND ;
m.goApp.oDBCList.GetKey (UPPER (JUSTSTEM (m.loCursor.Database))) # 0
m.loCursor.Database = m.goApp.oDBCList.Item (UPPER (JUSTSTEM
(m.loCursor.Database)))
ELSE
m.loCursor.Database = FULLPATH (JUSTFNAME (m.loCursor.Database))
* Если не зарегистрированна, то будет искаться по SET PATH
ENDIF
ENDIF && EMPTY (m.loCursor.Database)
ENDIF && "CURSOR" $ UPPER (m.loCursor.Class)
ENDFOR
ENDIF
ENDIF
ENDPROC
ENDDEFINE
Думаю с пониманием того как работает эта конструкция особых проблем не
возникнет? m.goApp.oFreeTableList и m.goApp.oDBCList это глобально видимые
коллекции, содержащие реальные пути к разным базам и свободным таблицам -
для VFP8 коллекция - родной класс, для VFP7 я нарисовал несложный
"эмулятор" - на 90% он соответствует VFP8 Collection - мне этого хватает :)
Если нужно могу и его код кинуть...
Ну кусок с вызовом m.goApp._DEBeforeOpenTablesHook() думаю не нуждается в
комментариях - ведь и прикладному программисты наверняка захочется чего-то
своего насовать в _каждый_ DE.BeforeOpenTables event... Хотя бы
SET TALK OFF
SET DELETED ON
SET DATE TO ...
SET CENTURY ON
Ну и т.п. вот ему в классе App и сделан метод-хук :)
>> Относительные пути в VFP
>> Лучше всего не завязывать настройки путей с расположением exe, (даже
>> относительно)
>> Вручную прописывать не обязательно, гораздо проще написать процедуру, VJ> которую
>> можно вызывать во всех формах в DataEnvironment.BeforeOpenTables (а еще VJ> лучше
>> субклассировать DataEnvironment)
Вот на субклассировании DE моя схема и работает - и если для VFP8 это
документированная возможность, то для VFP6/7 используется обнаруженная
Михаилом Дроздовым интересная баго-фича (но она стабильно работает, так что
можно не боятся её использовать)...
>> Процедура может выглядеть следующим образом (Пусть путь к БД хранится в
[Sorry, skipped]
>> Если используются несколько путей к разным БД, то код вышеприведенной VJ> функции
>> надо будет несколько усложнить, но, надеюсь, идея понятна.
Вот у меня и есть усложнённый вариант - можно иметь много разных БД и кроме
того - много разных свободных таблиц (о чём не говорил Александр).
WBR, Igor
...
Рейтинг: 0 / 0
30.01.2004, 15:20
    #32393915
Васек
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пути к таблицам в базе данных.
Опять придется лекцию прочитать :)

Рекомендации по хранению файлов проекта и обращению к ним.

Есть старое правило - никогда не хранить рабочие файлы вместе с исполняемыми. Например, документы, создаваемые в Word по умолчанию хранятся в специальной папке "Мои документы", в то время как сама программа Word расположена в одном из каталогов внутри папки "C:\Programm Files".

Применительно к FoxPro это означает, что надо создать отдельную папку для хранения собственных проектов. Например:

C:\ProjVFP\MyProj

Т.е. предполагается, что в папке C:\ProjVFP может находится несколько папок с разными проектами. Тот проект с которым Вы в данный момент работаете находится в подкаталоге MyProj

Теперь следует разделить файлы, которые будут созданы в проекте. Ведь Вы создаете самые разные файлы: Таблицы, Формы, Отчеты, классы и т.п. Если их распологать в одной куче (в одной папке), то очень легко запутаться.

Стандартым способом разделения файлов является их разделение по типу - таблицы в одну папку, формы в другую, классы в третью и т.п.

У этого способа есть существенный недостаток - при большом количестве файлов найти нужный становится очень проблематично. Лично я предпочитаю делить файлы по их логической принадлежности: Главные файлы, Файлы для работы с документами, Справочники и т.п. Хотя данные выделются в отдельную папку.

Итого, структура каталога проекта имеет примерно следующий вид:

MyProj\
MyProj\Data
MyProj\Forms
MyProj\Class
...

В папке Data расположены файл базы данных и файлы таблиц.

А что же расположено в коревом каталоге MyProj?

А там распологается во-первых сам файл проекта (MyProj.PJX, MyProj.PJT), а во-вторых очень нужный файл конфигурации Config.FPW. Собственно и все. Прочие файлы распологают в корневом каталоге только в случае особой необходимости

Config.fpw - это обычный текстовый файл. Его примерное внутреннее содержание следующее:

CODEPAGE=1251
TITLE=Мой новый проект
PATH=Data,Forms,Class
MODIFY PROJECT MyProj.pjx

Если запустить среду FoxPro с этим файлом конфигурации, то в заголовке основного окна появится вместо "Visual FoxPro" тот текст, который идет за ключевым словом TITLE, будут настроены пути доступа и открыт проект MyProj.pjx

Чтобы сделать запуск среды FoxPro с этим файлом кофигурации автоматическим создайте специальный ярлык где в сделайте следующие настройки (Это настройки для VFP6)

Файл "C:\Program Files\Microsoft Visual Studio\Vfp98\VFP6.EXE" -T -C"C:\ProjVFP\MyProj\config.fpw"
Рабочий каталог "C:\ProjVFP\MyProj\"

И открывайте свой проект через этот ярлык

Для чего в файле конфигурации указаны пути доступа.

Все дело в том, что после сборки проекта в один EXE, все файлы включенные внутрь проекта будут распологаться как бы в одной (текущей) папке, а не как они были расположены в проекте (в папках Forms, Class и т.п.). Это значит, что обращения типа

DO FORM Forms\MyForm.scx

Успешно работающие на этапе отладки перестанут работать в готовом EXE, поскольку там просто не будет папки Forms.

Вот для предотвращения подобных недоразумений и следует указывать путь доступа к файлам. Указание пути доступа позволяет писать команды так, как-будто файлы находятся в текущей директории, хотя физически это и не так. FoxPro сам их найдет по указанным путям доступа

DO FORM MyForm.scx

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

Здесь логика будет абсолютно та же самая. Например, для открытия таблицы надо будет использовать синтаксис

USE MyTable.dbf

Хотя физически таблицы на этапе отладки расположены в папке Data, но указывать путь доступа явно нет необходимости. FoxPro сам найдет эту таблицу ориентируясь на пути прописанные в файле конфигурации.

Когда вы соберете готовый EXE файл конфигурации для него уже будет другой, ведь у клиента нет исходных файлов, да и самого проекта тоже, есть только готовый EXE и таблицы, т.е. содержиме файла конфигурации, который Вы поставите клиенту примет примерно следующий вид

CODEPAGE=1251
PATH=Data

Путь доступа нужен на тот случай, если данные распологаются в каком-то другом каталоге, а не в том, где лежит собственно EXE (как оно обычно и бывает). Тогда встречая команды вроде

USE MyTable.dbf

FoxPro будет искать таблицы по путям указанным в файле конфигурации.
...
Рейтинг: 0 / 0
30.01.2004, 15:22
    #32393918
Васек
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пути к таблицам в базе данных.
Последнее письмо было написано в этом форуме "ВладимирМ".

Я вас умоляю, Муля, заходите иногда в поиск ...
...
Рейтинг: 0 / 0
30.01.2004, 23:30
    #32394325
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пути к таблицам в базе данных.
Ну Вы тут и "навернули" круто!

Если кто желает, то можно немного и попроще (но с учетом того, что сказал "Васек"):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
* 
* здесь вырезаем путь к базам без учета директория проекта
lcrel=SYS( 2003 )
DO CASE
CASE ATC('\win2000',lcrel)> 0 
  m.gcmain=SUBSTR(lcrel, 1 ,ATC('\win2000',lcrel)- 1 )
CASE ATC('\exe',lcrel)> 0 
  m.gcmain=SUBSTR(lcrel, 1 ,ATC('\exe',lcrel)- 1 )
  CASE ATC('\w98',lcrel)> 0 
  m.gcmain=SUBSTR(lcrel, 1 ,ATC('\w98',lcrel)- 1 )
CASE ATC('\vfp',lcrel)> 0 
  m.gcmain=SUBSTR(lcrel, 1 ,ATC('\vfp',lcrel)- 1 )
OTHERWISE
  m.gcmain=lcrel
ENDCASE

PUBLIC m.gcdat,m.gctmp,m.gcidx,m.gctxt,m.gcpic,m.gcarc,m.gcstart
ins_net=SYS( 5 )    && путь в config.fpw
ins_drv=SUBSTR(SYS( 2023 ), 1 , 2 ) &&      -- ### --
 
m.gcdat=ins_net+m.gcmain+'\dat\'
m.gctmp=ins_drv+m.gcmain+'\tmp\'

m.gcarc=ins_drv+m.gcmain+'\arc\'
m.gcidx=ins_drv+m.gcmain+'\idx\'
m.gctxt=ins_drv+m.gcmain+'\idx\'
m.gcpic=ins_net+m.gcmain+'\pic\'
m.gcstart=ins_net+lcrel

Далее открываем базу данных:

Код: plaintext
OPEN DATABASE m.gcdat+ "df2003.dbc" 


И везде в DE без проблем используем то, что надо... После компиляции у клиентов все будет находиться, если только правильно указать все пути и положить config.fpw... но это уже повторение...
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Пути к таблицам в базе данных. / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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