Изменение структуры таблиц пакетно

MapInfo, MapBasic
Ответить
zuhell
Участник
Сообщения: 52
Зарегистрирован: 24 ноя 2009, 22:53
Репутация: 0

Изменение структуры таблиц пакетно

Сообщение zuhell » 13 сен 2011, 16:34

Доброго времени суток!
Меня интересует вопрос как можно изменить структуру нескольких таблиц пакетно. Подскажите пожалуйста как это сделать на MapBasic.

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

Re: Изменение структуры таблиц пакетно

Сообщение Boris » 13 сен 2011, 16:54

попробуйте так: откройте таблицу в мапинфо; включите отображение окна мапбайсик; измените поля в таблице и нажмите "ОК"; проанализируйте команды, которые будут выведены в окно мапбайсика.

zuhell
Участник
Сообщения: 52
Зарегистрирован: 24 ноя 2009, 22:53
Репутация: 0

Re: Изменение структуры таблиц пакетно

Сообщение zuhell » 13 сен 2011, 17:17

У меня получилось вот так:

Alter Table "kv8" ( drop KODSUB,NAMESUB,NOMLESX,NAMELESX,NOMLESN,NAMELESN add NOMLESUCH Decimal(2,0),NAMELESUCH Char(30) order NOMLES,NAMELES,NOMULES,NAMEULES,NOMLESUCH,NAMELESUCH,NOMKVR) Interactive

Что дальше нужно сделать? Я просто только начинаю учиться MapBasic

SergS
Активный участник
Сообщения: 120
Зарегистрирован: 14 апр 2011, 13:24
Репутация: 5
Откуда: Екатеринбург

Re: Изменение структуры таблиц пакетно

Сообщение SergS » 14 сен 2011, 05:14

а дальше зацикливаете весь этот фрагмент:

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

dim i as integer
dim tlist() as string ' массив имен таблиц - формируете его дополнительно, например в диалоге, или все таблицы в каталоге, или еще как. главное, чтоб на момент появления оператора ALTER таблица была открыта.
.......

for i = 1 to ubound(tlist)
     Alter Table tlist(i) ( drop KODSUB,NAMESUB,NOMLESX,NAMELESX,NOMLESN,NAMELESN add NOMLESUCH Decimal2,0),  NAMELESUCH Char(30) order NOMLES,NAMELES,NOMULES,NAMEULES,NOMLESUCH,NAMELESUCH,NOMKVR)
next
здесь кроется несколько засад, главная из которых - предположение об едентичности структур - имею ввиду наличие перечисленных полей, даже не их порядок. Но, в принципе все обходится с использованием OnError.

zuhell
Участник
Сообщения: 52
Зарегистрирован: 24 ноя 2009, 22:53
Репутация: 0

Re: Изменение структуры таблиц пакетно

Сообщение zuhell » 14 сен 2011, 05:48

то есть после "as string ' " я формирую список открытых таблиц,
потом в мапинфо в окне мапбейсика ввожу весь этот код и все работает?

SergS
Активный участник
Сообщения: 120
Зарегистрирован: 14 апр 2011, 13:24
Репутация: 5
Откуда: Екатеринбург

Re: Изменение структуры таблиц пакетно

Сообщение SergS » 14 сен 2011, 08:11

не, не работает....
в окне mapbasic циклы не работают.
этот код надо оформить как программу и откомпилировать в mapbasic. изапускать получившийся mbx как программу в mapinfo

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

Re: Изменение структуры таблиц пакетно

Сообщение Boris » 14 сен 2011, 08:42

Вроде все верно. Я давно не пробовал что-то делать через среду MapBasic'а, т.к. ее возможности к интерактивности и удобству использования функций ОС ужасны.
Для массовой обработки таблиц мне всегда хватает командной строки Windows (cmd)и оператора FOR, который позволяет строить набор команд для мапбайсика. В прочем подойдет любой язык программирования. умеющий создавать текстовые файлы. Окно мапбайсика в маинфо не умет выполнять команды цикла и условий, все остальные команды она выполняет. Поэтому, если в это окно загрузить последовательность команд мапбайсик, выделить их все и нажать ВВОД, то они все строчка за строчкой и выполняться. Можно и по одной строке нажимать ввод, что бы отладить работу.
Для организации единой работы, что бы не заморачиваться на имя таблицы, я использую оператор открыть

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

Open Table filename [ As tablename ]
с фиксированным именем на пример,

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

Open Table "c:\temp\temp001.tab" As A
тогда все дальнейшие операции можно выписать единообразно для таблицы с именем А, главное не забывать закрывать эту таблицу перед загрузкой следующей:

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

Close Table A
В силу своей крайней ленивости, и для массовой обработки я держу скрипт-файл на языке VBS. Как известно VBS встроен в любую OC Windows (вернее в Intrenet Explorer от версии 5.0 и выше), который берет любой текстовый файл с командами на языке mapBasic, без циклов и проверок условий, и скармливает его построчно запущенной копии MapInfo:
doMapbasic_in_MapInfo.vbs.7z
(10.38 КБ) 429 скачиваний

zuhell
Участник
Сообщения: 52
Зарегистрирован: 24 ноя 2009, 22:53
Репутация: 0

Re: Изменение структуры таблиц пакетно

Сообщение zuhell » 16 сен 2011, 12:07

Я чет совсем запутался( Как мне лучше сделать? Использовать vbs файл или скомпилировать mbx?
Еще вопрос vbs файл нужно запускать через командную строку или как-то по-другому?
Большая просьба опишите на данном примере как все сделать от начала и до конца с vbs файлом.

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

Re: Изменение структуры таблиц пакетно

Сообщение Boris » 16 сен 2011, 17:11

VBS Файл запускается из командной строки, что позволяет использовать его в условных командах командной строки. В частности FOR, а это позволяет организовать массовую обработку файлов. На пример,

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

FOR %a in (*.tab) do @echo "%~fa"
выведет на экран список всех TAB файлов текущего каталога.
Если все таблицы имеют единую структуру, то для их обработки надо выполнить задачу, которая делиться на две части:
а) открыть верную таблицу в неким фиксированным именем

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

open Table "c:\mytab.tab" As A
- это легко делается приведенной выше командой
б) выполнить для таблицы А (это имя внутри MapInfo) - набор фиксированных команд, коотрые можно заранее выписать в любом текстовом редакторе. пусть они лежат в файле с названием 1.txt
Тогда из командной строки набираем:

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

FOR %a in (*.tab) do @echo open Table "%~fa" As A > miCmd.txt & copy /a miCmd.txt+1.txt miCmd.txt & doMapbasic_in_MapInfo.vbs miCmd.txt 
Если нет времени, желания или привычки использовать командную строку - не мучьте себя пишите все на mapBasic'е. Хотя с тем же успехом можно использовать и любой другой более дружественный язык программирования, связываясь с MapInfo Через OLE интрефейс. В старых хелпах по mapBasic'у был раздел Integrated Mapping, описывались функции для общения, в новых что-то он ужат до крайности.

Ответить

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

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

Сейчас этот форум просматривают: Bing [Bot] и 5 гостей