:: Visual Foxpro, Foxpro for DOS
сообщение - file is in use, но таблица закрыта
ProbaSP
Автор

Сообщений: 94
Откуда: Урал
Дата регистрации: 28.01.2016
Всем привет!
Очередной заскок...
Не пойму, что не так.

FoxPro9.0 SP2
код на кнопке:

cName=table+'.dbf'
USE (cName)
SELECT * FROM (cName) INTO CURSOR kBD
ThisForm.Grid2.RecordSource='kBD'
ThisForm.Grid2.Refresh
USE IN (cName)

Если нажать второй раз, вылазит сообщение - "file is in use" (на строчке USE (cName))
в Data Session таблицы нет, только курсор.

Наверно это связано с SELECTом и временными файлами какими-нибудь(это я так интуичу )
подскажите, пожалуйста.
готов к тыканью носом...
Спасибо.
Ratings: 0 negative/0 positive
Re: сообщение - file is in use, но таблица закрыта
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
SELECT * FROM (cName) INTO CURSOR kBD NOFILTER


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 1 раз(а). Последнее : PaulWist, 26.04.17 14:02
Ratings: 0 negative/0 positive
Re: сообщение - file is in use, но таблица закрыта
ProbaSP
Автор

Сообщений: 94
Откуда: Урал
Дата регистрации: 28.01.2016
PaulWist
Спасибо!
про NOFILTER сразу прочитал.



Исправлено 1 раз(а). Последнее : ProbaSP, 26.04.17 14:12
Ratings: 0 negative/0 positive
Re: сообщение - file is in use, но таблица закрыта
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
ProbaSP
код на кнопке:
cName=table+'.dbf'
USE (cName)
SELECT * FROM (cName) INTO CURSOR kBD
ThisForm.Grid2.RecordSource='kBD'
ThisForm.Grid2.Refresh
USE IN (cName)

Видимо файл все-таки висит после каких-то действий.
Скорее всего нужно просто убрать абсолютно ненужную здесь строку:
USE (cName)
Т.к. SELECT-запрос сам открывает все, что ему нужно.
Закрывать кстати так тоже не совсем верно: ведь если cName=table+'.dbf', то имя алиаса идет уже без '.dbf'.
Поэтому, если не используется какое-то иное расширение для другой таблицы с тем же именем (что в принципе можно делать), и если не используется команда с определением конкретного файла на диске типа FILE() и т.п. - то лучше и вообще не добавлять здесь расширение в переменную имени.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: сообщение - file is in use, но таблица закрыта
ProbaSP
Автор

Сообщений: 94
Откуда: Урал
Дата регистрации: 28.01.2016
Crispy
спасибо за разъяснение...
ненужное уже убрал.
а закрытие сделал без расширения.
USE IN (table)



Исправлено 2 раз(а). Последнее : ProbaSP, 26.04.17 14:27
Ratings: 0 negative/0 positive
Re: сообщение - file is in use, но таблица закрыта
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
[attachment 27490 fox.gif]

А лисичка-то с обеих лап подает...
Ratings: 0 negative/1 positive
Re: сообщение - file is in use, но таблица закрыта
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
ProbaSP
а закрытие сделал без расширения.
USE IN (table)

Этого мало.

Если прочитать Help по команде USE более внимательно, то вы заметите, что в опции IN используется либо номер рабочей области, либо алиас, а вовсе не имя таблицы.

А раз алиас вы сами не задаете, то он присваивается по умолчанию, так что совсем не факт, что он совпадет с именем таблицы, а следовательно, этот код может и не сработать.
Кто знает, какое имя у таблицы может встретиться, и лучше не дожидаться, пока программа очередной раз неожиданно свалится, а сразу писать правильный код.
Ratings: 0 negative/0 positive
Re: сообщение - file is in use, но таблица закрыта
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Для "автооткрывемых" таблиц алиас не задать, увы...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: сообщение - file is in use, но таблица закрыта
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
закрытие сделал без расширения
"без расширения" здесь не при чём, так и появляется культ карго. Во-первых внимательно читайте справку, во-вторых, сами того не ведая, отбросив расширение от имени файла Вы случайно использовали заклинание "ALIAS" которое как раз попало в точку при использовании заклинания USE (ALIAS).


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.
Ratings: 0 negative/0 positive
Re: сообщение - file is in use, но таблица закрыта
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
Igor Korolyov
Для "автооткрывемых" таблиц алиас не задать, увы...

Не заметил в этой теме таких таблиц.

Но если нужно закрыть таблицу с неизвестным алиасом по известному имени файла, то помогут AUSED() и DBF().



Исправлено 2 раз(а). Последнее : akvvohinc, 26.04.17 20:47
Ratings: 0 negative/0 positive
Re: сообщение - file is in use, но таблица закрыта
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
akvvohinc
Не заметил в этой теме таких таблиц.

