:: Visual Foxpro, Foxpro for DOS
iscursor
alex;
Автор

Сообщений: 3378
Откуда: Москва
Дата регистрации: 23.11.2004
Нашел в сети код определения является ли алиас курсором
FUNCTION IsCursor(tcAlias)
IF EMPTY(m.tcAlias)
m.tcAlias = ALIAS()
ENDIF
RETURN VARTYPE(m.tcAlias) == "C" AND !EMPTY(m.tcAlias) AND USED(m.tcAlias) ;
AND ISEXCLUSIVE(m.tcAlias) ;
AND CURSORGETPROP("SourceType", m.tcAlias) == 3 ;
AND UPPER(JUSTEXT(CURSORGETPROP("SourceName", m.tcAlias))) == "TMP" ;
AND UPPER(JUSTPATH(CURSORGETPROP("SourceName", m.tcAlias))) == UPPER(GETENV("TEMP"))
ENDFUNC
Думаю на 99% рабочий вариант.
Других вариантов нет?

P.S. Для повышения вероятности добавил ISEXCLUSIVE.



Исправлено 1 раз(а). Последнее : alex;, 14.07.24 13:32
Ratings: 0 negative/0 positive
Re: iscursor
alex;
Автор

Сообщений: 3378
Откуда: Москва
Дата регистрации: 23.11.2004
Забавно, после ALTER TABLE становится доступным свойство "Properties" в окне "Data session"
CREATE CURSOR qwe(id n(1))
ALTER TABLE qwe ADD id2 n(1)
Ratings: 0 negative/0 positive
Re: iscursor
akvvohinc

Сообщений: 4551
Откуда: Москва
Дата регистрации: 11.11.2008
alex;
Думаю на 99% рабочий вариант.
Если специально не задаваться целью обмануть эту проверку, то наверно.
Но при таких условиях, думаю, хватило бы простой проверки расширения или, на худой конец, добавить ещё и проверку имени.
"Процент достоверности" от этого вряд ли бы понизился.

Цитата:
Забавно, после ALTER TABLE становится доступным свойство "Properties" в окне "Data session"
После этой команды появляется реальный файл для этого курсора.

Проверь:
? FILE(DBF())
до и после этой команды.

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



Исправлено 2 раз(а). Последнее : akvvohinc, 14.07.24 18:47
Ratings: 0 negative/0 positive
Re: iscursor
alex;
Автор

Сообщений: 3378
Откуда: Москва
Дата регистрации: 23.11.2004
SourceName для курсора из SQLEXEC() пустое.
Так что DBF()
FUNCTION IsCursor(tcAlias)
IF EMPTY(m.tcAlias)
m.tcAlias = ALIAS()
ENDIF
RETURN VARTYPE(m.tcAlias) == "C" AND !EMPTY(m.tcAlias) AND USED(m.tcAlias) ;
AND ISEXCLUSIVE(m.tcAlias) ;
AND (CURSORGETPROP("SourceType", m.tcAlias) != 3 ;
OR (UPPER(JUSTEXT(DBF(tcAlias))) == "TMP" ;
AND UPPER(JUSTPATH(DBF(tcAlias))) == UPPER(GETENV("TEMP"))))
ENDFUNC

Для моей задачи достаточно анализа CURSORGETPROP("SourceType", m.tcAlias) != 3



Исправлено 2 раз(а). Последнее : alex;, 14.07.24 19:44
Ratings: 0 negative/0 positive
Re: iscursor
akvvohinc

Сообщений: 4551
Откуда: Москва
Дата регистрации: 11.11.2008
alex;
Для моей задачи достаточно анализа CURSORGETPROP("SourceType", m.tcAlias) != 3
Может быть.
Но все "самые обычные" способы создания курсора (create cursor, select * from ... into cursor) не отличат его от таблицы по SourceType.
Я получаю 3 во всех случаях.
Ratings: 0 negative/0 positive
Re: iscursor
PaulWist

Сообщений: 14740
Дата регистрации: 01.04.2004
У курсора всегда расширение tmp, даже если самого файла на диске нет.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: iscursor
akvvohinc

Сообщений: 4551
Откуда: Москва
Дата регистрации: 11.11.2008
PaulWist
У курсора всегда расширение tmp
Но и таблица может иметь такое же расширение.
Ratings: 0 negative/0 positive
Re: iscursor
PaulWist

Сообщений: 14740
Дата регистрации: 01.04.2004
akvvohinc
PaulWist
У курсора всегда расширение tmp
Но и таблица может иметь такое же расширение.

Может.

НО других "железных" свойств нет.

Как отличить временный курсор от алиаса таблички?


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: iscursor
sphinx

