| Обсуждение |
| | связь геометрии с таблицей [ Дмитрий Глубоков ]Пятница, 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 циклов программы?
А если геометрий и записей больше?
Или я не прав, и можно обойтись по другому? |
|
ОтветитьЗнаком «*» отмечены обязательные для заполнения поля. |
| |