Временная колонка с выражением на MapBasic

MapInfo, MapBasic
Ответить
Dartix
Участник
Сообщения: 78
Зарегистрирован: 05 апр 2014, 17:13
Репутация: 5

Временная колонка с выражением на MapBasic

Сообщение Dartix » 24 сен 2015, 11:20

Подскажите как создать временную колонку с выражением в среде программы MapBasic?

Имеется таблица с колонками a и b (в таблице кроме этих колонок может быть дополнительно любое число колонок) к которой нужно добавить временную колонку с выражением a+"x"+b+"y"

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

Re: Временная колонка с выражением на MapBasic

Сообщение ginpetr » 24 сен 2015, 14:24

Что-то мне подсказывает, что то, что Вы хотите сделать, можно сделать по-другому. Для чего Вам такая временная колонка?

Dartix
Участник
Сообщения: 78
Зарегистрирован: 05 апр 2014, 17:13
Репутация: 5

Re: Временная колонка с выражением на MapBasic

Сообщение Dartix » 24 сен 2015, 14:51

Есть 2 таблицы tabl1 и tabl2:
1. с колонками a1 и b1
2. с колонками a2 и b2
мне нужно сравнить данные этих таблиц используя поля a и b как ключевые.

Сначала пользовался условием объединения
where a1+"x"+b1+"y" = all(select a2+"x"+b2+"y" from tabl2),
но код программы довольно большой и используя каждый раз данный способ объединения выполнение программы происходит медленно

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

Re: Временная колонка с выражением на MapBasic

Сообщение ginpetr » 24 сен 2015, 20:09

Дубли ищите? Это, наверное, в любом случае процесс долгий...
Мапинфо почему-то не любит добавлять динамические колонки к таблице, рассчитанные из её же колонок.
Хотите сделать колонки с неким подобием уникальных индексов и по ним сравнивать записи?

Dartix
Участник
Сообщения: 78
Зарегистрирован: 05 апр 2014, 17:13
Репутация: 5

Re: Временная колонка с выражением на MapBasic

Сообщение Dartix » 24 сен 2015, 21:34

