Страница 1 из 1
					
				onError работает с одной ошибкой, но не с двумя и более
				Добавлено: 15 дек 2022, 09:06
				 grandred75
				Здравствуйте.
Есть ряд таблиц, с которыми хочу проделать некоторые преобразования. Но так, чтобы при отсутствии одной или нескольких из них процесс не остановился и программа не вылетела ...
В следующем коде программа работает, и даже до конца. При этом может отсутствовать одна из таблиц. Но если НЕ открыто БОЛЕЕ одной таблицы программа вылетает с ошибкой в строке seleсt первой отсутствующей таблицы.
			 
			
					
				Re: onError работает с одной ошибкой, но не с двумя и более
				Добавлено: 15 дек 2022, 10:42
				 gamm
				у вас струтктура программы неверная, посмотрите пример 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
 
			
					
				Re: onError работает с одной ошибкой, но не с двумя и более
				Добавлено: 15 дек 2022, 11:09
				 grandred75
				Да, я пытался по данной структуре решить свою задачу. Но, похоже, данный оператор этого сделать не позволяет.
Может есть другое решение?
			 
			
					
				Re: onError работает с одной ошибкой, но не с двумя и более
				Добавлено: 15 дек 2022, 14:02
				 gamm
				у вас структура кривая в любом случае. После возникновения ошибки вы должны уйти в обработчик, а потом вернуться, сбросив ошибку (resume, а не переходить в другое место программы - у вас, судя по всему, до resume вообще никогда не доходит). 
Можно в обработчиках запоминать в какой-то переменной (массиве), кого не хватает. Примерно так в примере и написано, только там вместо этого сообщение выдается. Т.е. вы по метке after_mapfrom: проверяете массив, и если там все позиции ОК, то у вас все таблицы уже открыты. Если что-то не ОК, то ругаетесь, закрываете открытые, и  т.д.
			 
			
					
				Re: onError работает с одной ошибкой, но не с двумя и более
				Добавлено: 21 дек 2022, 12:50
				 grandred75
				Подсказали использовать оператор 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
			 
			
					
				Re: onError работает с одной ошибкой, но не с двумя и более
				Добавлено: 21 дек 2022, 16:38
				 gamm
				grandred75 писал(а): ↑21 дек 2022, 12:50 Как записать имена таблиц, так чтобы регистр не имел значения?
 
не мучайтесь, допишите все варианты в список. Либо переведите все буквы в маленькие LCase$(str) в отдельный вектор той же длины, и используйте его для сравнения
 
			
					
				Re: onError работает с одной ошибкой, но не с двумя и более
				Добавлено: 21 дек 2022, 18:23
				 grandred75
				Спасибо за ответ. Дело в том, что всех вариантов у меня порядка 3 тысяч, с учетом Верхних, нижних и комбинированных регистров. Состоят таблицы из 3-4 слов ... Т.о. строка получается длинной около 55 тыс. символов. Понимаю, что дикость ) Тем не менее, хотелось найти решение.
Не расскажете поподробней как можно использовать LCase$(str) ?
			 
			
					
				Re: onError работает с одной ошибкой, но не с двумя и более
				Добавлено: 21 дек 2022, 18:57
				 gamm
				не мудрите  
 
 
хватит 
Do Case LCase$(CurrentTable)
Case "водопровод", "водосток", "канализация"
 
			
					
				Re: onError работает с одной ошибкой, но не с двумя и более
				Добавлено: 22 дек 2022, 08:40
				 grandred75
				Да, действительно, работает!!!
Премного благодарен!!!  

 
			
					
				Re: onError работает с одной ошибкой, но не с двумя и более
				Добавлено: 27 дек 2022, 14:39
				 grandred75
				...