Официальный сайт геоинформационной системы (ГИС) ObjectLandОфициальный сайт геоинформационной системы (ГИС) ObjectLand
  
 
ПОИСК ПО САЙТУ:
yandex.ru
КАРТА САЙТА
 
главная / поддержка / форум
E-MAIL:ПАРОЛЬ: 
регистрация

Обсуждение

 связь геометрии с таблицейсвязь геометрии с таблицей [ Дмитрий Глубоков ]
Пятница, 11 марта 2011, 11:58

Здравствуйте.
У меня такая проблема: Есть набор геометрий, при выборке конкретной геометрии из набора, получаю таблицы с ней связанные. Позиционирование на геометрию осуществляется так objGDBRecordset.MoveByFeature(objGDBFeature).
Но если у геометрии, данные в связанной с ней таблицей не заполнены, то возникает ошибка позиционирования.
Вопрос: Как проверить, что запись в таблице пуста?

На всякий случай привожу фрагмент кода...

GDBFeatureTypes = GDBLayer.FeatureTypes.Item(cmbItems.Text)
FeatureSet = GDBFeatureTypes.OpenFeatureset
' Установка указателя
FeatureSet.Move(cmbElems.SelectedIndex)
Feature = FeatureSet.Feature
Console.WriteLine("Номер текущей геометрии - " & Feature.Number)
'координаты геометрии
FeatureSet.Feature.GetVertex(1, 1, featY, featX)

For Each cmbTable In GDBFeatureTypes.Tables
' Создание выборки из полученной таблицы.
cmbQuery = GDB.CreateQuery(cmbTable)
' Получение набора записей, связанных с геометриями.
RecordSet = FeatureSet.OpenRecordset(cmbQuery)

' Позиционирование на запись, связанную с геометрией.
RecordSet.MoveByFeature(Feature) 'ЗДЕСЬ И ПРОИСХОДИТ ОШИБКА!!!

For Each cmbField In RecordSet.Fields
textBox.AppendText(cmbField.Name & " - " & cmbField.Value)
Next cmbField
Next

FeatureSet.Close()

 связь геометрии с таблицей [ Дмитрий Глубоков ]
Пятница, 11 марта 2011, 12:59

Пробовал так, но даже если связанная таблица имеет данные, выдается сообщение, что геометрия не имеет связи с записью.

If Feature.IsConnected(Recordset) Then
MsgBox("Геометрия №" & Feature.Number & " связана с записью набора.")
Else
MsgBox("Геометрия №" & Feature.Number & " не имеет связи с записью набора.")
End If

 связь геометрии с таблицей [ Objectland Support ]
Пятница, 11 марта 2011, 15:59

Если связанная с типом геометрий таблица имеет данные, то это еще не означает, что эти данные обязательно связаны с геометриями. Если связь между конкретными записями таблицы и геометриями не установлена явно, то она отсутствует, т.е. в связанной таблице могут присутствовать не связанные ни с одной геометрией записи, как и могут существовать геометрии, не связанные ни с одной записью связанной таблицы. В связанную с типом геометрий таблицу недостаточно просто добавить записи (после добавления запись не связана ни с одной геометрией), надо их явно связать с геометриями. То же самое и для геометрий - новая добавляемая геометрия не связывается автоматически с какой-либо существующей записью связанной таблицы. Связи между конкретными геометриями и записями должны создаваться явно (вручную (с помощью пользовательского интерфейса) или программно).

 связь геометрии с таблицей [ Дмитрий Глубоков ]
Понедельник, 14 марта 2011, 09:13

У меня в базе все прописывалось вручную, с помощью пользовательского интерфейса.

Причём, если я пишу код:

If Feature.IsConnected(Recordset) Then
MsgBox("Геометрия №" & Feature.Number & " связана с записью набора.")
Else
MsgBox("Геометрия №" & Feature.Number & " не имеет связи с записью набора. Присоединяем.")
Recordset.Connect(Feature) 'ОШИБКА (код ошибки ГИС: 31)
End If
выдает сообщение, что геометрия не имеет связи с записью. А при попытке связать её, выдает ошибку (Объект уже связан с записью (код ошибки ГИС: 31), если таблица заполнена).

Ниже код полностью, может быть ошибка где-то раньше?

GDBFeatureTypes = GDBLayer.FeatureTypes.Item("Светофор")
FeatureSet = GDBFeatureTypes.OpenFeatureset
' Установка указателя в начало набора геометрий.
FeatureSet.Move(cmbElems.SelectedIndex)
Feature = FeatureSet.Feature
Console.WriteLine("Номер текущей геометрии - " & Feature.Number)
textBox.AppendText("Запись № " & Feature.Number)
' Получение координат текущей геометрии.
Feature.GetVertex(1, 1, featY, featX)
textBox.AppendText(" с координатами: Х= " & featX & ", Y= " & featY & vbNewLine)
GDBThemeBrowser.Theme.SetWindow(featY, featX, 50, 50, 0)
GDBThemeBrowser.Theme.CreateFeaturesetCondition(GDBEngineLib.GdbLogicalOps.gdbLogicalNone, GDBEngineLib.GdbFeaturesetOperations.gdbFeaturesetByFeature)
GDBThemeBrowser.Theme.FeaturesetConditions.Item(Feature.Number)
GDBThemeBrowser.Update()

