Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Сжатие числовых данных?  [new]
Legushka
Member

Откуда: Казань
Сообщений: 630
(в 2х мерный штрих код необходимо зашифровать)

подскажите плз алгоритмы для сжатия значений от -999 999 999.99 до 999 999 999.99
может есть лучше идеи чем моя или уже готовые решения)

я пока вижу простое решение использовать примерно 33 буквенных (типа по русски) + 10 числовых символа для определения нового алфавита (43 символа вместо 10)

43 в 7 степени это уже 27 181 861 110.70 что уже больше чем достаточно, тоесть один символ можно под знак минус забрать))))

тоесть моим алгоритмом можно будет сжаться до 7 символов вместо 12

может есть способы лучше без потерь сжать?
29 июн 09, 15:43    [7355232]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
а можно чуть-чуть поподробнее - зачем "сжимать" числа?
29 июн 09, 15:47    [7355266]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31170
Legushka
(в 2х мерный штрих код необходимо зашифровать)
Подробнее про постановку задачи - какой результат допустим?
29 июн 09, 15:50    [7355284]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
И, кстати, при чем тут MS SQL Server ?
29 июн 09, 15:54    [7355307]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
Legushka
Member

Откуда: Казань
Сообщений: 630
вместе с товарной накладной между дочерними предприятиями передавать в штрих коде туже информацию типа от кого кому что сколько почем с ндс, ставку и тп

и товарная часть - таблица порядка от 1 до (пока ограничений небыло но будет)

что бы в другом предприятии ненабивать повторно и не ошибатца в первичке решено печатать 2х мерный код (пока остановились на коде ПДФ417), а потом для ввода достаточно отсканировать))))


теперь надо как можно компактнее все зашифровать так как места для кода не так уж и много)

организации и прочяя справочная инфа это ИДки, так что тут уже не сократишся
а вот числовые значения СУММА КОЛИЧЕСТВО СТАВКА СУММА С НДС, НДС, ЦЕНА (последние четыре можно и расчитать)

тратить на цифры длину неахота когда если использовать уж все символы то можно сыграть


я еще не смотрел если кодировка pdf417 чувствительна к регистру то можно не 43 а 76 символов использовать))))
29 июн 09, 15:57    [7355329]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
Legushka
Member

Откуда: Казань
Сообщений: 630
SQL при том что я как то в нем привык работать)))
29 июн 09, 15:58    [7355335]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
Legushka
Member

Откуда: Казань
Сообщений: 630
подскажите плиз целочисленное деление как организовать я уже забыл какими операциями пользоватся

что бы 7/2 было 3 ))))
29 июн 09, 16:02    [7355350]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Вы не поверите
select 7/2 as result

result
-----------
3

(1 row(s) affected)
29 июн 09, 16:05    [7355373]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Legushka
SQL при том что я как то в нем привык работать)))
Я спрашивал - при чем тут сервер?
Имхо не его это забота, пусть такой ...ой лучше клиент занимается
29 июн 09, 16:07    [7355377]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
Legushka
Member

Откуда: Казань
Сообщений: 630
я знаю что 3 когда тип int

а у меня float

варианты с переводом в другие типы данных меня не интересуют

я просто забыл ту операцию которая возвращает целую часть
29 июн 09, 16:08    [7355382]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Legushka
варианты с переводом в другие типы данных меня не интересуют
Вы забыли сказать причину, по которой они Вас не интересуют
29 июн 09, 16:12    [7355410]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
Змей
Member

Откуда: Н.Новгород -> Москва
Сообщений: 192
Legushka,

declare @a float=7
declare @b float=2
select floor(@a/@b) 
29 июн 09, 16:20    [7355453]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
Legushka
Member

Откуда: Казань
Сообщений: 630
floor точно)))) а то мазги уже вскипели
спасибо,,.... я всегда знал что Змеи самые точные))))
29 июн 09, 16:22    [7355463]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
Legushka
Member

Откуда: Казань
Сообщений: 630
Паганель
Вы забыли сказать причину, по которой они Вас не интересуют

причина того что я искал именно floor )))
29 июн 09, 16:26    [7355490]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
SanyL
Member

Откуда: Москва
Сообщений: 4540
Legushka
вместе с товарной накладной между дочерними предприятиями передавать в штрих коде туже информацию типа от кого кому что сколько почем с ндс, ставку и тп

и товарная часть - таблица порядка от 1 до (пока ограничений небыло но будет)

что бы в другом предприятии ненабивать повторно и не ошибатца в первичке решено печатать 2х мерный код (пока остановились на коде ПДФ417), а потом для ввода достаточно отсканировать))))


теперь надо как можно компактнее все зашифровать так как места для кода не так уж и много)

организации и прочяя справочная инфа это ИДки, так что тут уже не сократишся
а вот числовые значения СУММА КОЛИЧЕСТВО СТАВКА СУММА С НДС, НДС, ЦЕНА (последние четыре можно и расчитать)

