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

Глюк с подписями объектов

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

Цитата:
IndexOfSemTable


Это один из методов API, или это константа, заданная разработчиком расширения? В моей версии API такой индентификатор не узнается.

Цитата:
во всяком случае прежде чем пенять на ингео необходимо


Разумеется. Скажу вам по секрету, я Ингео очень люблю, и всячески ее пропагандирую. Просто ситуация была напряжённая - на носу было совещание на достаточно высоком уровне, надо было, чтоб все было Smile работали, глядя на секундомер, а тут такая фича. Да и то, ковырялись целый день перед обращением сюда.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
APopov



Зарегистрирован: 19.06.2006
Сообщения: 347
Откуда: Самара

СообщениеДобавлено: Вт 08 Июн 2010 15:19    Заголовок сообщения: Ответить с цитатой

Алексей Васильев писал(а):

Это был второй вариант: прямая запись в таблицу через Оракл

я так и понял )

Алексей Васильев писал(а):

Попробовал вариант через API - тоже работает, только вы видимо забыли GetObject() перед SemData. Ну и предупредить, что нужно после делать UpdateChanges. Тем не менее - разобрались.

я просто отбросил тонкости, которые несложно выяснить из
"c:\Program Files\Integro\InGeo\IngeoIntfs.chm"

Цитата:
IndexOfSemTable

да это я так назвал некую свою предполагаемую переменную, которую я бы применял в более общем случае ) так сказать "говорящее имя".
Алексей Васильев писал(а):

а "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 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Алексей Васильев



Зарегистрирован: 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    Заголовок сообщения: Ответить с цитатой

Алексей Васильев писал(а):
ИМХО непраФФ...

Да, благодарю.
Но тогда, что в первоначальном коде вьювера подвело Вас?

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



Зарегистрирован: 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 должно всё разрулить.

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



Зарегистрирован: 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)

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



Зарегистрирован: 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.
Сам смогу проверить только через пару недель.

_________________
г. Тольятти, г. Самара, ОАО "КУЗНЕЦОВ"
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков Часовой пояс: GMT + 5
Страница 1 из 1

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


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