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

Откуда: Казань
Сообщений: 59
помогите примером написания функции, входной параметр строка, на выходе должен быть сгенерирован штрихкод в алфавите code128
7 мар 12, 13:44    [12209784]     Ответить | Цитировать Сообщить модератору
 Re: штрихкод  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
А алгоритм генерации штрих-кода по строке все должны знать с школьной скамьи, да?
7 мар 12, 13:45    [12209805]     Ответить | Цитировать Сообщить модератору
 Re: штрихкод  [new]
LLL
Member

Откуда: Казань
Сообщений: 59
не знаю, нам не говорили, а может не помню, У меня проблема чужая процедурка не читает знак дефис, а ставит вместо него 0. И сканер на этикетке читает 0 а не - не знаю этих механизмов штрихкодирования, типа начальный символ 104 и тд, а мне очень срочно надо решить проблему
7 мар 12, 13:58    [12209930]     Ответить | Цитировать Сообщить модератору
 Re: штрихкод  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
LLL
не знаю, нам не говорили, а может не помню, У меня проблема чужая процедурка не читает знак дефис, а ставит вместо него 0. И сканер на этикетке читает 0 а не - не знаю этих механизмов штрихкодирования, типа начальный символ 104 и тд, а мне очень срочно надо решить проблему
И при чем тут MSSQL?
7 мар 12, 14:02    [12209970]     Ответить | Цитировать Сообщить модератору
 Re: штрихкод  [new]
LLL
Member

Откуда: Казань
Сообщений: 59
так процедура на скуле не правильно выдает символы
ALTER FUNCTION [dbo].[GetEAN128_1]
(	@CodeEAN128 nvarchar(128)
)


RETURNS nvarchar(128)
AS
Begin
declare
	@Koi128 nvarchar(max), 
	@i integer, 
	@weightcf integer,
	@uncode varchar (max),
	@code integer,
	@asciicurchar integer, -- ascii код обрабатываемого символа
	@ser varchar(30), -- tmp
	@checksum integer
	


--                 |0  |1  |2  |3  |4  |5  |6  |7  |8  |9  |
	set @uncode = '0032003300340035003600370038003900400041'+ -- (1-40)
--                 |10 |11 |12 |13 |14 |15 |16 |17 |18 |19 |
                  '0042004300440045004600470048004900500051'+ -- (41-80)
--                 |20 |21 |22 |23 |24 |25 |26 |27 |28 |29 |
                  '0052005300540055005600570058005900600061'+ -- (81-120)
--                 |30 |31 |32 |33 |34 |35 |36 |37 |38 |39 |
                  '0062006300640065006600670068006900700071'+ -- (121-160)
--                 |40 |41 |42 |43 |44 |45 |46 |47 |48 |49 |
                  '0072007300740075007600770078007900800081'+ -- (161-200)
--                 |50 |51 |52 |53 |54 |55 |56 |57 |58 |59 |
                  '0082008300840085008600870088008900900091'+ -- (201-240)
--                 |60 |61 |62 |63 |64 |65 |66 |67 |68 |69 |
                  '0092009300940095009600970098009901000101'+ -- (241-280)
--                 |70 |71 |72 |73 |74 |75 |76 |77 |78 |79 |
                  '0102010301040105010601070108010901100111'+ -- (281-320)
--                 |80 |81 |82 |83 |84 |85 |86 |87 |88 |89 |
                  '0112011301140115011601170118011901200121'+ -- (321-360)
--                 |z  |{  ||  |}  |~  |DEL|FN3|FN2|Sht|CdC|
--                 |90 |91 |92 |93 |94 |95 |96 |97 |98 |99 |
                  '0122012301240125012682168217822082218226'+ -- (361-400)
