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

Генерация идентификатора

 
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков
Предыдущая тема :: Следующая тема  
Автор Сообщение
PEKAHT



Зарегистрирован: 25.09.2009
Сообщения: 5

СообщениеДобавлено: Ср 13 Июн 2012 13:18    Заголовок сообщения: Генерация идентификатора Ответить с цитатой

Подскажите пожалуйста, как сгенерировать идентификатор.
Мне надо самому добавлять записи в таблицы (не графические)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
APopov



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

СообщениеДобавлено: Чт 14 Июн 2012 19:12    Заголовок сообщения: Ответить с цитатой

генерация ингео-идентификатора
Application.ActiveDB.GenerateID
//Application здесь типа IIngeoApplication

_________________
ОАО "Самара-Информспутник",
инженер-программист Попов Артем
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
PEKAHT



Зарегистрирован: 25.09.2009
Сообщения: 5

СообщениеДобавлено: Пт 15 Июн 2012 12:52    Заголовок сообщения: Ответить с цитатой

Спасибо, а без API ингео можно?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
APopov



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

СообщениеДобавлено: Пт 15 Июн 2012 14:59    Заголовок сообщения: Ответить с цитатой

можно, но сложно (для MSSQL Server)
Код:

/*код на основе хранимок ИнМеты */
/*hexstr to int*/
--//Samara-Informsputnik
create function dbo.hexToInt(@hexstr varchar(8)) RETURNS int
as
begin
   DECLARE @rez INT; SET @rez = 0
   WHILE @hexstr <> '' BEGIN
      SET @rez = @rez * 16 + CHARINDEX(LEFT(@hexstr,1),'0123456789ABCDEF') - 1
      SET @hexstr = SUBSTRING(@hexstr,2,8)
   END
   RETURN @rez
end
go

/*bigint to hexstr */
--//Samara-Informsputnik
create function dbo.IntToHex(@bi bigint, @posCount int) RETURNS varchar(16)
as
begin
   DECLARE @rez varchar(16); SET @rez = ''
   if @bi<0 begin
      if @posCount<=4 set @bi = convert(bigint, convert(binary(2), @bi))
      else
      if @posCount<=8 set @bi = convert(bigint, convert(binary(4), @bi))
      /*else
      --с отрицательными числами больше int проблема. результатом будут нули
         set @bi = convert(bigint, convert(binary(8), @bi))*/
   end
   while len(@rez) < @posCount begin
       set @rez = substring('0123456789ABCDEF', @bi%16 + 1, 1) + @rez
       set @bi = @bi/16
   end
   RETURN @rez
end
go
--select dbo.IntToHex(-20000,8), -200%16, convert(binary(8), -128)/16, convert(bigint, 0xFFFF0001) % 16
go
/*local to global*/
--//Samara-Informsputnik
create function INGEO_Local2Global(@lid varchar(12)) RETURNS varchar(50)
as
BEGIN
   if ((@lid is null)or(len(@lid)<>12)) return ''

   declare @gid varchar(50)
   select @gid=GLOBALID+convert(varchar(10), dbo.hexToInt(SUBSTRING(@lid,5,9)))
      from INGEO_IDMAPER where LOCALID=dbo.hexToInt(SUBSTRING(@lid,1,4))
   if @gid is null return ''
   return(@gid)
END
GO

/*global to local*/
--//Samara-Informsputnik
create function INGEO_Global2Local(@gid varchar(50)) RETURNS varchar(12)
as
BEGIN
   if ((@gid is null)or(len(@gid)=0)) return ''

   declare @lid varchar(50), @breakPos int, @part1 varchar(4), @part2 varchar(8)
   set @breakPos = CHARINDEX('}', @gid)
   if @breakPos=0 return ''

   select @lid=dbo.IntToHex(LOCALID,4) + dbo.IntToHex(SUBSTRING(@gid,@breakPos+1,200),8)
      from INGEO_IDMAPER where GLOBALID=SUBSTRING(@gid,1,@breakPos)
   if @lid is null return ''
   return(@lid)
END
GO

/* //Samara-Informsputnik
Процедура генерации ИД для БД ИнГео.
Важно!! Использовать ее только при закрытой БД ИнГео в Сервере данных ИнГео.
НЕОБХОДИМО ГАРАНТИРОВАТЬ, чтобы БД не использовалась клиентами ингео.
грубо говоря, лучше при ее использовании, остановить сервер данных совсем.
*/
CREATE PROCEDURE [dbo].[INGEO_GenerateID]
     @ID varchar(12) output
