RUS  ENG 

Выполнение программных запросов к БД

Страницы: 1
RSS
Выполнение программных запросов к БД
 
Здравствуйте!
Прочитал справку по программированию, не все сразу понял, перечитал еще несколько раз, пересмотрел практически все темы на форуме, посмотрел все примеры приложений на сайте. И в итоге я пока не могу решить поставленную задачу. А задача следующая:

1. В основное приложение Zulu (уже открыть определенный набор слоев) добавить кнопку, которая открывает свою форму со своими элементами управления, написанную на VB6. (к примеру формы, которые предоставляет Политерм - ZuluHydro, ZeluDrain и др.)
2. В combox'ы подгрузить из слоя "Здания" наименования улиц и номера домов (в таблице есть отдельные поля), или выводить список улиц/номера дома по первому символу, к примеру в тоже combox'e.
3. Выбрав нужную улицу и номер дома, нажать на кнопку и фокус карты должен переместиться на нужный нам объект.

Как создать пустой плагин, сказать Zulu, что он есть, я разобрался.
Есть хорошая тема на этом форуме:
http://www.politerm.com.ru/forums/showthread.php?fid=7&;tid=3193&old_block=30
но пока она не помогла мне решить мою проблему.
И поэтому прошу у Вас помощи, пожалуйста, подскажите в каком направлении двигаться, на какие разделы справки нужно обратить особое внимание.
Для начала нужно разобраться с подключением к базе данных, к табличной части какого-либо слоя, в моем случае к слою "Здания"
 
Если здания являются примитивами (не типовыми объектам), то имя их базы данных слоя L будет L.Basename Для типовых L.ObjectTypes.Item(TypeID).BaseName

А далее открываем базу данных и с ней работаем (http://politerm.com/zuludoc/zuluax/ZbDatabase_cls.htm):

Dim DB As ZbDatabase
Set DB = New ZbDatabase
DB.Open L.Basename
 
Спасибо! С подключением к базе данных слоя вроде понятно.
Хотелось бы уточнить в строчке DB.Open L.Basename указывается полное имя файла описателя БД включая расширение? Или имя БД слоя из проекта?

При выполнении следующего кода:

Private Sub Command1_Click()
Dim str As String
Dim zapros As IZbDataset
Dim DB As ZbDatabase
Set DB = New ZbDatabase
DB.Open Здания
zapros = DB.OpenSQL(, "Select * from Зданя where Улица like %""МИРА""% and Номер_дома like %""2""%")
MsgBox (DB.LastErrorString)
str = zapros.FieldValue(1)
MsgBox str
End Sub

выпадает ошибка:
---------------------------
Test
---------------------------
Run-time error '91':

Object variable or With block variable not set
---------------------------
ОК
---------------------------

Я так понимаю проблема в корректности написания запроса... Подскажите в чем трабл?!
 
DB.Open Здания Так нельзя. Нужно подставлять именно то имя, которое вернет объект Layer. Если слой серверный, там имя будет вообще в виде некоего шифра.

А так, база по неправильному имени не открывается. и TypeName(zapros) будет типа "Nothing", а не "IZbDataset"?
 
Слой локальный, все слои, описатели БД, файл БД (mdb) хранится локально в одном каталоге, zmp находится каталогом выше.
не могу понять как правильно получить имя от объекта Layer.

Код из кнопки:

Dim Str As String
Dim BaseName As String
Dim Obj As ZuluLib.Layer
Dim Zapros As IZbDataset
Dim DB As ZbDatabase
Set DB = New ZbDatabase
Set Obj = New ZuluLib.Layer
BaseName = Layer.BaseName
DB.Open BaseName

и получаем ошибку
---------------------------
Test
---------------------------
Run-time error '424':

Object required
---------------------------
ОК
---------------------------
Как Zulu понимает к какой БД слоя необходимо подключиться? Где-то указывается путь? Или берется активный слой? К примеру в карте 5 слоев и у каждого слоя своя БД.
 
Layer - это конкретный слой. Либо с карты его получите (http://politerm.com/zuludoc/zuluax/Layers_cls.htm), либо создайте объект и откройте (http://politerm.com/zuludoc/zuluax/Layer_Open.htm) А уже от слоя получайте имя базы слоя
 
С этим вопросом стало понятно. Спасибо)

С запросом поможете разобраться? Точнее с методом OpenSQL
Если не указывать источник данных, как zulu поймет из какой БД необходимо делать выборку?
Сам текст запроса вида "select * from Здания where id = 001" я так понимаю не воспримет система. Как быть ?
 
В качестве источника нужно подставлять источник конкретной таблицы (http://politerm.com/zuludoc/zuluax/IZbTableInfo_Source.htm).
Но чтобы так не углубляться, проще в Вашем случае выполнять запрос к прямо к слою: http://politerm.com/zuludoc/zuluax/Layer_ExecSQL.htm
Например:
Layer.ExecSQL("SELECT * where id = 1")
Страницы: 1