Сообщений: 31888
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
А в заголовке не прочитать нужный байтик? Может и бредовая мысль...
Но даже если и можно - по коду точно не компактнее.


------------------
"Veni, vidi, vici!"(с)




Исправлено 1 раз(а). Последнее : sphinx, 15.07.24 08:31
Ratings: 0 negative/0 positive
Re: iscursor
akvvohinc

Сообщений: 4551
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
А в заголовке не прочитать нужный байтик?
Даже если б такой байтик и был, то как выполнить FOPEN() над открытым файлом?
Ratings: 0 negative/0 positive
Re: iscursor
sphinx

Сообщений: 31888
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Ок


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: iscursor
sphinx

Сообщений: 31888
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
akvvohinc
Цитата:
А в заголовке не прочитать нужный байтик?
Даже если б такой байтик и был, то как выполнить FOPEN() над открытым файлом?

Я бы так-то ДО открытия проверял (если есть смысл). А кто хочет при открытом - не знаю, вопрос не ко мне.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: iscursor
akvvohinc

Сообщений: 4551
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Я бы так-то ДО открытия проверял
Проверять файл курсора до его создания?
Ratings: 0 negative/0 positive
Re: iscursor
Каратаев

Сообщений: 4048
Откуда: Алматы
Дата регистрации: 04.12.2001
Вообще, когда-то очень давно, взял себе за правило: имена всех создаваемых курсоров начинаются с cur_...
Например, таблица adres.dbf, курсор на её основе cur_adres или cur_adr
Поэтому нет необходимости как-то ещё проверять это курсор или таблица.
Хотя наверное могут быть ещё какие-то ситуации...


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/1 positive
Re: iscursor
akvvohinc

Сообщений: 4551
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Поэтому нет необходимости как-то ещё проверять это курсор или таблица.
А мне интереснее узнать, в каких ситуациях вообще возникала необходимость в такой проверке - я пока (за 35 лет) с ней не сталкивался.
Ratings: 0 negative/0 positive
Re: iscursor
alex;
Автор

Сообщений: 3378
Откуда: Москва
Дата регистрации: 23.11.2004
Мне надо было узнать какие алиасы в проекте используют
буферизацию для обновления данных на сервере через TableUpdate().
А потом возник чисто теоретический вопрос.
Сам фокс знает где взять инфу о том что алиас это курсор.
Наглядно, для таблиц в статусбаре показывается путь,
а для курсоров алиас.
Вот и подумал, что разработчики фокса могли поделиться этим секретом.



Исправлено 2 раз(а). Последнее : alex;, 16.07.24 12:58
Ratings: 0 negative/0 positive
Re: iscursor
alex;
Автор

Сообщений: 3378
Откуда: Москва
Дата регистрации: 23.11.2004
Есть в проекте таблица на сервере с мемо по несколько Mb. Она загружается при старте программы. Долго.
Сделал параллельную загрузку, а оказалось что она использует буферизацию.
Пришлось добавить SQLEXEC("select ... where 0=1")
,вставить данные полученные из параллельной загрузки
и включить буферизацию.



Исправлено 2 раз(а). Последнее : alex;, 16.07.24 12:58
Ratings: 0 negative/0 positive
Re: iscursor
alex;
Автор

Сообщений: 3378
Откуда: Москва
Дата регистрации: 23.11.2004
Еще глюк словил на этой теме.
Вставил DEFINE CLASS TableLoader ... END DEFINE в середину модуля.
В отладчике остановил, запустил поиск определения процедуры,
оказалось, что процедура Print1 стала для выполняемой программы
методом TableLoader.Print1, хотя была вне контекста.
В итоге перенес определение класса в конец модуля.
Ratings: 0 negative/0 positive
Re: iscursor
alex;
Автор

Сообщений: 3378
Откуда: Москва
Дата регистрации: 23.11.2004
alex;
Забавно, после ALTER TABLE становится доступным свойство "Properties" в окне "Data session"
CREATE CURSOR qwe(id n(1))
ALTER TABLE qwe ADD id2 n(1)

А так не работает.
CREATE CURSOR test(abcdefgh0123456789 N(10))
ALTER TABLE test ADD c1 C(10)
Ratings: 0 negative/0 positive
Re: iscursor
akvvohinc

Сообщений: 4551
Откуда: Москва
Дата регистрации: 11.11.2008
alex;
А так не работает.
Длина имен полей свободных таблиц - не более 10 символов.
То есть в примере выше курсор не может "превратиться в таблицу", и поэтому ALTER TABLE для такого курсора не срабатывает.
Может, такое объяснение и не совсем корректно, но то, что "проблема" (разница в поведении) именно в длине имени поля, сомнений не вызывает.
Ratings: 0 negative/0 positive


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

On-line: 19 alex; leonid  (Гостей: 17)

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