AS
BEGIN
   set nocount on
   declare @NextNumber int, @NewLID int, @bi bigint

   select @NextNumber=IDNUMBER+1, @ID = dbo.IntToHex(IDGROUP,4) + dbo.IntToHex(IDNUMBER+1,8)
   from INGEO_DBINFO

   --set @NextNumber=@NextNumber+1

   if @NextNumber > (2147483647 - 2) begin
       select @NextNumber = 2

       select @NewLID = ISNULL(min(LOCALID) + 1, 1) from INGEO_IDMAPER
       where LOCALID + 1 not in (select LOCALID from INGEO_IDMAPER)

       insert into INGEO_IDMAPER(GLOBALID, LOCALID, IDCLASS)
       values ('{' + convert(varchar(36), newid()) + '}', @NewLID, 0)

       update INGEO_DBINFO set IDGROUP = @NewLID
   end

   update INGEO_DBINFO set IDNUMBER=@NextNumber
END
GO

/*call sample --16829
как функцию использовать нельзя. в селектах, инсертах апдейтах использовать неполучится из-за ограничений скл сервера
declare @newOID varchar(12)
exec INGEO_GenerateID @newOID output
print @newOID
*/


используйте на свой страх и риск. надеюсь не забудете указать авторство, если будете передавать третьей стороне

_________________
ОАО "Самара-Информспутник",
инженер-программист Попов Артем


Последний раз редактировалось: APopov (Вт 17 Июл 2012 15:09), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Сергей Попов



Зарегистрирован: 05.03.2005
Сообщения: 299
Откуда: г. Тольятти - Самара - Копейск

СообщениеДобавлено: Пн 18 Июн 2012 02:09    Заголовок сообщения: Ответить с цитатой

PEKAHT писал(а):
Спасибо, а без API ингео можно?

Понятно что крайне нежелательно и опасно.
Постараюсь снять хотябы один вопрос - опасность.
1. Рекомендую прочитать в файле IngeoIntfs.chm (в одной папке с Ingeo.exe) статью "Идентификация объектов".
2. В статье упоминаются следующие три термина: группа, короткий псевдоним группы и номер (в рамках данной группы).
Информация о группах и их коротких псевдонимах хранится в полях LOCALID и GLOBALID таблицы INGEO_IDMAPER
3. Среди этих групп есть одна основная, текущая группа, которую использует ИнГЕО для вновь создаваемых системных (карта, слой, и т.д.) и графических объектов. Её номер, т.е. короткий псевдоним можно найти в поле IDGROUP единственной записи таблицы INGEO_DBINFO
4. Для этой группы максимальный использованный номер хранится в IDNUMBER
5. Теперь как это использовать?
а) Остановить сервер ИнГЕО для надёжности, чтобы никто не помешал.
б) Записать значение полей IDGROUP и IDNUMBER таблицы INGEO_DBINFO.
Допустим IDGROUP=1, IDNUMBER=25556.
в) В "Сервере ИнГЕО" в меню "База данных" выбрать "Сменить генератор".
г) Теперь ИнГЕО создал новую группу и переключился на использование новой группы. А старую группу (1) с номера больше чем (>25556) мы можем использовать для своих нужд. Для получения идентификатора конвертируем десятичные значения в 16-тиричное представление по формату GGGGNNNNNNNN. Получаем "0001000063D5" и т.д.
--
Внимание!
Данная технология может дать сбой, если Вы тиражировали базу не используя команду "Сменить генератор".
--
Достаточно часто встречаются такие задачки, которые можно легко решить с помощью SQL и Excel не прибегая к программированию. Самый типичный случай - массовая привязка растров, тем более что пока в версии 4.4.0.ххх нет API для этого.
Тоесть я хочу сказать что хоть это и не правильно, но бывает полезно и нужно.
Сразу предложение в адрес разработчиков: давайте узаконим эту возможность. Пусть ИнГЕО сразу формирует 2 группы, одна из которых будет использоваться программистами на своё усмотрение и коллизии в этой группе пусть будут на нашей совести.

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



Зарегистрирован: 09.10.2006
Сообщения: 158
Откуда: Ярославль

СообщениеДобавлено: Пн 18 Июн 2012 13:22    Заголовок сообщения: Ответить с цитатой

Сергей Попов писал(а):
Самый типичный случай - массовая привязка растров, тем более что пока в версии 4.4.0.ххх нет API для этого.
Тоесть я хочу сказать что хоть это и не правильно, но бывает полезно и нужно.

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

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


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