Страница 1 из 1
Изменение структуры таблиц пакетно
Добавлено: 13 сен 2011, 16:34
zuhell
Доброго времени суток!
Меня интересует вопрос как можно изменить структуру нескольких таблиц пакетно. Подскажите пожалуйста как это сделать на MapBasic.
Re: Изменение структуры таблиц пакетно
Добавлено: 13 сен 2011, 16:54
Boris
попробуйте так: откройте таблицу в мапинфо; включите отображение окна мапбайсик; измените поля в таблице и нажмите "ОК"; проанализируйте команды, которые будут выведены в окно мапбайсика.
Re: Изменение структуры таблиц пакетно
Добавлено: 13 сен 2011, 17:17
zuhell
У меня получилось вот так:
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
Re: Изменение структуры таблиц пакетно
Добавлено: 14 сен 2011, 05:14
SergS
а дальше зацикливаете весь этот фрагмент:
Код: Выделить всё
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.
Re: Изменение структуры таблиц пакетно
Добавлено: 14 сен 2011, 05:48
zuhell
то есть после "as string ' " я формирую список открытых таблиц,
потом в мапинфо в окне мапбейсика ввожу весь этот код и все работает?
Re: Изменение структуры таблиц пакетно
Добавлено: 14 сен 2011, 08:11
SergS
не, не работает....
в окне mapbasic циклы не работают.
этот код надо оформить как программу и откомпилировать в mapbasic. изапускать получившийся mbx как программу в mapinfo
Re: Изменение структуры таблиц пакетно
Добавлено: 14 сен 2011, 08:42
Boris
Вроде все верно. Я давно не пробовал что-то делать через среду MapBasic'а, т.к. ее возможности к интерактивности и удобству использования функций ОС ужасны.
Для массовой обработки таблиц мне всегда хватает командной строки Windows (cmd)и оператора FOR, который позволяет строить набор команд для мапбайсика. В прочем подойдет любой язык программирования. умеющий создавать текстовые файлы. Окно мапбайсика в маинфо не умет выполнять команды цикла и условий, все остальные команды она выполняет. Поэтому, если в это окно загрузить последовательность команд мапбайсик, выделить их все и нажать ВВОД, то они все строчка за строчкой и выполняться. Можно и по одной строке нажимать ввод, что бы отладить работу.
Для организации единой работы, что бы не заморачиваться на имя таблицы, я использую оператор открыть
с фиксированным именем на пример,
тогда все дальнейшие операции можно выписать единообразно для таблицы с именем А, главное не забывать закрывать эту таблицу перед загрузкой следующей:
В силу своей крайней ленивости, и для массовой обработки я держу скрипт-файл на языке VBS. Как известно VBS встроен в любую OC Windows (вернее в Intrenet Explorer от версии 5.0 и выше), который берет любой текстовый файл с командами на языке mapBasic, без циклов и проверок условий, и скармливает его построчно запущенной копии MapInfo:
Re: Изменение структуры таблиц пакетно
Добавлено: 16 сен 2011, 12:07
zuhell
Я чет совсем запутался( Как мне лучше сделать? Использовать vbs файл или скомпилировать mbx?
Еще вопрос vbs файл нужно запускать через командную строку или как-то по-другому?
Большая просьба опишите на данном примере как все сделать от начала и до конца с vbs файлом.
Re: Изменение структуры таблиц пакетно
Добавлено: 16 сен 2011, 17:11
Boris
VBS Файл запускается из командной строки, что позволяет использовать его в условных командах командной строки. В частности FOR, а это позволяет организовать массовую обработку файлов. На пример,
выведет на экран список всех TAB файлов текущего каталога.
Если все таблицы имеют единую структуру, то для их обработки надо выполнить задачу, которая делиться на две части:
а) открыть верную таблицу в неким фиксированным именем
- это легко делается приведенной выше командой
б) выполнить для таблицы А (это имя внутри 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, описывались функции для общения, в новых что-то он ужат до крайности.