onError работает с одной ошибкой, но не с двумя и более

MapInfo, MapBasic
Ответить
grandred75
Интересующийся
Сообщения: 26
Зарегистрирован: 29 апр 2021, 10:38
Репутация: 1
Откуда: Москва

onError работает с одной ошибкой, но не с двумя и более

Сообщение grandred75 » 15 дек 2022, 09:06

Здравствуйте.
Есть ряд таблиц, с которыми хочу проделать некоторые преобразования. Но так, чтобы при отсутствии одной или нескольких из них процесс не остановился и программа не вылетела ...
В следующем коде программа работает, и даже до конца. При этом может отсутствовать одна из таблиц. Но если НЕ открыто БОЛЕЕ одной таблицы программа вылетает с ошибкой в строке seleсt первой отсутствующей таблицы.
Вложения
Sub сети.png
Sub сети.png (93.68 КБ) 3484 просмотра

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

Re: onError работает с одной ошибкой, но не с двумя и более

Сообщение gamm » 15 дек 2022, 10:42

у вас струтктура программы неверная, посмотрите пример OnError в руководстве Мапвасика.

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

OnError GoTo no_states
Open Table "states"
OnError GoTo no_cities
Open Table "cities"
Map From cities, states
after_mapfrom:
OnError GoTo 0
'
' ...
'
End Program
no_states:
Note "Не удалось открыть таблицу states"
Resume after_mapfrom
no_cities:
Note "Не удалось открыть таблицу cities"
Map From states
Resume after_mapfrom

grandred75
Интересующийся
Сообщения: 26
Зарегистрирован: 29 апр 2021, 10:38
Репутация: 1
Откуда: Москва

Re: onError работает с одной ошибкой, но не с двумя и более

Сообщение grandred75 » 15 дек 2022, 11:09

Да, я пытался по данной структуре решить свою задачу. Но, похоже, данный оператор этого сделать не позволяет.
Может есть другое решение?

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

Re: onError работает с одной ошибкой, но не с двумя и более

Сообщение gamm » 15 дек 2022, 14:02

у вас структура кривая в любом случае. После возникновения ошибки вы должны уйти в обработчик, а потом вернуться, сбросив ошибку (resume, а не переходить в другое место программы - у вас, судя по всему, до resume вообще никогда не доходит).

Можно в обработчиках запоминать в какой-то переменной (массиве), кого не хватает. Примерно так в примере и написано, только там вместо этого сообщение выдается. Т.е. вы по метке after_mapfrom: проверяете массив, и если там все позиции ОК, то у вас все таблицы уже открыты. Если что-то не ОК, то ругаетесь, закрываете открытые, и т.д.

grandred75
Интересующийся
Сообщения: 26
Зарегистрирован: 29 апр 2021, 10:38
Репутация: 1
Откуда: Москва

Re: onError работает с одной ошибкой, но не с двумя и более

Сообщение grandred75 » 21 дек 2022, 12:50

Подсказали использовать оператор Do Case. Задачка стала решаться, но теперь заминка в регистре названия таблиц. Т.е. если перечислять имена таблиц следующим образом: Case "Водопровод", "Водосток", "Канализация" и т.п., то только таблицы строго с такими именами будут обрабатываться. Таблицы, начинающиеся с маленькой буквы (водопровод, водосток, канализация) уже в расчет браться не будут.

Вопрос: Как записать имена таблиц, так чтобы регистр не имел значения?

Dim n, count as Integer
Dim CurrentTable as string
'If NumTables( ) > 0 Then
For n = 1 to NumTables( )
If TableInfo(n , TAB_INFO_TYPE) = TAB_TYPE_BASE Then
CurrentTable = TableInfo(n , TAB_INFO_NAME)
Do Case CurrentTable

Case "Водопровод", "Водосток", "Канализация"
Select * from CurrentTable where Str$(obj)="point" into TEMP_ING NoSelect
Delete From TEMP_ING
Close Table TEMP_ING

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

Re: onError работает с одной ошибкой, но не с двумя и более

Сообщение gamm » 21 дек 2022, 16:38

grandred75 писал(а):
21 дек 2022, 12:50
Как записать имена таблиц, так чтобы регистр не имел значения?
не мучайтесь, допишите все варианты в список. Либо переведите все буквы в маленькие LCase$(str) в отдельный вектор той же длины, и используйте его для сравнения

grandred75
Интересующийся
Сообщения: 26
Зарегистрирован: 29 апр 2021, 10:38
Репутация: 1
Откуда: Москва

Re: onError работает с одной ошибкой, но не с двумя и более

Сообщение grandred75 » 21 дек 2022, 18:23

Спасибо за ответ. Дело в том, что всех вариантов у меня порядка 3 тысяч, с учетом Верхних, нижних и комбинированных регистров. Состоят таблицы из 3-4 слов ... Т.о. строка получается длинной около 55 тыс. символов. Понимаю, что дикость ) Тем не менее, хотелось найти решение.
Не расскажете поподробней как можно использовать LCase$(str) ?

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

Re: onError работает с одной ошибкой, но не с двумя и более

Сообщение gamm » 21 дек 2022, 18:57

не мудрите :mrgreen:

хватит
Do Case LCase$(CurrentTable)
Case "водопровод", "водосток", "канализация"

grandred75
Интересующийся
Сообщения: 26
Зарегистрирован: 29 апр 2021, 10:38
Репутация: 1
Откуда: Москва

Re: onError работает с одной ошибкой, но не с двумя и более

Сообщение grandred75 » 22 дек 2022, 08:40

Да, действительно, работает!!!
Премного благодарен!!! :D

grandred75
Интересующийся
Сообщения: 26
Зарегистрирован: 29 апр 2021, 10:38
Репутация: 1
Откуда: Москва

Re: onError работает с одной ошибкой, но не с двумя и более

Сообщение grandred75 » 27 дек 2022, 14:39

...

Ответить

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

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

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