SELECT * FROM (cName) ...
Где cName это имя и путь к dbf файлу.
Чтобы избежать неоднозначности лучше было бы применить
USE (cName) IN 0 ALIAS csr1
SELECT ... FROM csr1 ... INTO CURSOR csr2 NOFILTER
USE IN SELECT("csr1")
Для корректной работы такого кода достаточно чтобы на момент его вызова не было открытых курсоров с алиасами csr1 и csr2 (csr2 не мешает работе кода, просто он будет закрыт и создан заново).
akvvohinc
Но если нужно закрыть таблицу с неизвестным алиасом по известному имени файла, то помогут AUSED() и DBF().
Да, для текущей датасессии вполне сработает. Другое дело что закрывать курсор открытый не этим же кодом - мягко говоря странный подход (может быть его другой блок кода открывал явно и он всё ещё нужен). Ещё более убого будет закрывать курсоры в чужих датасессиях


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: сообщение - file is in use, но таблица закрыта
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
Igor Korolyov
SELECT * FROM (cName) ...
Где cName это имя и путь к dbf файлу.
Чтобы избежать неоднозначности лучше было бы применить...

И все же никакого "автооткрытия" с "авторождением" алиаса в этом примере нет.
Файл (cName) уже открыт и алиас для него имеется - неявный или явно заданный в USE.
Поэтому никакого нового "неизвестного" алиаса эта команда "автооткрытия" не родит.

О какой неоднозначности ты пишешь?

С тем же эффектом можно было бы написать то же, не используя алиас в SELECT:
USE (cName) IN 0 ALIAS csr1
SELECT ... FROM (cName) ... INTO CURSOR csr2 NOFILTER
USE IN SELECT("csr1")

Так что ТС было достаточно просто указывать явный алиас при открытии таблицы (USE), чтобы в конце закрывать таблицу по этому алиасу. И тогда независимо от того, как называется таблица (соответствует ли ее название допустимым названиям для алиаса), она закроется.
Ratings: 0 negative/0 positive
Re: сообщение - file is in use, но таблица закрыта
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
akvvohinc
И все же никакого "автооткрытия" с "авторождением" алиаса в этом примере нет.
Смотря в каком...
Там чуть ниже криспа написал слегка вредное, и ТС сделал
ProbaSP
ненужное уже убрал.
а закрытие сделал без расширения.
Т.е. первый USE он явно убрал. Соответственно в чистом виде автооткрытие таблицы SELECT-ом и автоприсвоение её алиаса. Впрочем и так USE был без алиаса...
akvvohinc
Файл (cName) уже открыт и алиас для него имеется - неявный или явно заданный в USE.
Ну т.к. USE уже убрали, а и не убирая его он то изначально был без опции ALIAS! То тут в чистом виде "неявный" алиас и получается - и так и этак.
При том даже если имя таблицы вполне себе удовлетворяет правилам применяемым для алиасов то нет абсолютно никакой гарантии, что фокс открыв эту таблицу присвоит ей алиас одноимённый имени dbf файла. Более того вот простейший пример где фокс ГАРАНТИРОВАННО присвоит автооткрытой таблице ДРУГОЙ алиас. И потому последующий USE IN (table) закроет абсолютно не то что нужно! Но кому это интересно? Г*нокод шагает по планете
* Просто создаём таблицу для теста
CREATE TABLE test (id I, name C(10))
INSERT INTO test (id, name) VALUES (1, "Вася")
INSERT INTO test (id, name) VALUES (2, "Петя")
USE
* Пошла мякотка
CREATE CURSOR test (dummy C(1))
SELECT 0
* Подопытный код
cName = "test"
USE (cName) && Пофиг есть такая команда или её нет
SELECT * FROM (cName) INTO CURSOR kBD NOFILTER
USE IN (cName)
SET && Смотрим что получилось в итоге - курсор B это и есть наша dbf таблица, кто бы мог подумать А явный курсор test благополучно закрыли, хотя это ни разу не искомая таблица была.

akvvohinc
Так что ТС было достаточно просто указывать явный алиас при открытии таблицы (USE), чтобы в конце закрывать таблицу по этому алиасу. И тогда независимо от того, как называется таблица (соответствует ли ее название допустимым названиям для алиаса), она закроется.
О том и речь. При этом я, например, не вижу смысла городить огород с name expression в SELECT - уже открыта таблица, алиас известен - зачем лишние телодвижения?
Вот если не парится с явным закрытием dbf (а для приватных датасессий это вполне разумное упрощение) - ну тогда всё проще - пусть фокс сам алиасы присваивает, и в запросе этот самый (cName) и будет...

Хотя необходимость такой "динамики" в запросах это в 99% случаев признак г*но-структуры БД. Куча разноимённых таблиц с одинаковой по структуре информацией, порой распиханных по куче разных папок - при том совершенно не из-за превышения лимита на размер dbf (где это уже будет вынужденная мера) - а просто по тупой FoxBase/Clipper привычке плодить папки с таблицами в неимоверном количестве...


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 28.04.17 14:15
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 14 Sejko  (Гостей: 13)

© 2000-2024 Fox Club 
Яндекс.Метрика