Dim cmbTable As GDBEngineLib.IGDBTable ' Таблица ГБД.
Dim cmbQuery As GDBEngineLib.IGDBQuery ' Выборка ГБД.
Dim cmbField As GDBEngineLib.IGDBField ' Поле набора записей.

' Получение таблицы из коллекции FeatureType::Tables.
For Each cmbTable In GDBFeatureTypes.Tables
' Создание выборки из полученной таблицы.
cmbQuery = GDB.CreateQuery(cmbTable)
' Получение набора записей, связанных с геометриями.
RecordSet = FeatureSet.OpenRecordset(cmbQuery)

''''''''''''RecordSet.Connect(Feature)

If Feature.IsConnected(RecordSet) Then ' проверка, что связанная таблица имеет запись
RecordSet.MoveByFeature(Feature) ' Позиционирование на запись, связанную с геометрией.
'MsgBox("Получение данных из " & objGDBTable.Name)
textBox.AppendText("Получение данных из таблицы: " & cmbTable.Name & vbNewLine)
For Each cmbField In RecordSet.Fields
textBox.AppendText(cmbField.Name & " - " & cmbField.Value & vbNewLine)
Next cmbField
Else
textBox.AppendText("У геометрии нет присоединенных данных!" & vbNewLine)
End If
Next
FeatureSet.Close()
End Sub

 связь геометрии с таблицей [ Дмитрий Глубоков ]
Вторник, 15 марта 2011, 09:28

Здравствуйте.
В добавление к вышесказанному.
При отладке, код Recordset.Connect(Feature), при выбранной Feature к которой не была присоеденена запись, оную создал. На все другие геометрии, которые имели запись, соответственно выдавал ошибку.
Так вот, теперь при проверке на связанность Feature.IsConnected(RecordSet) на все записи программа выдает =false (хотя геометрии связаны с записями), а на запись, которая была присоеденена программно =true.
Я ничего не понимаю!
Почему при проверке If Feature.IsConnected(RecordSet) выдается =false, хотя связь с записью существует?

 связь геометрии с таблицей [ Дмитрий Глубоков ]
Вторник, 15 марта 2011, 12:55

Пытаюсь добавить запись в набор RecordSet

RecordSet.AddNew(0)
For Each cmbField In RecordSet.Fields
RecordSet.Fields.Item(cmbField.Name).Value = InputBox("Введите данные поля """ & cmbField.Name & """:")
textBox.AppendText(cmbField.Name & " - " & cmbField.Value & vbNewLine)
Next cmbField
RecordSet.Update()
MsgBox("Всего записей - " & RecordSet.RecordCount)

Количество записей RecordSet.RecordCount в наборе не прибавляется.
Где ошибка?

 связь геометрии с таблицей [ ObjectLand Support ]
Среда, 16 марта 2011, 11:40

Надо понимать, что в методах Connect и IsConnected всегда работа идет с ТЕКУЩЕЙ записью набора записей. Вот выдержки из комментариев к этим методам:

Connect(feature, operation)
Соединяет ТЕКУЩУЮ запись набора записей с геометрией feature. Подробнее здесь http://www.objectland.ru/support/doc/comapi/Recordset_Connect.html

IsConnected(recordset)
Возвращает True, если ТЕКУЩАЯ запись набора записей recordset связана с геометрией. Подробнее здесь http://www.objectland.ru/support/doc/comapi/Geometry_IsConnected.html

Убедитесь, что Вы сделали нужную запись ТЕКУЩЕЙ прежде чем вызывать эти методы.

 связь геометрии с таблицей [ ObjectLand Support ]
Среда, 16 марта 2011, 12:41

По поводу добавления записи в RecordSet...
Если у Вас набор записей основан на таблице/выборке внешних БД, то метод RecordCount не гарантирует точность возвращаемого значения (см. http://www.objectland.ru/support/doc/comapi/Recordset_RecordCount.html).

 связь геометрии с таблицей [ Дмитрий Глубоков ]
Среда, 16 марта 2011, 16:43

Спасибо, буду разбираться.

 связь геометрии с таблицей [ Дмитрий Глубоков ]
Четверг, 17 марта 2011, 08:14

Получается, что для какой-то выбранной геометрии необходимо прокрутить весь набор записей и проверить на связь, потом перейти к следующей геометрии и уже для нее, прокрутить набор записей и проверить на связь?
Получается, если у меня есть 1000 геометрий и 500 записей, что-бы проверить связи с геометриями нужно в общем 500.000 циклов программы?
А если геометрий и записей больше?
Или я не прав, и можно обойтись по другому?

Ответить

Знаком «*» отмечены обязательные для заполнения поля.
Ваше имя:  *
Адрес электронной почты:  
Тема:  *
Сообщение:
 *
Подтверждение:
(не требуется для зарегистрированных пользователей)
 *
 



Copyright © 1999–2026 ГИС ObjectLand
ГИС ObjectLand ® ООО «Радом-АйТи»
Информация о лицензировании
главная | о продукте | скачать | купить | поддержка | новости