Страница 1 из 1

Формирование штрих-кода льготного рецепта

Добавлено: 08 Июнь 2015, 4:45
yuriy
Добрый день

Помогите пожалуйста решить проблему
Для печать штрих-кода необходимо в соответствии с алгоритмом
Перевести все данные включаемые в штрих-код в битовую последовательность
например:
ОГРН ЛПУ 1022402655159 необходимо перевести в битовую последовательность длиной 50 бит
Источник финансирования 1 в битовую последовательность длиной 2 бита
и так далее

Если кто делал это подскажите пожалуйста как это можно сделать?
Стандартными средствами или сторонними шаблонами или библиотеками?

Clarion 5.5

Формирование штрих-кода льготного рецепта

Добавлено: 08 Июнь 2015, 7:20
Admin
Очень интересен код который 24 байта в 50 бит закодирует :)
Может все таки ID нужно кодировать а не название?
О каком штрихкоде идет речь, агоритм какой?
И вообще немного задачу опишите.

Формирование штрих-кода льготного рецепта

Добавлено: 08 Июнь 2015, 7:35
yuriy
Кодировать надо только цифры конечно
Необходимо печатать из программы на Clarione бланк льготного рецепта
в нем есть штрих-код в PDF-417
Описание алгоритма формирования во вложенном файле
Как напечатать и закодировать в base64 я знаю не получается создать правильную по битам последовательность

Формирование штрих-кода льготного рецепта

Добавлено: 08 Июнь 2015, 9:58
Admin
Ну если двоичный вид то наверное...

Код: Выделить всё

                PROGRAM
                MAP
                  IntToBin(LONG N, LONG Extend),STRING
                END

    CODE
    ! N число для преобразования в биты
    ! Extend - расширить число до Extend бит (дописать нули в начало)
    MESSAGE(IntToBin(32768,50))

IntToBin    FUNCTION(LONG N, LONG Extend)!,STRING
Result      STRING(1024)
P           LONG
  CODE
  P = N
  Result = ''
  LOOP WHILE P > 0
     Result = P % 2 & CLIP(Result)
     P = P / 2
  END
  Result = ALL('0', Extend-LEN(CLIP(Result))) & CLIP(Result)
  RETURN CLIP(Result)

Формирование штрих-кода льготного рецепта

Добавлено: 08 Июнь 2015, 10:41
kreator
Вот здесь внешняя библиотека для формирования pdf-417 - http://forum.clarionlife.net/phpbb/view ... f=1&t=2969. Всё делает сама.

Формирование штрих-кода льготного рецепта

Добавлено: 08 Июнь 2015, 11:12
yuriy
Спасибо буду бороться дальше

Формирование штрих-кода льготного рецепта

Добавлено: 09 Июнь 2015, 5:41
yuriy
Добрый день

Предложенные варианты не совсем подходят т. к.
в переменную LONG для преобразования можно записать только 10 цифр
а код ОГРН и СНИЛС содержат 13 и 11 цифр
если согласно алгоритма преобразовать дозировку из символов в код ASCII то получается очень длинное число
например гранулы пролонг.п/о кш/раств.1000мг N50
получается 208 179 209 128 208 176 208 189 209 131 208 187 209 139 32 208 191 209 128 208 190 208 187 208 190 208 189 208 179 46 208 191 47 208 190 32 208 186 209 136 47 209 128 208 176 209 129 209 130 208 178 46 49 48 48 48 208 188 208 179 32 78 53 48
Если в функции IntToBin(LONG N , LONG Extend),STRING заменить на IntToBin(DECIMAL N, DECIMAL Extend),STRING
то при компиляции выходит ошибка invalid dta type for value parameter

Формирование штрих-кода льготного рецепта

Добавлено: 09 Июнь 2015, 7:01
Admin
Да. Чисто под LONG написал.
Для STRING и соответственно больших чисел нужно по другому писать.
Гуглить string to bin и разбираться.

Формирование штрих-кода льготного рецепта

