ArcMap (Взаимодействие VBA формы с БД)

0 голосов
спросил 03 Март, 10 от arcnik (420 баллов) в категории Программные продукты Esri
Помогите пожалуйста Cry
Есть небольшой вопросик, необходимо организовать взаимосвязь формы VBA в ArcMap с базой данных шейпа.
Суть заключается в том, чтобы с базы данных шейпа с определенной ячейки взять значение и поместить его в текст бокс размещенный на форме.
 
Приблизительный пример (суть вопроса Big smile):
'Начало я предполагаю строится так
 
Private Sub Lissss()
Dim pMxDoc As IMxDocument
Dim pMap As IMap
Dim pFeatureLayer As IFeatureLayer
Dim pFeatureClass As IFeatureClass
Dim pFields As IFields
Set pMxDoc = ThisDocument
Set pMap = pMxDoc.FocusMap
Set pFeatureLayer = pMap.Layer(0)
Set pFeatureClass = pFeatureLayer.FeatureClass
Set pFields = pFeatureClass.Fields
 
'По выше приведенному примеру "начала макроса" видим что наш шейпик в используемом документе, в первом слое.
'Дальше понятия не имею как в него влезть и сказать ему что мне нужна определенная ячейка таблицы, которая допустим на примере Екселя -> Range ("2A")
 
'Конец проблемы проще

news1.Show    ' вызвали форму "news1"
news1.tb1.Text = Range ("2A")  ' и в форме в текстбоксе "tb1" вставили наш текст "Range ("2A")"
End Sub
 
Если можно на языке VBA - его я хоть както знаю Wink
 
Заранее благодарю за любую помощь Embarrassed
 

11 Ответы

0 голосов
ответил 03 Март, 10 от pooperec (10,820 баллов)
Можно так:
1. Вызываете интерфейс IQueryFilter, в котором указываете условия поиска (вызываете метод WhereClause('OBJECTID = '+Вашномер)). Это если нужно несколько записей.
2. Если одна, то есть метод "GetFeature(ID:integer):IFeature", который как бы намекает...
[Если не намекает Begin]
Dim pF as IFeature
pF = pFeatureClass.GetFeature(ID записи)
news1.tb1.Text = pF.Value[pF.Fields.GetFieldName('TextField')]
[Если не намекает End]

 Я ВБА вроде не знаю (спорный вопрос после знакомства с ArcGIS), по этому пишите, пробуйте, дерзайте =)
0 голосов
ответил 04 Март, 10 от arcnik (420 баллов)
У меня нечего не получилось Confused
Наверное я еще глупее в VBA чем думал LOL
Пожалуйста растолкуйте Embarrassed
0 голосов
ответил 04 Март, 10 от TDenis (42,620 баллов)
Для прохождения по всем записям слоя используется IFeatureCursor.
http://gis.utah.gov/code-visual-basic/vba-arcmap-loop-through-layer-example
0 голосов
ответил 04 Март, 10 от TDenis (42,620 баллов)
Ну а чтобы курсор возвращал не все записи, а только удовлетворяющие вашему условию, используйте фильтр:
http://www.dataplus.ru/Support/ESRI/ArcGIS/ArcObjects/ArcObTag.htm
http://www.google.ru/search?hl=ru&source=hp&q=arcobjects+queryfilter&btnG=Поиск+в+Google&lr=&aq=f&oq=
0 голосов
ответил 04 Март, 10 от pooperec (10,820 баллов)
Ну вот Вам TDenis и выложил примеры даже.

Вы обьясните, вы номер записи знаете? Или попробую по-другому сформулировать вопрос, как вы знаете что Вам нужна имеено ячейка "2А"?
0 голосов
ответил 04 Март, 10 от arcnik (420 баллов)
Застрелите меня Unhappy НЕМОГУ.
Помогите понять небросайте Cry
Я знаю что мне нужно "2А" потомучто у мнея к примеру
В "2"(строке) название определенного города (а в 3;4 и тд. другие города) в "А" кол-во жителей в "В"еще чтонебудь
и мне очень надо чтоб в мою форму попало "2А" (число жителей именно этого города)
0 голосов
ответил 04 Март, 10 от arcnik (420 баллов)

