powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как проверить Таблицу? Free или не Free
12 сообщений из 12, страница 1 из 1
Как проверить Таблицу? Free или не Free
    #34318977
Arshin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как проверить Таблицу? Free или не Free не открывая БД.

Или как при выполнении FREE TABLE игнорировать сообщение об ошибке 1558
...
Рейтинг: 0 / 0
Как проверить Таблицу? Free или не Free
    #34319632
lo-pata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если не вдаваться в подробности, зачем вообще освобождать таблицу из БД в программе, то как и любую другую ошибку можно обрабатывать ON ERROR.
...
Рейтинг: 0 / 0
Как проверить Таблицу? Free или не Free
    #34319671
Arshin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот нашел функцию.

LPARAMETERS tcTableFullName
LOCAL lcDbcFullName, lcB1, lcB2, lnOffset, lcBuffer
lnFh1 = FOPEN(tcTableFullName)
* Make sure that's VFP table
lcBuffer = FREAD(lnFh1, 1)
IF ASC(lcBuffer) <> 0x30
* not VFP table
lcDbcName = "***NOT VFP TABLE***"
RETURN lcDbcName
ENDIF
* Position of the first data record - 2 bytes
= FSEEK(lnFh1, 8, 0)
lcB1 = FREAD(lnFh1,1)
lcB2 = FREAD(lnFh1,1)
* Offset to the beginning of the DBC name
lnOffset = ASC(lcB2) * 256 + ASC(lcB1) - 263
= FSEEK(lnFh1, lnOffset, 0)
* The DBC name or 0x00's if it's free table
lcBuffer = FREAD(lnFh1, 263)
IF ASC(lcBuffer) = 0
* free table
lcDbcName = "***FREE TABLE***"
ELSE
* table in dbc
lcDbcName = LEFT( lcBuffer, AT( CHR(0), lcBuffer) - 1)
ENDIF
= FCLOSE(lnFh1)

RETURN lcDbcName
...
Рейтинг: 0 / 0
Как проверить Таблицу? Free или не Free
    #34319729
Погодин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
INDBC() не подойдет ?
...
Рейтинг: 0 / 0
Как проверить Таблицу? Free или не Free
    #34320834
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArshinВот нашел функцию.
...

Если хотите понять, что именно делает данная функция и почему область ее действия довольно ограничена (есть ошибки), то почитайте описание структуры файлов DBF с которыми работает FoxPro

Структура табличного файла (.dbc, .dbf, .frx, .lbx, .mnx, .pjx, .scx, .vcx)

PS: статья в кодировке Windows-1251. Данная ссылка автоматом устанавливает кодировку UTF-8, поэтому надо будет изменить текущую кодировку страницы вручную. Правой кнопкой мыши на тексте статьи - Кодировка - Кирилица (Windows)
...
Рейтинг: 0 / 0
Как проверить Таблицу? Free или не Free
    #34322801
Погодин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот еще вычитал в книжке :-)
? CURSORGETPROP('database','mytable')
Если таблица принадлежит БД, то выдаст имя БД, если таблица свободная, вернет пустую строку.
...
Рейтинг: 0 / 0
Как проверить Таблицу? Free или не Free
    #34328663
Arshin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача проверить не открывая БД или таблицу.
...
Рейтинг: 0 / 0
Как проверить Таблицу? Free или не Free
    #34328667
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArshinЗадача проверить не открывая БД или таблицу.
А разве приведенная Вами функция не подходит?
...
Рейтинг: 0 / 0
Как проверить Таблицу? Free или не Free
    #34328670
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вряд ли можно что-то узнать о файле, не открывая его каким-либо способом! ;-)
Хотя, если файл "чужой", то один способ таки есть - спросить разработчика! :-)
...
Рейтинг: 0 / 0
Как проверить Таблицу? Free или не Free
    #34328672
Arshin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подходит! но Владимир М сомневается, а по его ссылке я еще не заходил.
Может еще, кто вариант подбросит.
...
Рейтинг: 0 / 0
Как проверить Таблицу? Free или не Free
    #34328719
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При создании новых таблиц в Visual FoxPro значение нулевого байта устанавливается в одно из трех значений: 0x30, 0x31 или 0x32 в зависимости от факта использования соответствующих типов полей. В случае добавления, удаления или изменения полей произойдет и модификация данного байта, если необходимо.

0x30 Visual FoxPro
0x31 Visual FoxPro, поддержка свойства autoincrement
0x32 Visual FoxPro, поддержка полей типа Varchar, Varbinary, или Blob

Это значит, что приведенную функцию надо слегка модифицировать.

Вместо куска

Код: plaintext
1.
2.
3.
4.
5.
6.
* Make sure that's VFP table
lcBuffer = FREAD(lnFh1,  1 )
IF ASC(lcBuffer) <> 0x30
	* not VFP table
	lcDbcName = "***NOT VFP TABLE***"
	RETURN lcDbcName 
ENDIF

Надо написать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
* Make sure that's VFP table
lcBuffer = FREAD(lnFh1,  1 )
IF InList(ASC(lcBuffer),0x30,0x31,0x32) = .F.
	* not VFP table
	lcDbcName = "***NOT VFP TABLE***"
	RETURN lcDbcName 
ENDIF

Правда, свойство AutoIncrement было введено только в версии VFP8, а поля типа VarChar, VarBinary и Blob - в VFP9. Это значит, что если таблицы были созданы в версии от VFP3 до VFP7 включительно, то приведенный код подойдет без модификаций.

В остальном, все правильно.
...
Рейтинг: 0 / 0
Как проверить Таблицу? Free или не Free
    #34329282
Arshin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за помощь!!!!
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как проверить Таблицу? Free или не Free
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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