  | 
				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.
 
Сам смогу проверить только через пару недель. _________________ г. Тольятти, г. Самара, ОАО "КУЗНЕЦОВ" | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять приложения в этом форуме Вы можете скачивать файлы в этом форуме
  | 
   
 
		 |