 |
www.integro.ru ЦСИ ИНТЕГРО
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Tulon

Зарегистрирован: 11.07.2006 Сообщения: 77 Откуда: Сочи
|
Добавлено: Чт 05 Фев 2009 11:53 Заголовок сообщения: Выборка объектов |
|
|
Здравствуйте, коллеги.
У меня вопрос, как можно (достаточно быстро) выбрать из слоя те объекты, у которых отсутствуют записи в семантической таблице? Таблица имеет отношение один-ко-многим. Метод простого перебора всех объектов слоя займет очень много времени, может как-то можно запросом обратиться к системным таблицам Ингео? _________________ Нет ни чего сложнее, чем достигнуть простоты. |
|
Вернуться к началу |
|
 |
Алексей В. Бастриков
Зарегистрирован: 02.06.2008 Сообщения: 118 Откуда: ООО "Инфопроект", г. Екатеринбург
|
Добавлено: Чт 05 Фев 2009 13:18 Заголовок сообщения: |
|
|
У семантической таблицы есть свойство SemDbTable, а у этого свойства - метод SelectData, позволяющий выполнить SQL-запрос любой сложности к таблице базы данных. С помощью запроса можно узнать пустая таблица или нет (конечно без учета полей, содержащих ID). |
|
Вернуться к началу |
|
 |
Алексей В. Бастриков
Зарегистрирован: 02.06.2008 Сообщения: 118 Откуда: ООО "Инфопроект", г. Екатеринбург
|
Добавлено: Чт 05 Фев 2009 13:42 Заголовок сообщения: |
|
|
set SemDbTable = SemTable.SemDbTable
set Fields = SemDbTable.Fields
FieldNames = ""
if Field.Count > 1 then
for i = 0 to Fields.Count
if Fields.Item(i).Name <> "ID" then
FieldNames = FieldNames & Fields.Item(i).Name
end if
next
FieldNames = Mid(FieldNames, 2)
Where = ""
for each FieldName in Split(FieldNames, ",")
Where = Where & FieldName & " is null "
next
set DataSet = SemDbTable.SelectData(FieldNames, Where, null)
while not DataSet.EOF
MapObjectID = DataSet.Fields.Item("ID").Value
DataSet.MoveNext
wend
end if |
|
Вернуться к началу |
|
 |
Алексей В. Бастриков
Зарегистрирован: 02.06.2008 Сообщения: 118 Откуда: ООО "Инфопроект", г. Екатеринбург
|
Добавлено: Чт 05 Фев 2009 13:44 Заголовок сообщения: |
|
|
Правда, насчет запроса любой сложности я палку перегнул и еще в коде есть как минимум одна ошибка, но думаю, что принцип правильный |
|
Вернуться к началу |
|
 |
Tulon

Зарегистрирован: 11.07.2006 Сообщения: 77 Откуда: Сочи
|
Добавлено: Чт 05 Фев 2009 14:41 Заголовок сообщения: |
|
|
Алексей, спасибо за ответ.
Приведенный пример выберет из сем. таблицы все те записи, у которых поля "не заполнены", то есть "IS NULL". Но в первом посте я писал про таблицу один-ко-многим - это важно. В таком случае часто бывают ситуации, что объект есть, но НИ ОДНОЙ строки в таблице для данного объекта нет... Если бы строка была, но поля не заполнены, тогда другой вопрос, но тут даже самой строки нет. Таки образом, приведеный пример просто не заметит существования таких объектов((
Я предполагаю, что каким-то образом надо выбирать список всех объектов слоя и проверять на существование ссылки на каждый объект в таблице. Я сейчас пытаюсь расковырять структуру системных таблиц Ингео, чтоб получить список объектов слоя, но надеюсь, что кто-то уже подобным занимался.
Офф-топ: А запрос любой сложности к базе легче отправлять через Код: | Application.ActiveDb.SemDbTables.ExecSQL(TextOfQuery, null, null) |
_________________ Нет ни чего сложнее, чем достигнуть простоты. |
|
Вернуться к началу |
|
 |
Сергей Попов
Зарегистрирован: 05.03.2005 Сообщения: 299 Откуда: г. Тольятти - Самара - Копейск
|
Добавлено: Пт 06 Фев 2009 10:18 Заголовок сообщения: |
|
|
Tulon писал(а): | А запрос любой сложности к базе легче отправлять через Application.ActiveDb.SemDbTables.ExecSQL(TextOfQuery, null, null) |
Предлагаю такой вариант (SQL-предложение опробовано в ORACLE 9)
Надо знать название схемы с графикой (пусть будет INGEO_G)
и c семантикой (INGEO_S).
Таблица 1кN пусть будет называться DOCUMENTS
Код: | -- 1. пока только формирование списка ID всех объектов
-- определённого слоя определённой карты
SELECT
O.ID "ID"
,M.MAPNAME "Карта"
,L.LAYERNAME "Слой"
FROM
,INGEO_G.INGEO_OBJINFO O
,INGEO_G.INGEO_LAYERS L
,INGEO_G.INGEO_MAPS M
WHERE
(O.LAYERID =L.ID) AND
(L.PLANEID =M.ID) AND
(M.MAPTYPE =3) AND -- Убедимся, что карта векторная
(L.LAYERNAME ='укажите названия слоя') AND
(M.MAPNAME ='укажите название карты')
ORDER BY
M.MAPNAME
,L.LAYERNAME
-- 2. Если первый тест прошёл успешно, тогда добавляем в него
-- всего одну строку
SELECT
O.ID "ID"
,M.MAPNAME "Карта"
,L.LAYERNAME "Слой"
FROM
,INGEO_G.INGEO_OBJINFO O
,INGEO_G.INGEO_LAYERS L
,INGEO_G.INGEO_MAPS M
WHERE
(NOT EXISTS (SELECT 1 FROM INGEO_S.DOCUMENTS T WHERE T.ID=O.ID)) AND
(O.LAYERID =L.ID) AND
(L.PLANEID =M.ID) AND
(M.MAPTYPE =3) AND -- Убедимся, что карта векторная
(L.LAYERNAME ='укажите названия слоя') AND
(M.MAPNAME ='укажите название карты')
ORDER BY
M.MAPNAME
,L.LAYERNAME
-- Если нужен противоположный вариант, т.е. все записи,
-- для которых есть хоть одна запись в таблице 1 к N,
-- тогда достаточно убрать NOT перед EXISTS |
P.S. Перепроверил себя в ИнГЕО следующим образом:
1. Меню Анализ, пункт Создать набор объектов
2. Самая левая кнопка окна (+) - Все объекты слоя.
3. Кнопка отображаемые поля и включаю поля таблицы 1 к N
Среди этих полей есть системное поле SimID (которое как системное не идентифицируется), зато обязательно заполнено.
4. Ставлю курсор на этом поле и нажимаю кнопку Сумма, получаю отчёт - сколько объектов имеют хоть одну запись в таблице 1 к N.
----
Вроде результат должен сходиться, но в SQL я получил 8, а в ИнГЕО - 7. Начал проверять глазками - 8.
Появилось недоверие к операции Сумма. _________________ г. Тольятти, г. Самара, ОАО "КУЗНЕЦОВ" |
|
Вернуться к началу |
|
 |
Tulon

Зарегистрирован: 11.07.2006 Сообщения: 77 Откуда: Сочи
|
Добавлено: Пт 06 Фев 2009 11:57 Заголовок сообщения: |
|
|
Большое спасибо, Сергей) Получилось. _________________ Нет ни чего сложнее, чем достигнуть простоты. |
|
Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять приложения в этом форуме Вы можете скачивать файлы в этом форуме
|
|