Public Sub SelectMapFeatures()
Dim pMxDoc As IMxDocument
Dim pMap As IMap
Dim pActiveView As IActiveView
Dim pFeatureLayer As IFeatureLayer
Dim pFeatureSelection As IFeatureSelection
Dim pFID As IQueryFilter
Set pMxDoc = Application.Document
Set pMap = pMxDoc.FocusMap
Set pActiveView = pMap
If Not TypeOf pMap.Layer(0) Is IFeatureLayer Then Exit Sub
Set pFeatureLayer = pMap.Layer(0)
Set pFeatureSelection = pFeatureLayer
Set pFID = New QueryFilter
pFID.WhereClause = "FID = 22"
pActiveView.PartialRefresh esriViewGeoSelection, Nothing, Nothing

pFeatureSelection.SelectFeatures pFID, esriSelectionResultNew, False

pActiveView.PartialRefresh esriViewGeoSelection, Nothing, Nothing' выделил необходимый объект

Dim itog As IQueryFilter
Dim ada As Double
Set itog = New QueryFilter
itog.WhereClause = "idi = pFeatureSelection.SelectionSymbol" 'уточнение "idi" следуя моему примеру выше (название столбца кол-ва жителей)

ada = itog

MsgBox ada, , "Трям!"
End Sub
'Эксперемент профильтровать выделеный объект с получением значения выделенного в столбце неувенчалась успехом може что в таком плане посоветуете
0 голосов
ответил 04 Март, 10 от pooperec (10,820 баллов)

Public Sub SelectMapFeatures()
Dim pMxDoc As IMxDocument
Dim pMap As IMap
Dim pActiveView As IActiveView
Dim pFeatureLayer As IFeatureLayer
Dim pFeatureSelection As IFeatureSelection
Dim pFID As IQueryFilter
Set pMxDoc = Application.Document
Set pMap = pMxDoc.FocusMap
Set pActiveView = pMap
If Not TypeOf pMap.Layer(0) Is IFeatureLayer Then Exit Sub
Set pFeatureLayer = pMap.Layer(0)
Set pFeatureSelection = pFeatureLayer

//Дальше что-то типа

Dim pF As IFeature

Set pF = pFeatureLayer..GetFeature(22) //22 номер строки (записи)

Dim ada As Double

ada = pF.Value[3] //3 номер столбца, номеруеться с 0ля, и предполагаеться что там лежит double

//Всё в ada лежит значение ячейки 2,3 (2С если по аналогии с Exel)

End Sub

0 голосов
ответил 04 Март, 10 от pooperec (10,820 баллов)
Сразу оговорюсь, я VBA не знаю, старался "странслировать мысли"  как мог, дальше сами проверяйте на синтаксис...
0 голосов
ответил 04 Март, 10 от arcnik (420 баллов)
HugДушевный ФорумHug
Всем Участникам Огромное Спасибо!
Особая благодарность pooperec Clap
 
**********************Итог малоли пригодится*****************
Public Sub SelectMapT()
Dim pMxDoc As IMxDocument
Dim pMap As IMap
Dim pActiveView As IActiveView
Dim pFeatureLayer As IFeatureLayer
Dim pFeatureSelection As IFeatureSelection
Dim pFID As IQueryFilter
Set pMxDoc = Application.Document
Set pMap = pMxDoc.FocusMap
Set pActiveView = pMap
If Not TypeOf pMap.Layer(0) Is IFeatureLayer Then Exit Sub
Set pFeatureLayer = pMap.Layer(0)
Set pFeatureSelection = pFeatureLayer
Dim pF As IFeature
Set pF = pFeatureLayer.FeatureClass.GetFeature(22)
Dim ada As Double
ada = pF.Value(3)
MsgBox ada, , "Field Names"
End Sub
***********************************************************
На данном этапе прошу считать эту тему закрытой Cool
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...