Андрей Семин
Постоянный посетитель
Всего сообщений: 225
Дата регистрации: 09.07.2007
|
Создано:
01.08.2011 17:46:25
|
Уважаемые разработчики !
помогите разобраться
есть фрагмент макроса
set tn=rastr.Tables("node")
set tnc=tn.Cols
for i=0 to tn.COLS.COUNT-1
if tn.Cols(i).name="Delta1" then
tnc.Remove("Delta1")
end if
next
set tncDn=tn.COls.Add("Delta1",1)
При первом запуске все проходит на ура,
а при повторном, с той-же рабочей областью,
выскакивает ошибка
Отсутствует поле, индекс 73, имя ""
Не пойму в чем дело, помогите пожалуйста
|
|
|
Евгений Машалов
Администратор
Всего сообщений: 1059
Дата регистрации: 23.04.2007
|
Создано:
01.08.2011 23:16:37
|
Фрагмент вполне работоспособный. При работе макроса случайно не открыта таблица узлов с полем, которое Вы удаляете ? Если да, то при обновлении она обращается к этому полю, а поскольку его нет (созданное поле не эквивалентно тому, которое "видела" таблица), генерирует ошибку. То есть проблема в этом случае не в скрипте.
|
|
|
Андрей Семин
Постоянный посетитель
Всего сообщений: 225
Дата регистрации: 09.07.2007
|
Создано:
02.08.2011 12:50:51
|
Нет таблица не открыта.
глюки сохраняются.
Пришлось переделать логику, и ввести дополнительную переменную ....
Вот я .....
Евгений !!!!!!!
С какой же это радости это макрос работоспосбен ???
Если в цикле со счетчиком по количеству столбцов, я удаляю один из этих столбцов !!!!
Есс-сно он при обращении к последнему элементу его не находит и выдает ошибку, ведь элементов то уже на один меньше
|
|
|
Андрей Семин
Постоянный посетитель
Всего сообщений: 225
Дата регистрации: 09.07.2007
|
Создано:
02.08.2011 12:52:42
|
Извиняюсь за буйную риторику,
Просто ссобразил внезапно и огорчился.
Все макрос переделал, работает, спасибо.
|
|
|
Евгений Машалов
Администратор
Всего сообщений: 1059
Дата регистрации: 23.04.2007
|
Создано:
02.08.2011 14:31:46
|
Ну, количество столбцов уменьшилось. Так вроде и count на это отреагировать должен. И как Ваш вывод связан с повторным запуском из первого поста ? Для поиска полей еще можно Find использовать
|
|
|
Андрей Семин
Постоянный посетитель
Всего сообщений: 225
Дата регистрации: 09.07.2007
|
Создано:
02.08.2011 14:55:04
|
Вроде бы должен, но по опыту скажу, что не реагирует.
Повторный запуск тут вот при чем:
При первом запуске опреатор удаления не работает, т.к. столбца с указанным именем не существует(он добавляется позже).
При повторном запуске столбец есть мы его удаляем и оп-ля- ошибка.
Вообще не знаю в чем дело, но похоже что в цикле for обновление верхней границы счетчика в процессе прохождения цикла не происходит, уж не знаю почему. Для этого надо использовать while. Он проверяет условие при каждом проходе.
|
|
|
Андрей Семин
Постоянный посетитель
Всего сообщений: 225
Дата регистрации: 09.07.2007
|
Создано:
02.08.2011 14:57:06
|
да вот еще что
Посмотрел help - там метод find только для CIM-моделей описан.
Можно ли его использовать для поиска в простых таблицах, если да, то какой синтаксис ?
|
|
|
Евгений Машалов
Администратор
Всего сообщений: 1059
Дата регистрации: 23.04.2007
|
Создано:
02.08.2011 15:36:29
|
Ну да. While цикл по условию, for - цикл по счетчику, причем в фиксированном диапазоне.
Find:
Rastr.PrintP Rastr.Tables("node").Cols.Find("uhom")
Выведет индекс поля с названием uhom, или -1 если его нет.
А еще можно создавать поля так
1 on error resume next
2 Rastr.Tables("node").Cols.Add("Delta1",PR_INT)
3 on error goto 0
Даже если поле есть и при его добавлении будет выдана ошибка, интерпретатор скрипта проигнорирует ее ввиду наличия первой строки, третья строка восстановит обработку ошибок.
|
|
|
Михаил Реутов
Постоянный посетитель
Всего сообщений: 224
Дата регистрации: 21.11.2007
|
Создано:
03.08.2011 16:23:14
|
to Андрей Семин
попробуйте в код первого сообщения вставить в цикл exit for как показано ниже.
Код |
---|
set tn=rastr.Tables("node")
set tnc=tn.Cols
for i=0 to tn.COLS.COUNT-1
if tn.Cols(i).name="Delta1" then
tnc.Remove("Delta1")
exit for
end if
next
set tncDn=tn.COls.Add("Delta1?",1)
|
|
|
|