тратить на цифры длину неахота когда если использовать уж все символы то можно сыграть


я еще не смотрел если кодировка pdf417 чувствительна к регистру то можно не 43 а 76 символов использовать))))


А двумерные штрих-кода, как вариант, не рассматривали?
29 июн 09, 17:44    [7355774]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
SanyL
Member

Откуда: Москва
Сообщений: 4540
хм... не дочитал... но в двумерном вам должно хватить возможностей без сжатия
29 июн 09, 17:47    [7355789]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
Legushka
Member

Откуда: Казань
Сообщений: 630
SanyL, у нас в товарной накладной очень мало места для штрих кода: высота 1,6 см длина до 22 см, но в настройках макс количество столбцов=30 что составляет в длину 15 см

все остальное пространство по максимуму заполнено)))), но вы можете еще разместить свою рекламу(шутка)

я уже проэксперементировал и в результате примерно до 600 символов влазит, но небольше
30 июн 09, 07:40    [7357039]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
Заинтересованный читатель
Guest
--Преобразование в 36-ричную систему  
--michael_s 

--Сообщений: 30 Дата: 23.04.09 13:18:05 Ответить • Цитировать 

--вот пара функций T-SQl 

CREATE FUNCTION DBO.CNV10_2_36 (@ARG10 BIGINT) 
RETURNS CHAR(6) AS 
BEGIN 

if @ARG10=2176782336 

begin 

set @ARG10=1 
end 

DECLARE @RESULT AS CHAR(6),@RES AS BIGINT,@RES2 AS BIGINT 
SET @RESULT='' 
SET @RES =@ARG10 
DECLARE @R1 INT 
DECLARE @SABL CHAR(36) 
SET @SABL='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' 
--6 
SET @R1 =FLOOR(@ARG10/ POWER(36,5)) 
SET @RESULT=SUBSTRING(@SABL,@R1+1,1) 
SET @RES2=@R1*POWER(36,5) 
SET @RES=@ARG10-@RES2 
--5 
SET @R1 =FLOOR(@RES/ POWER(36,4)) 
SET @RESULT =RTRIM(@RESULT)+SUBSTRING(@SABL,@R1+1,1) 
SET @RES=@RES-@R1*POWER(36,4) 
--4 
SET @R1 =FLOOR(@RES/ POWER(36,3)) 
SET @RESULT =RTRIM(@RESULT)+SUBSTRING(@SABL,@R1+1,1) 
SET @RES=@RES-@R1*POWER(36,3) 

--3 
SET @R1 =FLOOR(@RES/ POWER(36,2)) 
SET @RESULT =RTRIM(@RESULT)+SUBSTRING(@SABL,@R1+1,1) 
SET @RES=@RES-@R1*POWER(36,2) 
--2 
SET @R1 =FLOOR(@RES/36) 
SET @RESULT =RTRIM(@RESULT)+SUBSTRING(@SABL,@R1+1,1) 
SET @RES=@RES-@R1*36 
--1 
SET @R1 =@RES 
SET @RESULT =RTRIM(@RESULT)+SUBSTRING(@SABL,@R1+1,1) 
--SET @RESULT=@C6 


RETURN @RESULT 
END 

CREATE FUNCTION DBO.CNV36_2_10 (@ARG36 CHAR(6)) 
RETURNS BIGINT AS 
BEGIN 
--declare @ARG36 CHAR(6) 
---set @ARG36 ='zaaaaa' 

SET @ARG36=UPPER(@ARG36) 

DECLARE @RESULT AS BIGINT, 
@RES BIGINT 
SET @RESULT =0 
SET @RES = 0 

DECLARE @R1 CHAR(1) 

DECLARE @ITER1 AS INT 
SET @ITER1=0 

WHILE @ITER1 < 7 
BEGIN 
SET @R1 = SUBSTRING(@ARG36, @ITER1+1, 1) 
IF ASCII(@R1)=32 
SET @RESULT= @RESULT+0 


ELSE BEGIN 
IF ASCII(@R1) > 47 AND ASCII(@R1)< 58 
SET @RESULT = @RESULT + (ASCII(@R1)-48) * POWER (36, 5 - @ITER1) 
ELSE BEGIN 
--SET @RESULT = @RESULT + (ASCII(@R1)-54) * POWER(36, 5 - @ITER1) 
SET @RES = POWER(36, 5 - @ITER1) 
SET @RES = @RES * (ASCII(@R1)-55) 
SET @RESULT = @RESULT + @RES 
END 
END 
SET @ITER1 = @ITER1 + 1 
END 
RETURN @RESULT 
END 
30 июн 09, 12:12    [7358238]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
efdm
Member

Откуда: Москва
Сообщений: 310
Legushka,

Насколько я понимаю, этот формат вполне поддерживает кодирование двоичных данных, поэтому вместо попыток изобрести велосипед лучше использовать уже существующие средства передвижения - заархивируйте ваш текст RAR'ом или 7z и посмотрите сколько данных таким образом можно загнать в pdf417.
30 июн 09, 17:27    [7360408]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
Legushka
Member

Откуда: Казань
Сообщений: 630
ВОТ мой велосипед)))

declare @aaa float
set @aaa=-999999999.999



------------------------------- кодирование
--	    123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789=	-- 100 символов
declare @alpha varchar(100), @str varchar(10)
set @str=''
set @alpha='0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNMйцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕН'
--1е умножаем на 1000 что бы перевести все в целое
declare @i bigint, @i2 bigint
set @i=@aaa*1000
set @i2=@i
while abs(@i2)>0 begin
	set @i2=floor(@i2/100)
	set @i=@i-@i2*100
	set @str=substring(@alpha,abs(@i),1)+@str
	set @i=@i2
end
if @aaa<0 set @str='-'+@str
select @str
------------------------------- раскодирование
--если первый символ это минус значит число отрицательное иначе нет
declare @m int
set @str=ltrim(rtrim(@str))
if substring(@str,1,1)='-' begin 
	set @m=-1
	set @str=substring(@str,2,len(@str))
end else set @m=1
declare @s char

while @str<>'' begin
	set @s=substring(@str,1,1)
	set @str=substring(@str,2,len(@str))
--	select PATINDEX ('%'+@s+'%',@alpha)
end

осталось вернуть позицию символа и склеить строку и умножить на множитель что бы обратно получить число

но одно но и PATINDEX и charindex возвращают мне позицию символа без учета регистра (большие маленькие буквы) и поэтому вместо 99 мне возвращается 67 (((

конечно я могу сравнить ...чтоно так и сделаю:
сравню патиндексом 67 символ "е" если он не равен по аскитаблице "Е" то значит дальше начну поиск с начиная с 67 позиции))))
2 июл 09, 17:07    [7369850]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
Legushka
Member

Откуда: Казань
Сообщений: 630
как можно сравнить "t" и "T" что это все же разные символы:
select 1 where 't'='T' 
--- результат=1
а мне не надо 1
2 июл 09, 17:10    [7369865]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
Legushka
Member

Откуда: Казань
Сообщений: 630
а вот заархивировать раром это прикольная идея тем более создавать тектовые файлы из нашей проги я умею....
вопрос все ли символы понимает ПДФ417 из сжатого файла?
2 июл 09, 17:12    [7369891]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
Anddros
Member

Откуда:
Сообщений: 1077
Legushka
как можно сравнить "t" и "T" что это все же разные символы:
select 1 where 't'='T' 
--- результат=1
а мне не надо 1

select 1 where 't' collate cyrillic_general_bin='T' collate cyrillic_general_bin
2 июл 09, 17:30    [7370039]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
Legushka
Member

Откуда: Казань
Сообщений: 630
вот добил свою тему теперь
declare @aaa float
set @aaa=-123456789.789
------------------------------- кодирование
--	    123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789=	-- 100 символов
declare @alpha varchar(100), @str varchar(10)
set @str=''
set @alpha='0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNMйцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕН'
--1е умножаем на 1000 что бы перевести все в целое
declare @i bigint, @i2 bigint
set @i=@aaa*1000
set @i2=@i
while abs(@i2)>0 begin
	set @i2=floor(@i2/100)
	set @i=@i-@i2*100
	set @str=substring(@alpha,abs(@i),1)+@str
	set @i=@i2
end
if @aaa<0 set @str='-'+@str
select @str
------------------------------- раскодирование
--если первый символ это минус значит число отрицательное иначе нет
declare @m int
set @str=ltrim(rtrim(@str))
if substring(@str,1,1)='-' begin 
	set @m=-1
	set @str=substring(@str,2,len(@str))
end else set @m=1
declare @s char, @p int, @float float
set @float=0
while @str<>'' begin
	set @s=substring(@str,1,1)
	set @str=substring(@str,2,len(@str))
	set @p=CHARINDEX  (@s,@alpha)
	if (select 1 where substring(@alpha,@p,1) collate cyrillic_general_bin<>@s collate cyrillic_general_bin)=1 begin
		set @p=CHARINDEX  (@s,@alpha,@p+1)
	end
	set @float=@float*100+@p
end
set @float=@float*@m/1000
select @float

так что бы было что пока показать)))
а теперь возьмусь за освоение rar или 7z - все же это более надежное решение + емкость)))
3 июл 09, 08:37    [7371456]     Ответить | Цитировать Сообщить модератору
 Re: Сжатие числовых данных?  [new]
Legushka
Member

Откуда: Казань
Сообщений: 630
начальство не одобрело идею раров
грит что поскоку мы от сюда не знаем есть ли рар нет ли на компах у пользователей...кто му же в дочерних организациях которые даже вдругих городах расположены...

не хотят зависить от этого фактора.....
мне разрешили тока в SQL сжимать данные-(
3 июл 09, 09:08    [7371571]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить