Присвоение значений в таблице

MapInfo, MapBasic
Ответить
VAD
Новоприбывший
Сообщения: 6
Зарегистрирован: 01 мар 2009, 17:44
Репутация: 0

Присвоение значений в таблице

Сообщение VAD » 01 мар 2009, 17:58

При написании программки возникла проблема
Есть код
obj_type = ObjectInfo(tab_name.obj, OBJ_INFO_TYPE)
i = 0
Fetch first From tab_name
Do While Not EOT(tab_name)

i = i+1
Fetch Next From tab_name
Loop

Do case obj_type

Case OBJ_PLINE

Update tab_name
Set colon = xx
Where RowID = i

end case

Если объект полилиния, то присваивается значение XX

Но если в таблице есть удаленные строки(закрашены серым), то счет сбивается поскольку i считается от первой строки(в т.ч. удаленной). Помогите решить данную проблему.

Аватара пользователя
SS_Rebelious
Гуру
Сообщения: 1304
Зарегистрирован: 24 фев 2009, 16:51
Репутация: 99
Ваше звание: GIS pro-fan
Откуда: Lahti / Газ-ПУТИНбург
Контактная информация:

Re: Присвоение значений в таблице

Сообщение SS_Rebelious » 02 мар 2009, 11:13

Я не специалист по программированию, но я видел однажды утилитку, которая удаляет пустые строки. Возможно Вам стоит найти её))) (или самому написать) и встроить её в свою программу, чтобы перед присвоением значений, пустые строки удалялись.

PS У меня этой утилитки нет, так как подобные операции мне никогда не были нужны. Но я тут задался вопросом: а можно ли удалять пустые строки без использования специально написанных утилит :?:
Look for something long enough, and you will find it. Look for something without understanding, and it will find you...
"All paid jobs absorb and degrade the mind." Aristotle
If you take 1 step towards freedom it'll take 2 steps towards you!

max117
Интересующийся
Сообщения: 24
Зарегистрирован: 12 дек 2007, 23:35
Репутация: 0
Откуда: Москва
Контактная информация:

Re: Присвоение значений в таблице

Сообщение max117 » 02 мар 2009, 20:00

Таблица- Изменить- Упаковать ?

VAD
Новоприбывший
Сообщения: 6
Зарегистрирован: 01 мар 2009, 17:44
Репутация: 0

Re: Присвоение значений в таблице

Сообщение VAD » 02 мар 2009, 23:24

Да , но только предварительно сохранив можно использовать таблица - изменить - упаковать. Тогда пустые строки исчезнут, но таблица то закрывается. Не делать же так, что она сохраняется, упаковывается и открывается при каждом действии. Их то очень много=)

Boris
Гуру
Сообщения: 4231
Зарегистрирован: 10 апр 2006, 22:34
Репутация: -344969098
Откуда: Париж

Re: Присвоение значений в таблице

Сообщение Boris » 03 мар 2009, 01:36

чего Вы не договаривает, как говорила Му-Му Герасиму. :)
А) В приведенном примере вы присваиваете значение только последней записи. А проверяете (или считываете тип) у неопределенной.
Б) Выполняете пустой цикл, который просто подсчитывает общее количество записей.
В) Таблице при сохранении и упаковке не закрывается, она только исчезает из всех открытых окон. Но в программе остается открытой.
Г) Никакое обновление атрибутов НЕ дает появления "серых" строк. Они появляются только при редактировании геометрии. Так что если вы в программе не редактировали геометрию, то упаковав ВСЕ таблицы один раз и до открытия рабочего набора, можете потом делать с ними, что угодно, номер не собьется.
Д) Очень НЕ безопасный способ считать, что RowID - это номер от начала отсчета. RowID - это внутренний индекс таблицы MapInfo, его последовательность, непрерывность и устойчивость во времени Не гарантированы документаций по MapBasic'у. Более того, при любой операции с таблицей не только RowID, но указатель в Fetch могут измениться.
----
А вообще обновление данных соответствии с типом поля делается проще и быстрее (в разы) с помощь пары команд-запросов MapBasic Select+Update:
Select * from My_Table where str$(obj)="polyline" into Q001 Noselect
update Q001 set id=888
' для красоты можно добавить
close table Q001
можно и не добавлять, при следующем выполнении команды Select * ... into Q001 Noselect
старый запрос будет затерт

Аватара пользователя
Parlament
Интересующийся
Сообщения: 30
Зарегистрирован: 11 сен 2008, 14:51
Репутация: 0
Контактная информация:

Re: Присвоение значений в таблице

Сообщение Parlament » 03 мар 2009, 13:26

SS_Rebelious писал(а):Я не специалист по программированию, но я видел однажды утилитку, которая удаляет пустые строки. Возможно Вам стоит найти её))) (или самому написать) и встроить её в свою программу, чтобы перед присвоением значений, пустые строки удалялись.

PS У меня этой утилитки нет, так как подобные операции мне никогда не были нужны. Но я тут задался вопросом: а можно ли удалять пустые строки без использования специально написанных утилит :?:

Мы же работаем в основном с массивами данных.. по этому тут все просто сдвигаешь массив и пустая строка исчезает.. я где-то это уже выкладывал =)))) кусок кода =))) ну и собственно утилитку из этого сделать проще пареной капусты =)))
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...

VAD
Новоприбывший
Сообщения: 6
Зарегистрирован: 01 мар 2009, 17:44
Репутация: 0

Re: Присвоение значений в таблице

Сообщение VAD » 04 мар 2009, 22:29

Boris писал(а):чего Вы не договаривает, как говорила Му-Му Герасиму. :)
А) В приведенном примере вы присваиваете значение только последней записи. А проверяете (или считываете тип) у неопределенной.
Б) Выполняете пустой цикл, который просто подсчитывает общее количество записей.
В) Таблице при сохранении и упаковке не закрывается, она только исчезает из всех открытых окон. Но в программе остается открытой.
Г) Никакое обновление атрибутов НЕ дает появления "серых" строк. Они появляются только при редактировании геометрии. Так что если вы в программе не редактировали геометрию, то упаковав ВСЕ таблицы один раз и до открытия рабочего набора, можете потом делать с ними, что угодно, номер не собьется.
Д) Очень НЕ безопасный способ считать, что RowID - это номер от начала отсчета. RowID - это внутренний индекс таблицы MapInfo, его последовательность, непрерывность и устойчивость во времени Не гарантированы документаций по MapBasic'у. Более того, при любой операции с таблицей не только RowID, но указатель в Fetch могут измениться.
----
А вообще обновление данных соответствии с типом поля делается проще и быстрее (в разы) с помощь пары команд-запросов MapBasic Select+Update:
Select * from My_Table where str$(obj)="polyline" into Q001 Noselect
update Q001 set id=888
' для красоты можно добавить
close table Q001
можно и не добавлять, при следующем выполнении команды Select * ... into Q001 Noselect
старый запрос будет затерт

Спасибо, с этим кодом действительно лучше и все работает как надо=)))

Ответить

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость