RUS  ENG 

запрос к БД с использованием QueryByExample

Страницы: 1
RSS
запрос к БД с использованием QueryByExample
 
Здравствуйте.
Есть следующая задача: нужно вернуть сумму значений длин объектов (из БД) определенного типа и режима в слое. Для этого, аналогично выполнению запроса в ГИС, составляем условие:
ZbDatabase zb = new ZbDatabase();
zb.Open(BaseName);
IZbQueryInfo Query;
Query = zb.ActiveQuery;
IZbDataset dataset;
int k = 2; //возвращаем агрегатное значение
Query.QueryByExample("TYPE = 9 AND MODE = 1, SUM", "Длина", ref k, ref dataset);

1) Данный запрос выдает ошибку о пространственных данных (именно часть с типом и режимом), и не очень понятно, как эти данные предварительно нужно получить.
2) Также как можно обратиться к произведенной выборке, для дальнейшего использования данной выборки в другом запросе (например, если разбить запрос на части)?
 
Условия для разных полей и имена полей нужно разделять переносом строки. Количество полей с условиями должно быть равно количеству имен полей. Для пространственных условий имя поля - "*"
Query.QueryByExample("TYPE = 9 AND MODE = 1\nSUM", "*\nДлина", ref k, ref dataset);

Плюс нужно указать базе данных, с каким слоем она взаимодействует по поводу TYPE и MODE После zb.Open

zb.GeoDataSource = L , где L - это объект Layer

Кстати, если L известен, можно для него выполнить SQL запрос, например VB:
Dim Result As IZSqlResult
Set Result = L.ExecSQL("select SUM([L]) where type=8 AND mode=1")
Set dataset = Result.dataset
dataset.MoveFirst
MsgBox dataset.FieldValue(0)

Обновите версию. Вносили исправления.
 
Спасибо!
 
Здравствуйте!
Нужно посчитать ко-во объектов в активном слое определенного типа, для чего написал макрос.

Dim L,db,ds
Dim i,b
Set L = Application.ActiveDocument.NativeDoc.Layers.Active
Set db = CreateObject("ZB.Database")
db.Open L.ObjectTypes.Item(6).BaseName
i=2
b=db.QueryByExample("COUNT","*",i,ds)
ds.MoveFirst
MsgBox ds.FieldValue(0)

при выполнении выдает ошибку: Несоответствие типа : 'db.QueryByExample'
Помогите разобраться в чем тут дело.
 
В VBScript в качестве объекта можно подставлять только объекты в виде VARIANT. А метод QueryByExample требует IZbDataset Т.е. этим методом из VBScript не воспользоваться. Нужно аналогичные методы добавлять для работы в VBScript, передающие объекты как VARIANT для многих функций.
В данном случае, чтобы сосчитать объекты данного типа в базу заходить не надо. Во-первых, в базе могут быть лишние записи. Во-вторых одна база может быть подключена к нескольким типам.
Можно так сделать, например:

Set L = Application.ActiveDocument.NativeDoc.Layers.Active
Set Result = L.ExecSQL("SELECT count(sys) where typeid = 6", 0)
set ds = Result.DataSet
ds.MoveFirst
MsgBox ds.FieldValue(0)
 
Все понятно, спасибо
Страницы: 1