 |
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 группы, одна из которых будет использоваться программистами на своё усмотрение и коллизии в этой группе пусть будут на нашей совести. _________________ г. Тольятти, г. Самара, ОАО "КУЗНЕЦОВ" |
|
Вернуться к началу |
|
 |
Foton
Зарегистрирован: 09.10.2006 Сообщения: 158 Откуда: Ярославль
|
Добавлено: Пн 18 Июн 2012 13:22 Заголовок сообщения: |
|
|
Сергей Попов писал(а): | Самый типичный случай - массовая привязка растров, тем более что пока в версии 4.4.0.ххх нет API для этого.
Тоесть я хочу сказать что хоть это и не правильно, но бывает полезно и нужно.
|
как раз недавно столкнулся с проблемами ID при попытке привязать большую кучу растров.
Спасибо за вариант решения! |
|
Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять приложения в этом форуме Вы можете скачивать файлы в этом форуме
|
|