 |
www.integro.ru ЦСИ ИНТЕГРО
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Алексей Васильев
Зарегистрирован: 20.05.2009 Сообщения: 105 Откуда: Самара
|
Добавлено: Чт 03 Июн 2010 17:21 Заголовок сообщения: Глюк с подписями объектов |
|
|
Преамбула
Наносим на карту оптические линии связи; параметры этих линий уже довольно давно забиты в таблицы, находящиеся в другой схеме, чем семантические таблицы. Назовем схему с семантикой схемой "S",а схему с собственно информацией - "M". В схеме S в качестве справочника сделано представление (VIEW), ссылающееся через линки на схему М. Тогда, если в семантической таблице мы делаем ссылку на этот справочник, который возвращает нам параметры этих линий, а затем, в соответствующей форме мы отображаем эти параметры прямо на карте. В принципе, все работает.
собственно проблема
Привязку нарисованной линии к соответствующей записи в целевой таблице делаем с помощью, в общем-то несложного модуля расширения, которое, по большому счету просто вписывает в справочное поле семантической таблицы ссылку на ТУ таблицу в схеме "М". Но если просто тупо вписать эту ссылку, то на карте ничего не изменится, даже если нажать F5 - помогает только "выйти и войти". У нас уже эта проблема возникала несколько лет назд, нам присоветовали делать сброс кеша вот так:
ActiveDB.LayerFromID(OptoLineLayer).Get_SemTables.Get_Item(0).DropCache;
где OptoLineLayer - 12-значный идентификатор слоя, а "0" в GetItem - это собственно единственный разумный параметр. Я пробовал делать Count-1, но Count всегда равен 1, так что без разницы.
В принципе, это работает, и после перерисовки карты параметры линии таки появляются на карте. Но не всегда!
В один непрекрасный момент начинаются чудеса: при том, что содержимое семантических таблиц правильное, на карте может отображаться значение совсем другой записи, причем исправить это положение можно только удалив весь этот объект, и заново его нарисовать, связав снова с этой таблицей на М. Простое удаление приписанной формы и пририсовка ее заново не помогает - даже если это делать на другом компьютере. Иногда (не всегда) помогает полная перезапись всех полей семантической таблцы, но в основном - приходится линию копировать в слой "реки", удалять исходную линию, и снова копировать со слоя "реки".
А это все ужасно нервирует, и подтачивает авторитет Ингео в глазах начальства, которое уже давно питает противоестественное влечение к Дубль-Гису, невзирая на ее малопригодность для наших целей. |
|
Вернуться к началу |
|
 |
APopov
Зарегистрирован: 19.06.2006 Сообщения: 347 Откуда: Самара
|
Добавлено: Пн 07 Июн 2010 22:53 Заголовок сообщения: Re: Глюк с подписями объектов |
|
|
Алексей Васильев писал(а): |
модуля расширения, которое вписывает в справочное поле семантической таблицы ссылку на ТУ таблицу в схеме "М"
|
вот тут необходимы подробности: как именно он вписывает в сем.поле ссылку на справочник?
варианты:
а) через API Ингео (mapObject.SemData.SetValue(aTblName, aRefFldName, aRefValue, 0) ) - тогда проблем с отрисовкой быть не должно вообще - Ингео сама разрулит ситуацию
б) напрямую поменяв значение в таблице используя какое-то ваше подключение к БД (Update aTblFizName set aRefFldName = aRefValue where id=mapObject.id) - вот в этом случает Ингео не узнает, что данные обновились, и вам придётся вручную очищать кэш таблицы
Алексей Васильев писал(а): |
а "0" в GetItem - это собственно единственный разумный параметр. Я пробовал делать Count-1, но Count всегда равен 1, так что без разницы. |
"0" - единственный разумный параметр только для вашего конкретного случая.
в общем случае
Код: | Get_SemTables.Get_Item(IndexOfSemTable) |
IndexOfSemTable - может принимать значения от 0 до [количество сем таблиц в данном слое]-1
Алексей Васильев писал(а): |
В один непрекрасный момент начинаются чудеса: при том, что содержимое семантических таблиц правильное, на карте может отображаться значение совсем другой записи,
|
Вот тут уже нетривиальный момент. причин может быть несколько -
а) баг в ингео при считывании семантки объекта (мне кажется маловероятным этот вариант)
б) сбились/не обновились индексы в БД - баг в субд или неправильная настройка обновления индексов
в) возможно есть еще что-то что я неучёл
Алексей Васильев писал(а): |
и подтачивает авторитет Ингео в глазах начальства, которое уже давно питает противоестественное влечение к Дубль-Гису, невзирая на ее малопригодность для наших целей. |
думаю, что здесь не вина ингео, а человеческий фактор. во всяком случае прежде чем пенять на ингео необходимо более подробно разобраться корректностью с взаимодействия вашего модуля с ГИС и с СУБД. _________________ ОАО "Самара-Информспутник",
инженер-программист Попов Артем |
|
Вернуться к началу |
|
 |
Алексей Васильев
Зарегистрирован: 20.05.2009 Сообщения: 105 Откуда: Самара
|
Добавлено: Вт 08 Июн 2010 14:35 Заголовок сообщения: |
|
|
Большое спасибо за конструктивный ответ!
Цитата: |
модуля расширения, которое вписывает в справочное поле семантической таблицы ссылку на ТУ таблицу в схеме "М"
вот тут необходимы подробности: как именно он вписывает в сем.поле ссылку на справочник?
|
Это был второй вариант: прямая запись в таблицу через Оракл, хотя и посредством Дельфи. Так вот исторически сложилось. Сейчас ситуация вроде бы нормализовалась, после того, как мы переписали вьюху в более канонической форме. У нас сначала было примерно так (отбрасывая вспомогательные детали):
SELECT П1, (SELECT Т2.НН FROM Т2 WHERE Т2.ID=Т1.REF)
FROM Т1
А стало как в учебнике для начинающих
SELECT Т1.П1, Т2.НН
FROM Т1,Т2
WHERE Т2.ID=Т1.REF
Попробовал вариант через API - тоже работает, только вы видимо забыли GetObject() перед SemData. Ну и предупредить, что нужно после делать UpdateChanges. Тем не менее - разобрались.
Это один из методов API, или это константа, заданная разработчиком расширения? В моей версии API такой индентификатор не узнается.
Цитата: | во всяком случае прежде чем пенять на ингео необходимо |
Разумеется. Скажу вам по секрету, я Ингео очень люблю, и всячески ее пропагандирую. Просто ситуация была напряжённая - на носу было совещание на достаточно высоком уровне, надо было, чтоб все было работали, глядя на секундомер, а тут такая фича. Да и то, ковырялись целый день перед обращением сюда. |
|
Вернуться к началу |
|
 |
APopov
Зарегистрирован: 19.06.2006 Сообщения: 347 Откуда: Самара
|
Добавлено: Вт 08 Июн 2010 15:19 Заголовок сообщения: |
|
|
Алексей Васильев писал(а): |
Это был второй вариант: прямая запись в таблицу через Оракл
|
я так и понял )
Алексей Васильев писал(а): |
Попробовал вариант через API - тоже работает, только вы видимо забыли GetObject() перед SemData. Ну и предупредить, что нужно после делать UpdateChanges. Тем не менее - разобрались.
|
я просто отбросил тонкости, которые несложно выяснить из
"c:\Program Files\Integro\InGeo\IngeoIntfs.chm"
да это я так назвал некую свою предполагаемую переменную, которую я бы применял в более общем случае ) так сказать "говорящее имя".
Алексей Васильев писал(а): |
а "0" в GetItem - это собственно единственный разумный параметр.
|
просто показал, что за число подаётся в Get_Item. что "0" не единственный разумный параметр в общем случае)))
Вобщем рекомедую семантику объектов Ингео изменять только с помощью АПИ ИнГео и проблем с отрисовкой изменений у вас быть не должно. _________________ ОАО "Самара-Информспутник",
инженер-программист Попов Артем |
|
Вернуться к началу |
|
 |
