Советы шеф-повара: обновление данных в таблицах MapInfo
Автор: FedorinoFF © 2013
Известный и постоянный участник форумов, Юрий Федоринов aka FedorinoFF, как оказалось, уже два года ведёт блог, посвящённый MapInfo. Блог небольшой, но интересный.
Предлагаю вашему вниманию статью из этого блога.
- Введение
- Ручное редактирование
- Полуавтоматизированное редактирование
- Автоматизированное редактирование
Введение
Основная ценность, при работе практически с любыми программами, это данные. У программы, занимающейся работой с данными, должны присутствовать механизмы ввода, редактирования, сохранения данных.
В MapInfo данные хранятся в таблицах и могут содержать две составляющие: графические и семантические данные. Со стороны MapInfo, каждая таблица представляет собой нечто целое, содержащее некоторые записи, у каждой записи обязательно есть минимум одно семантическое поле. Со стороны файловой системы, таблица MapInfo состоит из нескольких файлов, в каждом из которых содержится какая-то информация: семантика, графика, служебная информация, индексные файлы.
Сегодня я захотел написать о редактировании данных, так как это неотъемлемая часть процесса подготовки картографического материала. Ко всем прочему, в форумах регулярно возникают вопросы, связанные с «а как…?»
Я бы разделил возможности по редактированию на три группы:
- ручное редактирование
- полуавтоматизированное редактирование
- автоматизированное редактирование
1. Ручное редактирование
Дешево, надежно и практично. Графические объекты редактируются в окне карты, семантические поля – в окне списка или в окне информации. Хотел бы обратить внимание, что при редактировании таблиц, имеющих графические объекты (Mappable), через окно списка можно создавать записи без графических объектов. Это делается простым добавлением новой записи в окне списка. В последующем, прицепить к таким записям графические объекты, проблематично для неподготовленных пользователей. Если в такой таблице нужно добавить новый графический объект, но необходимо открыть эту таблицу в окне карты и нарисовать нужный графический объект.
2. Полуавтоматизированное редактирование
Под полуавтоматизированным методом я понимаю редактирование с использованием окна MapBasic, построителя запросов и прочих штатных встроенных инструментов MapInfo.
Для полноценного использования такого метода, на мой взгляд, нужны знания языка MapBasic. Сложности в нем нет, но есть особенности версий, есть особенности MapInfo, есть некоторые ограничения на использование MapBasic в одноименном окне MapInfo. Как я уже упоминал в ранних постах, документация MapInfo и MapBasic на очень хорошем уровне, и даже самостоятельное изучение не вызовет проблем.
В качестве живого примера полуавтоматизированного обновления приведу простой пример. Возникла элементарная и показательная задача по замене двойных кавычек на одинарные в поле таблицы. Хоть MapBasic и довольно развитый язык, но, в основном, он содержит базовые (элементарные) функции. И строковой функции «ЗаменитьПодстроку» в нем нет. Зато есть огромное поле для фантазий по решению задачи с использованием ограниченного набора инструментов. Решение простое :-). Пара команд:
select * from SrcTable where InStr(1, SrcField, SrcSubstring) > 0 into TmpTable noselect update TmpTable set SrcField = Mid$(SrcField, 1, InStr(1, SrcField, SrcSubstring) - 1) + NewSubString + Mid$(SrcField, InStr(1, SrcField, SrcSubstring) +Len(SrcSubstring) , 254)
Выполняем эту пару два раза и получаем реш`нную задачу…
Первая команда select дает нам выборку записей исходной таблицы, в исходном поле которой есть требуемая для замены подстрока (в нашем случае – символ двойной кавычки ["]). В результате мы получаем запросную таблицу TmpTable. Теперь любые изменения в записях таблицы TmpTable автоматически записываются в соответствующие записи исходной таблицы SrcTable. Кто-то может спросить: а почему нельзя сразу написать update SrcTable …?
Использование промежуточной таблицы обусловлено тем, что прямой update может вызвать ошибку, в случае если встретится запись, в которой в просматриваемом поле не искомой подстроки. Перехватывать ошибки в окне MapBasic невозможно, поэтому используется промежуточная таблица.
Вторая команда (update…) производит замену нашей SrcSubstring на NewSubString.
Просто и быстро.
Если надо произвести изменение графического объекта, то команда может выглядеть следующим образом:
update SrcTable set obj = ConvertToPLine(obj)
эта команда превратит все графические объекты в полилинии.
update SrcTable set obj = CreatePoint(x,y)
а эта команда создаст для каждой записи точечный объект, при условии, что в таблице есть поля x и y с координатами.
3. Автоматизированное редактирование
Под автоматизированным редактированием я понимаю использование специализированной программы на языке MapBasic.
Это, пожалуй, универсальный метод, позволяющий реализовать все, что душе угодно. С опытом, каждый для себя сможет сформулировать критерии, по которым можно принимать решение о выборе подхода, для решения вопроса о редактировании данных. Зачастую, написать пару команд в окне MapBasic позволяет выполнить задачу быстрее, нежели подготовка самой простой программы на MapBasic.
Простейшая программа для наших целей будет содержать всего две функции: обязательную main и пользовательскую, которая производит обработку строки.
sub main update TmpTable set SrcField = StringReplace(SrcField, SrcSubstring, NewSubString ) end sub
function StringReplace(byval aStr as string, byval aOldSub as string, byval aNewSub as string) as string … StringReplace = … end function
Что мы имеем?
В коде присутствует обязательная для каждой программы MapBasic sub main, в которой происходит обновление поля таблицы.
Функция StringReplace( ) производит обработку значения поля SrcField: заменяет все вхождения SrcSubstring на NewSubString.
Если нужна функция для обработки графических объектов, то ее объявление может иметь следующий вид
function ModifyObject(byval aObj as object) as object … ModifyObject = … end function
В программе можно использовать все возможности MapBasic. Остается откомпилировать текст программы при помощи компилятора MapBasic и запустить ее на выполнение.
Вот, пожалуй, и все. Общая тема обозначена, все остальное – дело техники и опыта. Не бойтесь изучать, экспериментировать и думать.
Оригинал:
Советы шеф-повара: обновление данных в таблицах