Добавлено: 09 Июнь 2015, 7:12
Admin
На самом деле нужно функцию BSHIFT для строки.
Но в Clarion она работает только с LONG.

Формирование штрих-кода льготного рецепта

Добавлено: 09 Июнь 2015, 8:58
AlesDales
Добрый день.

Может это из другой оперы, но могу поделиться – совсем недавно занимался штрих-кодом pdf 417 и тоже из области медицины (штрих код на бумажных полисах обязательного медицинского страхования).
По спецификации shtrih.pdf СНИЛС - 37 бит. В строку включаются только цифры СНИЛС.

Если делать по аналогии с полисом, то СНИЛС – например 166-378-589 22 (последние две цифры это его контрольная сумма) преобразовывается в большое число 16637858922 которое в шестнадцатеричном виде выглядит как 03 DF B1 94 6A соответственно занимает всего 5 байт и если проверить 1111011111101100011001010001101010 – 34 бита.
Буквы в полисе, ф.и.о. например, вообще кодируются 6 битными сегментами по специальной таблице.

Формирование штрих-кода льготного рецепта

Добавлено: 09 Июнь 2015, 10:20
yuriy
AlesDales писал(а):Добрый день.

Может это из другой оперы, но могу поделиться – совсем недавно занимался штрих-кодом pdf 417 и тоже из области медицины (штрих код на бумажных полисах обязательного медицинского страхования).
По спецификации shtrih.pdf СНИЛС - 37 бит. В строку включаются только цифры СНИЛС.

Если делать по аналогии с полисом, то СНИЛС – например 166-378-589 22 (последние две цифры это его контрольная сумма) преобразовывается в большое число 16637858922 которое в шестнадцатеричном виде выглядит как 03 DF B1 94 6A соответственно занимает всего 5 байт и если проверить 1111011111101100011001010001101010 – 34 бита.
Буквы в полисе, ф.и.о. например, вообще кодируются 6 битными сегментами по специальной таблице.
Если не трудно пришлите исходники можно в личку.
Спасибо за помощь

Формирование штрих-кода льготного рецепта

Добавлено: 09 Июнь 2015, 17:38
yuriy
Admin писал(а):На самом деле нужно функцию BSHIFT для строки.
Но в Clarion она работает только с LONG.

Если не затруднит объясните пожалуйста, как с помощью функции BSHIFT получить из числа определённое количество бит
Например число 456789 перевести в двоичный вид длинной 25 бит дополнив слева 0 до необходимого размера.

Формирование штрих-кода льготного рецепта

Добавлено: 10 Июнь 2015, 2:30
Admin
yuriy писал(а): Если не затруднит объясните пожалуйста, как с помощью функции BSHIFT получить из числа определённое количество бит
Например число 456789 перевести в двоичный вид длинной 25 бит дополнив слева 0 до необходимого размера.
Ну вот вам пример с BSHIFT

Код: Выделить всё

                PROGRAM
                MAP
                  IntToBin(LONG N, LONG Extend),STRING
                END

LOC:Str         STRING(10)

S LONG

    CODE
    ! N число для преобразования в биты
    ! Extend - до скольки бит расширить число
    MESSAGE(IntToBin(456789,25),,,,,0)

IntToBin    FUNCTION(LONG N, LONG Extend)!,STRING
Result      STRING(1024)
P           LONG
  CODE
  P = N
  LOOP WHILE P > 0
    Result = P % 2 & CLIP(Result)
    P = BSHIFT(P, -1)
  END
  Result = ALL('0', Extend-LEN(CLIP(Result))) & CLIP(Result)
  RETURN CLIP(Result)

Формирование штрих-кода льготного рецепта

Добавлено: 10 Июнь 2015, 3:04
Admin

Код: Выделить всё

S LONG(33)
  CODE
  MESSAGE(BSHIFT(S, -1))
  S = S / 2 ! аналогично BSHIFT(S, -1) с учетом того что дробная часть в LONG отбрасывается 
  MESSAGE(S)

Формирование штрих-кода льготного рецепта

Добавлено: 10 Июнь 2015, 3:43
yuriy
Спасибо