На главную страницу
Русский English
 


Поддержка
Форум
Техподдержка
Закрытый разделПерсональная

Авторизация

Запомнить меня на этом компьютере
  Забыли свой пароль?
  Регистрация



Поиск по сайту


Подписка

Изменение параметров

Hits 67419215
10565
Hosts 3609193
2230
Visitors 53571708
10178

110


Главная / Поддержка / Форумы / Макро

Форум «Макро»

Версия для печати Версия для печати

Список форумов
Новые темы
Список тем
Поиск по форумам
Помощь
Войти
Регистрация


Тема: «Добавление и удаление столбцов » в форуме: Макро   Просмотров: 8731
 
Андрей Семин
Постоянный посетитель

 
Всего сообщений: 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)
 
Профиль
Наверх



Читают тему
гостей: 1, пользователей: 0, из них скрытых: 0


Список форумов
Новые темы
Список тем
Поиск по форумам
Помощь
Войти
Регистрация







Программный комплекс «RasrWin»
Программный комплекс «RastrWin»
© «RastrWin», 1988-2019