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

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

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
09.02.2007, 15:30
    #34319729
Погодин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить Таблицу? Free или не Free
INDBC() не подойдет ?
...
Рейтинг: 0 / 0
10.02.2007, 01:01
    #34320834
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить Таблицу? Free или не Free
ArshinВот нашел функцию.
...

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

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

PS: статья в кодировке Windows-1251. Данная ссылка автоматом устанавливает кодировку UTF-8, поэтому надо будет изменить текущую кодировку страницы вручную. Правой кнопкой мыши на тексте статьи - Кодировка - Кирилица (Windows)
...
Рейтинг: 0 / 0
12.02.2007, 10:12
    #34322801
Погодин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить Таблицу? Free или не Free
Вот еще вычитал в книжке :-)
? CURSORGETPROP('database','mytable')
Если таблица принадлежит БД, то выдаст имя БД, если таблица свободная, вернет пустую строку.
...
Рейтинг: 0 / 0
13.02.2007, 23:04
    #34328663
Arshin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить Таблицу? Free или не Free
Задача проверить не открывая БД или таблицу.
...
Рейтинг: 0 / 0
13.02.2007, 23:08
    #34328667
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить Таблицу? Free или не Free
ArshinЗадача проверить не открывая БД или таблицу.
А разве приведенная Вами функция не подходит?
...
Рейтинг: 0 / 0
13.02.2007, 23:11
    #34328670
Redrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить Таблицу? Free или не Free
Вряд ли можно что-то узнать о файле, не открывая его каким-либо способом! ;-)
Хотя, если файл "чужой", то один способ таки есть - спросить разработчика! :-)
...
Рейтинг: 0 / 0
13.02.2007, 23:14
    #34328672
Arshin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить Таблицу? Free или не Free
Подходит! но Владимир М сомневается, а по его ссылке я еще не заходил.
Может еще, кто вариант подбросит.
...
Рейтинг: 0 / 0
14.02.2007, 00:28
    #34328719
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить Таблицу? Free или не Free
При создании новых таблиц в 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
14.02.2007, 10:34
    #34329282
Arshin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить Таблицу? Free или не Free
Спасибо за помощь!!!!
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как проверить Таблицу? Free или не Free / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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