--                 |FN4|CdA|FN1|StA|StB|StC|Stop
--                 |100|101|102|103|104|105|106|
                  '8211821207328482035382500339'              -- (401-440)
             
	set @i = 1         -- первый символ входной строки
	set @weightcf = 1     -- весовой коэффициент элемента
	set @checksum = 0 -- контрольная СУММА
	set @Koi128 = ''
	set @code = 0
	while ( @i <= len (@CodeEan128))
		begin
			if (len (@CodeEan128) - @i) > 0 -- проверка на наличие хотябы 2х необработанных символов
				begin -- >=2 сомвола
					if (isnumeric(substring(@CodeEan128,@i,2)) = 1) and (PATINDEX('%.%',substring(@CodeEan128,@i,2)) = 0 )  -- выбор кода на основании содержимого пары символов
						begin -- пара символов является двузначной цифрой
							if @code = 0  -- обрабатывается первый символ
								begin
									set @code = 105
									set @checksum = @checksum + @code -- выбираем режим С (cо стартовым кодом - 105)
									set @Koi128 = @Koi128 + nchar(cast(substring(@uncode,@code*4+1,4) as  int))
								end
							if @code = 104 or @code = 100
								begin					
									set @code = 99	
									set @checksum = @checksum + @code * @weightcf -- выбираем режим С (cо стартовым кодом - 104)
									set @weightcf = @weightcf + 1
									set @Koi128 = @Koi128 + nchar(cast(substring(@uncode,@code*4+1,4) as  int))
								end
							set @asciicurchar = cast(substring(@CodeEan128,@i,2) as int)
							set @checksum = @checksum + cast(((@asciicurchar)*@weightcf) as int)
							set @Koi128 = @Koi128 + nchar(cast(substring(@uncode,(@asciicurchar)*4+1,4) as int))
							set @i = @i + 1
						end  
					else 
						begin  -- пара символов не является двузначной цифрой
							if @code = 0 
								begin
									set @code = 104 -- первый символ
									set @checksum = @checksum + @code -- выбираем режим B (cо стартовым кодом - 104)
									set @Koi128 = @Koi128 + nchar(cast(substring(@uncode,@code*4+1,4) as  int))
								end
							if @code = 105 or @code = 99
								begin
									set @code = 100 -- не первый символ
									set @checksum = @checksum + @code * @weightcf -- выбираем режим B (cо стартовым кодом - 104)
									set @weightcf = @weightcf + 1
									set @Koi128 = @Koi128 + nchar(cast(substring(@uncode,@code*4+1,4) as  int))
								end
							set @asciicurchar = ascii(substring(@CodeEan128,@i,1));

							set @checksum = @checksum + (@asciicurchar - 32)*@weightcf
							set @Koi128 = @Koi128 + nchar(cast(substring(@uncode,(@asciicurchar-32)*4+1,4) as int))
--							set @i = @i + 1
--							set @weightcf = @weightcf + 1
--							set @asciicurchar = ascii(substring(@CodeEan128,@i,1));
--							set @checksum = @checksum + (@asciicurchar - 32)*@weightcf
--							set @Koi128 = @Koi128 + nchar(cast(substring(@uncode,(@asciicurchar-32)*4+1,4) as int))
						end

				end
			else -- < 2 символов
				begin
					if @code = 0 
						begin
							set @code = 104
							set @checksum = @checksum + @code*@weightcf -- выбираем режим B (cо стартовым кодом - 104)
							set @Koi128 = @Koi128 + nchar(cast(substring(@uncode,@code*4+1,4) as  int))	
							set @weightcf = @weightcf + 1
						end
					if @code = 105 or @code = 99 
						begin
							set @code = 100
							set @checksum = @checksum + @code*@weightcf -- выбираем режим B (cо стартовым кодом - 104)
							set @Koi128 = @Koi128 + nchar(cast(substring(@uncode,@code*4+1,4) as  int))	
							set @weightcf = @weightcf + 1
						end
					set @asciicurchar = ascii(substring(@CodeEan128,@i,1))						
					set @checksum = @checksum + (@asciicurchar - 32)*@weightcf
					set @Koi128 = @Koi128 + nchar(cast(substring(@uncode,(@asciicurchar-32)*4+1,4) as int))	
				end
			set @i = @i+1
			set @weightcf = @weightcf + 1
		end
	set	@checksum = @checksum - (floor(@checksum/103)*103)
	set @Koi128 = @Koi128 + nchar(cast(substring(@uncode,@checksum*4+1,4) as  int)) -- контрольная сумма
	set @Koi128 = @Koi128 + nchar(cast(substring(@uncode,(106*4)+1,4) as int)) -- STOP (cо стартовым кодом - 106)
	RETURN (select @Koi128)
--return nchar(cast(substring(@uncode,(@ser)*4+1,4) as int))
End

вот эта процедурка чето не так выдает

Сообщение было отредактировано: 7 мар 12, 14:10
7 мар 12, 14:10    [12210048]     Ответить | Цитировать Сообщить модератору
 Re: штрихкод  [new]
Glory
Member

Откуда:
Сообщений: 104751
LLL
так процедура на скуле не правильно выдает символы

Ну так запустите дебаггер и узнайте, что же функция делает неправильно
7 мар 12, 14:19    [12210157]     Ответить | Цитировать Сообщить модератору
 Re: штрихкод  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
LLL,

set @uncode = '0032003300340035003600370038003900400041'


а не проше сделат табличные переменные?
7 мар 12, 19:04    [12212148]     Ответить | Цитировать Сообщить модератору
 Re: штрихкод  [new]
igr_ok
Member

Откуда:
Сообщений: 170
LLL
У меня проблема чужая процедурка не читает знак дефис, а ставит вместо него 0.
Возможно, что код этого символа отличается от тех, которые могут быть обработаны. Замените символ на стандартный перед обработкой
7 мар 12, 23:04    [12213254]     Ответить | Цитировать Сообщить модератору
 Re: штрихкод  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
LLL
while begin if  begin if begin if begin set  set  set end if begin 
О Боже.
Даже MS SQL 2000 не может оправдать.
8 мар 12, 01:16    [12213812]     Ответить | Цитировать Сообщить модератору
 Re: штрихкод  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
[quot MniorДаже MS SQL 2000 не может оправдать.[/quot]
Большенство пейсателей серверного кода вышло из процедурномыслящих прикладников, чему удивляться такому коду, попыток в функции обновить данные и т.д.
8 мар 12, 09:37    [12214075]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить