как закрыть временную таблицу

MapInfo, MapBasic
Ответить
sysrepos
Активный участник
Сообщения: 128
Зарегистрирован: 07 окт 2012, 16:25
Репутация: 20
Откуда: Москва

как закрыть временную таблицу

Сообщение sysrepos » 09 дек 2015, 16:15

Как правильно закрыть временную таблицу? (чтобы не оставалось всяких Query1,2,3, и т.д.)
На карте выбран 1 объект, в программе mapbasic есть такой запрос:

Код: Выделить всё

select * from selection into q1

пишу

Код: Выделить всё

close table q1
в Мапинфо остается таблица Query2

пишу

Код: Выделить всё

close table SelectionInfo(SEL_INFO_SELNAME)
в Мапинфо остается временная таблица Query3...

Вопрос: как правильно закрыть временную таблицу q1, чтобы после нее в программе не оставалось других временных таблиц? (все временные таблицы закрывать не нужно, нужно закрыть только q1, и таблицу Query)

thegeo
Активный участник
Сообщения: 160
Зарегистрирован: 17 янв 2012, 18:51
Репутация: 74

Re: как закрыть временную таблицу

Сообщение thegeo » 09 дек 2015, 16:36

Можно просто удалить таблицу
drop Table "Query1"
а вот это непонятно
… чтобы после нее в программе не оставалось других временных таблиц? (все временные таблицы закрывать не нужно…

sysrepos
Активный участник
Сообщения: 128
Зарегистрирован: 07 окт 2012, 16:25
Репутация: 20
Откуда: Москва

Re: как закрыть временную таблицу

Сообщение sysrepos » 09 дек 2015, 17:11

написал вот так:

Код: Выделить всё

	
sup pro1

	select * from selection into q1
	drop table q1
	drop table SelectionInfo(SEL_INFO_SELNAME)

end sub
все равно остается таблица Query
thegeo писал(а): а вот это непонятно
имеется ввиду следующее, есть например, таблица STREET, на ее основе построена временная таблица q1, но так же на основе таблицы STREETмогут быть открыты другие временные таблицы (созданные другими приложениями или пользователями). Они тоже являются временными, но их закрывать не нужно, так как они были созданы не в моей программе.

thegeo
Активный участник
Сообщения: 160
Зарегистрирован: 17 янв 2012, 18:51
Репутация: 74

Re: как закрыть временную таблицу

Сообщение thegeo » 09 дек 2015, 17:40

select * from selection into q1
т.е. вы из выборки делаете копию с именем q1 и теперь имеете две временные таблицы с одинаковым содержанием. И если удалить q1 то базовая таблица Query1 естественно останется. При удалении Query1 используйте имя таблицы в явном виде
dim s as string
s= SelectionInfo(2)
drop Table s
Думаю что теперь ни q1, ни Query1 не будут в списке доступных таблиц.

sysrepos
Активный участник
Сообщения: 128
Зарегистрирован: 07 окт 2012, 16:25
Репутация: 20
Откуда: Москва

Re: как закрыть временную таблицу

Сообщение sysrepos » 09 дек 2015, 18:07

пробовал написать так:

Код: Выделить всё

sub proc1	
	select * from selection into q1
	s= SelectionInfo(2)
	drop Table s
end sub
временная таблица (Query) все равно остается

thegeo
Активный участник
Сообщения: 160
Зарегистрирован: 17 янв 2012, 18:51
Репутация: 74

Re: как закрыть временную таблицу

Сообщение thegeo » 09 дек 2015, 22:21

Предполагается, что на карте выбран один объект и никаких других временных таблиц нет.
Сравните варианты.
Обычный вариант с обычной выборкой. Никаких остаточных явлений не наблюдается.

Код: Выделить всё

sub proc1  
dim s as string  
dim i as integer 
s= SelectionInfo(2)
print s
drop Table s
For i = 1 To NumTables()
	print TableInfo(i,1) 
Next
end sub
Обсуждаемый вариант с затейливой инструкцией select * from selection into q1 приводит к побочному эффекту.

Код: Выделить всё

sub proc2  
dim s as string  
dim i as integer 
select * from selection into q1
drop Table q1
s= SelectionInfo(2)
print s
drop Table s
For i = 1 To NumTables()
	print TableInfo(i,1) 
Next
end sub
Сюда можно добавить отмену выделения (Run Menu Command M_QUERY_UNSELECT) но результата это не даст. Интересно проследить какой именно QueryN остался не удаленным.
Уйти от подобного эффекта достаточно просто.

Код: Выделить всё

sub proc3 
dim s as string  
dim i as integer
s= SelectionInfo(2)
select * from s into q1
drop Table s
drop Table q1
For i = 1 To NumTables()
	print TableInfo(i,1) 
Next
end sub

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: как закрыть временную таблицу

Сообщение Boris » 10 дек 2015, 01:22

sysrepos писал(а):Как правильно закрыть временную таблицу? (чтобы не оставалось всяких Query1,2,3, и т.д.)
На карте выбран 1 объект, в программе mapbasic есть такой запрос:

Код: Выделить всё

select * from selection into q1
Написать как

Код: Выделить всё

select * from selection into q1 Noselect 
Syntax
Select expression_list
From table_name [ , ... ] [ Where expression_group ]
[ Into results_table [ Noselect ] ]
[ Group By column_list ]
[ Order By column_list ]
If you include the Noselect keyword, the statement performs a query without changing the pre-existing Selection table. Use the Noselect keyword if you need to perform a query, but you do not want to de-select whatever rows are already selected.

If you include the Noselect keyword, the query does not trigger the SelChangedHandler procedure.
Запросы нормально удаляются через CLOSE, DROP предназначен для физического уничтожения таблицы, что для виртуальных таблиц/запросов непонятное действие.

Аватара пользователя
ginpetr
Завсегдатай
Сообщения: 374
Зарегистрирован: 21 июн 2011, 12:07
Репутация: 139
Откуда: Орск
Контактная информация:

Re: как закрыть временную таблицу

Сообщение ginpetr » 10 дек 2015, 08:07

Тоже намучился с этими QueryN... заметил, что любое использование имени таблицы selection или функции selectioninfo вынуждает Мапинфо назвать выборку очередным QueryN. Теперь всегда явно указываю имена временных таблиц в моих программках. Хотя удалось только немного уменьшить количество QueryN...

sysrepos
Активный участник
Сообщения: 128
Зарегистрирован: 07 окт 2012, 16:25
Репутация: 20
Откуда: Москва

Re: как закрыть временную таблицу

Сообщение sysrepos » 10 дек 2015, 11:43

вот этот код thegeo решил проблему

Код: Выделить всё

sub proc3 
   dim s as string  
   dim i as integer
   s= SelectionInfo(2)
   select * from s into q1
   drop Table s
   drop Table q1
   For i = 1 To NumTables()
      print TableInfo(i,1) 
   Next
end sub

Stasss
Участник
Сообщения: 68
Зарегистрирован: 15 фев 2018, 18:07
Репутация: 1
Откуда: оттуда

Re: как закрыть временную таблицу

Сообщение Stasss » 02 мар 2018, 13:19

И все-таки остались вопросы по теме.
Есть у меня Selection после выбора объектов мышью.
Т.к. после этого необходимо открыть еще таблицы, делаю select * from Selection into name_table:
появляются name_table и Query(n) (очередной в сессии Query).
Так вот как избавиться от этого Query?

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: как закрыть временную таблицу

Сообщение Boris » 02 мар 2018, 14:26

Я уверен, что значительную часть ваших вопросов, должно решить прочтение документации. В частности функция SelectionInfo() и TableInfo().
Команды Mapbasic-а очень прилично документированы.
PS
И QueryN появляется только в тех случаях, когда появляется неименованный Selection. Для любой выборки, доступной с именем Selection, а бывает еще CurrentSelection - для выборок, которые не были доведены до конца или выборок, которые могут содержать ошибочные данные, сразу создается QueryN. До появления нового Selection или его уничтожения они существуют параллельно. Так что, если НЕ нужен QueryN его имя следует выяснить через SelectionInfo() ДО создания новой выборки, что бы была возможность закрыть его "по имени".
PPS
По моему - ваш вопрос в теме, которой два года, следует рассматривать как новый и начинать его с новой темы.

Stasss
Участник
Сообщения: 68
Зарегистрирован: 15 фев 2018, 18:07
Репутация: 1
Откуда: оттуда

Re: как закрыть временную таблицу

Сообщение Stasss » 02 мар 2018, 15:57

согласен со всем, кроме PPS.
спасибо

Ответить

Вернуться в «MapInfo»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей