Страница 1 из 1

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

Добавлено: 01 мар 2009, 17:58
VAD
При написании программки возникла проблема
Есть код
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 считается от первой строки(в т.ч. удаленной). Помогите решить данную проблему.

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

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

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

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

Добавлено: 02 мар 2009, 20:00
max117
Таблица- Изменить- Упаковать ?

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

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

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

Добавлено: 03 мар 2009, 01:36
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
старый запрос будет затерт

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

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

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

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

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

Добавлено: 04 мар 2009, 22:29
VAD
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
старый запрос будет затерт

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