Сергей Попов
Зарегистрирован: 05.03.2005 Сообщения: 299 Откуда: г. Тольятти - Самара - Копейск
|
Добавлено: Вт 08 Июн 2010 15:22 Заголовок сообщения: |
|
|
Алексей Васильев писал(а): | SELECT П1, (SELECT Т2.НН FROM Т2 WHERE Т2.ID=Т1.REF)
FROM Т1 |
Вложенный селект Код: | (SELECT Т2.НН FROM Т2 WHERE Т2.ID=Т1.REF) | выполняется первым и один раз, независомо от количества строк, возвращаемых внешним селектом. Из этого следует, что в нём нельзя ссылаться на поля/значения внешнего селекта.
Вероятно планировалось следующее:
Код: | SELECT T1.П1, T2.НН
FROM Т1, (SELECT Т2.НН, T2.ID FROM Т2) T2
WHERE Т2.ID=Т1.REF |
Ещё надо разобраться к какой таблице выгоднее делать первичное обращение - и делать это во вложенном селекте.
Может это поможет в менее тривиальных случаях.
-----------
P.S. Ввожу в заблуждение.
Всё выше сказанное касается вложенных селектов в конструкции FROM, а не SELECT. Ещё производительность у этих двух вариантов будет разной, но на малых таблицах - незаметной. _________________ г. Тольятти, г. Самара, ОАО "КУЗНЕЦОВ"
Последний раз редактировалось: Сергей Попов (Ср 09 Июн 2010 09:41), всего редактировалось 2 раз(а) |
|
Вернуться к началу |
|
 |
Алексей Васильев
Зарегистрирован: 20.05.2009 Сообщения: 105 Откуда: Самара
|
Добавлено: Ср 09 Июн 2010 09:03 Заголовок сообщения: |
|
|
Цитата: | Вложенный селект Код:
(SELECT Т2.НН FROM Т2 WHERE Т2.ID=Т1.REF)
выполняется первым и один раз, независомо от количества строк, возвращаемых внешним селектом. Из этого следует, что в нём нельзя ссылаться на поля/значения внешнего селекта |
ИМХО непраФФ. По крайней мере - в нашей версии оракла. Я так делаю регулярно, собственно, это одна из особенностей моего стиля. В формсе и SQL-процедурах это прекрасно работает, и нет никаких признаков, что этот вложенный селект выполняется только один раз. Нахожу, что так очень удобно и наглядно переводить код в значение из справочника, не загромождая основное тело селекта. |
|
Вернуться к началу |
|
 |
Сергей Попов
Зарегистрирован: 05.03.2005 Сообщения: 299 Откуда: г. Тольятти - Самара - Копейск
|
Добавлено: Ср 09 Июн 2010 09:26 Заголовок сообщения: |
|
|
Алексей Васильев писал(а): | ИМХО непраФФ... |
Да, благодарю.
Но тогда, что в первоначальном коде вьювера подвело Вас? _________________ г. Тольятти, г. Самара, ОАО "КУЗНЕЦОВ" |
|
Вернуться к началу |
|
 |
Алексей Васильев
Зарегистрирован: 20.05.2009 Сообщения: 105 Откуда: Самара
|
Добавлено: Ср 09 Июн 2010 14:57 Заголовок сообщения: |
|
|
Вот только что, буквально 10 минут назад, позвонили, и сказали, что глюк опять вылез. Причем, скривилась подпись совсем другой линии, которая ранее была в полном порядке!
Видимо проблема в самом факте использования вьюхи вместо добропорядочной таблицы - будем надеяться, только в сочетании с прямой записью в сем. таблицы.
Будем переделывать на API...
PS: Кстати, у вас организовано дежурство карт? |
|
Вернуться к началу |
|
 |
APopov
Зарегистрирован: 19.06.2006 Сообщения: 347 Откуда: Самара
|
Добавлено: Ср 09 Июн 2010 15:07 Заголовок сообщения: |
|
|
если у вас вьюха более-менее статична (меняется редко) и служит лишь для того чтобы в Ингео-базе были видны в качестве справочника данные из другой базы, то проблема не во вьюхе.
как мне видится, ваша проблема в том, что ингео не узнало, что семантика некоего объекта изменилась и отображаемое поле ссылается уже на другое значение справочника (подчеркну, что я предполагаю, что значения самого справочника НЕ поменялись) _________________ ОАО "Самара-Информспутник",
инженер-программист Попов Артем |
|
Вернуться к началу |
|
 |
