Список форумов www.integro.ru www.integro.ru
ЦСИ ИНТЕГРО
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Выборка объектов

 
Начать новую тему   Ответить на тему    Список форумов 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.
Появилось недоверие к операции Сумма.

_________________
г. Тольятти, г. Самара, ОАО "КУЗНЕЦОВ"
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Tulon



Зарегистрирован: 11.07.2006
Сообщения: 77
Откуда: Сочи

СообщениеДобавлено: Пт 06 Фев 2009 11:57    Заголовок сообщения: Ответить с цитатой

Большое спасибо, Сергей) Получилось.
_________________
Нет ни чего сложнее, чем достигнуть простоты.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков Часовой пояс: GMT + 5
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять приложения в этом форуме
Вы можете скачивать файлы в этом форуме


© phpBB Group
Русская поддержка phpBB