Дубли и не только. Программа сравнивает многие значения 2х таблиц. Нужна именно временная колонка с уникальными индексами. Дело в том, что в среде МапИнфо такую колонку можно добавить к таблице: в списке таблицы с помощью кнопки "отобрать поля". Но вот как это сделать в среде МапБесик так и не нашел(

[ Сообщение с мобильного устройства ]

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

Re: Временная колонка с выражением на MapBasic

Сообщение ginpetr » 24 сен 2015, 21:51

Add column должна это делать, но не всегда хочет. А если и получается, то не всегда динамически.

Dartix
Участник
Сообщения: 78
Зарегистрирован: 05 апр 2014, 17:13
Репутация: 5

Re: Временная колонка с выражением на MapBasic

Сообщение Dartix » 25 сен 2015, 07:58

Пробовал
Add column tabl1 (key_col) from tabl1 set to a1+"x"+b1+"y"
Добавляется временная колонка key_col, но в ней только значения колонки a1

gamm
Гуру
Сообщения: 4044
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1049
Ваше звание: программист
Откуда: Казань

Re: Временная колонка с выражением на MapBasic

Сообщение gamm » 25 сен 2015, 14:16

поскольку SQL в Мапинфе убогий, вывалите все в Access (или в любую другую СУБД), там все спокойно сделайте, и закачайте результат обратно. Будет быстрее, особенно если таблицы большие.

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

Re: Временная колонка с выражением на MapBasic

Сообщение thegeo » 25 сен 2015, 14:56

Попробуйте так:
select * From tstCol01 into ss
Add Column tstCol01(key1) From ss Set to ss.a+ss.b+10 Where a=a Dynamic
Впрочем, так тоже будет работать
Add Column tstCol01(key2) From tstCol01 Set to tstCol01.a+tstCol01.b+10 Where a=a Dynamic
Вложения
miHG370.png
Результат
miHG370.png (13.84 КБ) 8965 просмотров

Dartix
Участник
Сообщения: 78
Зарегистрирован: 05 апр 2014, 17:13
Репутация: 5

Re: Временная колонка с выражением на MapBasic

Сообщение Dartix » 25 сен 2015, 15:49

gamm писал(а):поскольку SQL в Мапинфе убогий, вывалите все в Access (или в любую другую СУБД), там все спокойно сделайте, и закачайте результат обратно. Будет быстрее, особенно если таблицы большие.
Тогда проще было бы добавить не временную колонку и потом её удалить, но этот вариант не подходит, потому что таблица может содержать не сохранённые изменения, а операция со структурой может совершаться только с сохранённой таблицей.
Необходимо работа именно с исходной таблицей (не с копиями).
thegeo писал(а):Попробуйте так:
select * From tstCol01 into ss
Add Column tstCol01(key1) From ss Set to ss.a+ss.b+10 Where a=a Dynamic
Впрочем, так тоже будет работать
Add Column tstCol01(key2) From tstCol01 Set to tstCol01.a+tstCol01.b+10 Where a=a Dynamic
В таком случае значения в колонке key1 не во всех случаях будут уникальными:
a______b______key1
14____17______41
17____14______41


Неужели нельзя в среде MapBasic выполнить операцию, выполняемую функцией "Отобрать поля" MapInfo?
Вложения
Отобрать поля.jpg
Отобрать поля.jpg (166.91 КБ) 8944 просмотра

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

Re: Временная колонка с выражением на MapBasic

Сообщение thegeo » 25 сен 2015, 16:07

Вопрос уникальности это ваш выбор. Выражение (tstCol01.a+tstCol01.b+10) я вставил лишь для примера. Не понял в чем отличие от результата даваемого функцией "Отобрать поля".

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

Re: Временная колонка с выражением на MapBasic

Сообщение thegeo » 25 сен 2015, 19:02

Виноват, но полагал что это тривиальное преобразование. Вот точно под ваши требования.
Add Column tstCol01(key2 char(15)) From tstCol01 Set to tstCol01.a & "x" & tstCol01.b & "y" Where a=a Dynamic

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

Re: Временная колонка с выражением на MapBasic

Сообщение ginpetr » 25 сен 2015, 19:10

thegeo писал(а):Виноват, но полагал что это тривиальное преобразование. Вот точно под ваши требования.
Add Column tstCol01(key2 char(15)) From tstCol01 Set to tstCol01.a & "x" & tstCol01.b & "y" Where a=a Dynamic
А то же самое с условием объединения по rowid работает? Просто значения a могут повторяться...

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

Re: Временная колонка с выражением на MapBasic

Сообщение thegeo » 25 сен 2015, 19:33

Не думаю, т.к. условие становится достаточно бессмысленным. Но ничто не мешает добавить колонку и заполнить ее RowId (и при необходимости ее можно обновлять).

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

Re: Временная колонка с выражением на MapBasic

Сообщение Boris » 29 сен 2015, 02:06

Без внятного описания задачи, все сказанное выше и ниже - это сплошная игра в угадайку. Для нормальных операций над таблицами, как сказано тут:
gamm писал(а):поскольку SQL в Мапинфе убогий, вывалите все в Access (или в любую другую СУБД), там все спокойно сделайте, и закачайте результат обратно. Будет быстрее, особенно если таблицы большие.
правильно использовать НОРМАЛЬНУЮ реализацию SQL, если задача сводится к запросу или их последовательности.
В Mapinfo для этого УЖЕ есть стандартное решение, при котором данные хранятся в родной таблице Mapinfo, построенной не на DBF-е, а на Access'е (см. команду "сохранить как..."), после чего можно использовать всю мощь Access. Еще 15 лет назад до эпохи дешевых SQL серверов на этой возможностии было сделано море различных тяжелых задач, которые потом ушли в ГИС серверные приложения, а тут всего на всего две таблицы объединить каким то замысловатым образом.
К тому же в таблицах на основе Access RowID доступен в поле таблицы и не меняется без специальных действий.

Ответить

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

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

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