Сергей Попов
Зарегистрирован: 05.03.2005 Сообщения: 299 Откуда: г. Тольятти - Самара - Копейск
|
Добавлено: Ср 09 Июн 2010 17:24 Заголовок сообщения: |
|
|
Алексей Васильев писал(а): | ... скривилась подпись совсем другой линии, которая ранее была в полном порядке |
Тут не понятно - надпись изменила местоположение?
У нас наблюдается иногда/редко на некоторых компьютерах, в некоторых масштабах, что надписи отображаются горизонтально, а должны под углом. Но все сразу для всего слоя, а не в одиночку.
На счёт семантики, могу предположить что ИнГЕО ради скорости заводит кэши как таблиц, так и справочников. Может быть эти кэши в единственном числе на стороне сервера, но чем чёрт не шутит, может что-то быть и на клиентских местах. У нас был один оригинальный комп, с абсолютно стандартными настройками, и иногда на нём наблюдалось следующее: вводится семантика, она отображается и в окне свойств и на карте, но другим невидна. После завершения сеанса ИнГЕО, эта информация может стать доступной остальным, а может исчезнуть бесследно. Но в сеансе она где-то жила?
Работа на этом ПК была чисто операторская, без модулей.
API должно всё разрулить. _________________ г. Тольятти, г. Самара, ОАО "КУЗНЕЦОВ" |
|
Вернуться к началу |
|
 |
Алексей Васильев
Зарегистрирован: 20.05.2009 Сообщения: 105 Откуда: Самара
|
Добавлено: Чт 10 Июн 2010 12:20 Заголовок сообщения: |
|
|
Переделал на API - лучше не стало. И есть ощущение что, даже хуже.
Возможно, проблема в том, что динамически меняется содержимое именно СПРАВОЧНИКА. Как бы не пришлось делать какую-нибудь денормализацию хитрую, ибо в обратную сторону линков нет... |
|
Вернуться к началу |
|
 |
Сергей Попов
Зарегистрирован: 05.03.2005 Сообщения: 299 Откуда: г. Тольятти - Самара - Копейск
|
Добавлено: Чт 10 Июн 2010 13:27 Заголовок сообщения: |
|
|
Алексей Васильев писал(а): | Возможно, проблема в том, что динамически меняется содержимое именно СПРАВОЧНИКА |
ИнГЕО предполагает, что семантические таблицы могут изменяться двояко: средствами ИнГЕО или непосредственно в базе. Во втором случае надо оповестить ИнГЕО об этом (DropCache), чтобы она перечитала таблицу повторно и заменила внутренние кэши. А про справочники наверно забыли, т.к. у них такой функции не наблюдается в IngeoIntfs.
Возможны варианты:
1. Писать в Интегро и ждать исправления. В любом случае писать полезно.
2. Дублировать справочник, в родную для Вас схему, перенацелить связь на новый справочник и самостоятельно дополнять/изменять свой справочник средствами ИнГЕО:
Код: | IIngeoDb.RefBooks.Item[xxx].SemDbTable.InsertData(const aFields: WideString; const aValues: WideString; aParams: OleVariant) |
_________________ г. Тольятти, г. Самара, ОАО "КУЗНЕЦОВ" |
|
Вернуться к началу |
|
 |
Сергей Попов
Зарегистрирован: 05.03.2005 Сообщения: 299 Откуда: г. Тольятти - Самара - Копейск
|
Добавлено: Сб 12 Июн 2010 04:36 Заголовок сообщения: |
|
|
Интегро выложила 10.06.2010 новую версию ИнГЕО 4.4.0.224 на http://integro.ru/dl/ingeo/ingeo44/index.htm с библиотекой типов.
У IIngeoDb появилась процедура DropCache, которая вероятно сбрасывает все кэши, в том числе и у справочников.
P.S. Интересно как новая версия срабатывает на значение в поле, которое связано со справочником, но в самом справочнике такое значение отсутствует?
Пример: значение 5, а в справочнике только 4 записи со значениями от 1 до 4.
Сам смогу проверить только через пару недель. _________________ г. Тольятти, г. Самара, ОАО "КУЗНЕЦОВ" |
|
Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять приложения в этом форуме Вы можете скачивать файлы в этом форуме
|
|