Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Firebird, InterBase |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
mr.Ulugbek Member Откуда: Сообщений: 371 |
Привет всем У кого нибудь есть процедура для создание Штрих кода последовательном образе? Заранее благодарен |
1 апр 11, 11:03 [10455654] Ответить | Цитировать Сообщить модератору |
Ivan_Pisarevsky Member Откуда: НН Сообщений: 8718 |
|
||
1 апр 11, 11:35 [10455907] Ответить | Цитировать Сообщить модератору |
PEAKTOP Member Откуда: агломерация Славянск-Краматорск-Дружковка Сообщений: 1383 |
Штрих-код - это всего лишь способ записи цифр полосками. Не более. Для QReport есть TQRBarCode, у FastReport-а тоже есть компонент на подобие. Выставляешь у компонента свойство DataSource и DataField, а также тип штрих-кода, например, EAN13 - и все. Если тебе нужно выводить цифры, которые не соответствуют правилам формирования штрих-кода (да-да, этот набор цифр не просто так), например - номер документа для автоматизированного считывания номеров в системе документооборота, то у компонент отображения штрих-кода есть свойство CheckSum. Поставь его в true (или Modulo10, какие там компоненты у тебя) - и штрих-код будет "правильным". |
||
1 апр 11, 13:12 [10456683] Ответить | Цитировать Сообщить модератору |
mr.Ulugbek Member Откуда: Сообщений: 371 |
Мне надо создать штрих код Допустим есть товары у которых нет штрих код вот для них я хочу генерировать штрих код сам |
1 апр 11, 14:11 [10457035] Ответить | Цитировать Сообщить модератору |
Евгений, Екатеринбург Member Откуда: Сообщений: 656 |
Штрихкод не генерируется. Это просто шрифт - как тут уже сказали система отображения текста (не только цифр) полосками. Соответственно в базе хранится этот текст, а генератор отчетов преобразует этот текст в штрихкод для печати. Для того чтобы содать его в базе, ты должен придумать/принять алгоритм по которому он создается. Если штрихкод чисто для себя (как у нас), то можешь создавать его как хочешь - у нас состоит: первые три цифры - код типа документа (например 201 это альбом с чертежами), последующие это ID в базе - например 201487 означает, что это альбом чертежей с номером 487, он же инвентарный номер в бумажном архиве. 202002 - накладная и т.д. Если требуется для повсеместного применения, то надо придерживатся общепринятых правил создания этого текста, но это вроде регистрироваться надо. |
||
1 апр 11, 15:21 [10457579] Ответить | Цитировать Сообщить модератору |
rstrelba Member Откуда: Сообщений: 177 |
mr.Ulugbek, у меня есть UDF, которая на базе какого-нибудь кода, например id товара генериреут EAN13. Если избавиться от константного массива, то можно и хранимую процедуру сделать function IntToEAN13(var Value:Int64):PChar; cdecl; export; var S:String; i:Integer; _check, _sum, _odd, _even : Integer; const zArray : array [1..11] of String = ( '20000000000', '2000000000', '200000000', '20000000', '2000000', '200000', '20000', '2000', '200', '20', '2' ); begin // S := IntToStr(Value); S := zArray[Length(S)] + S; _odd := 0; _even := 0; for i:=0 to 11 do begin if (i div 2)*2=i then _even := _even + StrToInt(Copy(S,i+1,1)) else _odd := _odd + StrToInt(Copy(S,i+1,1)); end; _odd := _odd * 3; _sum := _odd + _even; _check := (_sum div 10)*10; if _check=_sum then _check := 0 else _check := _check + 10 - _sum; // Result := PChar(S + IntToStr(_check)); end; |
1 апр 11, 16:09 [10458025] Ответить | Цитировать Сообщить модератору |
miwaonline Member Откуда: Сообщений: 2249 |
Уточняю. Если для ВНУТРЕННИХ нужд надо самостоятельно генерировать коды товаров, то надо только, чтобы они начинались на «2». Ну и последняя, 13-я цифра должна расчитываться по стандартному алгоритму. Остальные 11 цифр - на усмотрение разработчика. Уточняющий вопрос для ТСа - тебе нужна реализация этого алгоритма на SQL? Или полученных ответов достаточно? |
||||
1 апр 11, 16:13 [10458069] Ответить | Цитировать Сообщить модератору |
Евгений, Екатеринбург Member Откуда: Сообщений: 656 |
Это если EAN-13 использовать. Если CODE39, то количество символов может быть и меньше, к тому же в этом стандарте контрольная сумма не обязательный параметр. Мне code39 удобнее показался - проще формировать текст получилось - 201 код товара, просто "склеиваем" с ID этого товара, никакой реализации алгоритма не надо. Ну у меня он так, как фенька для Заказчиков пока используется. Про первую цифру 2 для внутреннего применения, да забыл написать... |
||||
2 апр 11, 10:49 [10460777] Ответить | Цитировать Сообщить модератору |
PEAKTOP Member Откуда: агломерация Славянск-Краматорск-Дружковка Сообщений: 1383 |
Если компонента для отображения штрих-кода "умная" (например, TQRBarCode или компонента из FastReport-а), то этой фигней вообще заморачиваться не надо. В качестве DataField ей присваиваешь 'TMC_ID' (ID товара), а она сама уже дополняет цифрами слева (нолями и первой двойкой) необходимое количество знаков и рассчитывает последний знак после кода, как контрольную сумму. А после считывания выделяем функцией подстроки ID товара. |
||
2 апр 11, 11:06 [10460793] Ответить | Цитировать Сообщить модератору |
Ivan_Pisarevsky Member Откуда: НН Сообщений: 8718 |
Ну и изба говорильня. ![]() CREATE PROCEDURE ID2EAN13 ( prefix varchar(10), id integer) returns ( barcode varchar(13)) as declare variable n integer; begin barcode = prefix || lpad(id, 12-char_length(prefix), '0'); n = (cast (substring (barcode from 2 for 1) as integer)+ cast (substring (barcode from 4 for 1) as integer)+ cast (substring (barcode from 6 for 1) as integer)+ cast (substring (barcode from 8 for 1) as integer)+ cast (substring (barcode from 10 for 1) as integer)+ cast (substring (barcode from 12 for 1) as integer))*3+ cast (substring (barcode from 1 for 1) as integer)+ cast (substring (barcode from 3 for 1) as integer)+ cast (substring (barcode from 5 for 1) as integer)+ cast (substring (barcode from 7 for 1) as integer)+ cast (substring (barcode from 9 for 1) as integer)+ cast (substring (barcode from 11 for 1) as integer); n = mod(n,10); if (n>0) then n = 10-n; barcode = barcode || cast (n as varchar(20)); suspend; endНа входе чиселко, на выходе баркод еан13 с контрольной суммой. желающие кормить оную процедуру мусором могут сами написать эксепшны, на случай переполнения. Проверено на версии сервера 2.1, никаких УДФ не требуется. Желающие могут пользоваться кодом без ограничений. |
2 апр 11, 13:36 [10461073] Ответить | Цитировать Сообщить модератору |
PEAKTOP Member Откуда: агломерация Славянск-Краматорск-Дружковка Сообщений: 1383 |
Думаю, это нужно увековечить =) |
||
2 апр 11, 14:07 [10461136] Ответить | Цитировать Сообщить модератору |
Между сообщениями интервал более 1 года. |
a-phone Member Откуда: Сообщений: 6 |
Всем привет у меня сервер бд Firebird 2.5.1 Есть исходник на vb из него хотелось бы сделать хранимую процедуру, но я новичек в этом деле и один не осилю прошу помощи гуру. вот исходник: Attribute VB_Name = "Barcode" Option Explicit Private Function Code_39_Ch(Ch As String) As String Dim S As String Select Case Ch Case "1": S = "28002" Case "2": S = "0:002" Case "3": S = "2:000" Case "4": S = "08202" Case "5": S = "28200" Case "6": S = "0:200" Case "7": S = "08022" Case "8": S = "28020" Case "9": S = "0:020" Case "0": S = "08220" Case Else: S = "" End Select Code_39_Ch = S End Function Public Function CODE_BAR(CARD As String) Dim I As Integer Dim S As String S = "" For I = 1 To Len(CARD) S = S & Code_39_Ch(Mid(CARD, I, 1)) Next I CODE_BAR = "80220" & S & "80220" End Function Сообщение было отредактировано: 19 май 12, 22:02 |
19 май 12, 20:50 [12582572] Ответить | Цитировать Сообщить модератору |
kdv Member Откуда: iBase.ru Сообщений: 29556 |
1000 руб. |
19 май 12, 21:46 [12582759] Ответить | Цитировать Сообщить модератору |
Ivan_Pisarevsky Member Откуда: НН Сообщений: 8718 |
отформатировал тэгами исходник. "с вас пятьдесят копеек"(с). |
19 май 12, 22:03 [12582836] Ответить | Цитировать Сообщить модератору |
kdv Member Откуда: iBase.ru Сообщений: 29556 |
мне регулярно вспоминается анекдот про слесаря, канализацию, и практиканта. Соответственно, вопрос - вы нам предоставите в этом г..не плавать, а сами будете только ключи подавать? Или вы предполагаете, что тут собрались спецы по VB? Вы сами что сделали, и что не получилось? |
||
19 май 12, 22:23 [12582932] Ответить | Цитировать Сообщить модератору |
a-phone Member Откуда: Сообщений: 6 |
kdv, честно, сам только укоротил vb исходник , но читал книжки и уроки про sql , правда понял мало.решил что моих только что полученных "знаний" не хватит. И пришел к Вам. А на счет ключей и практиканта наверное правда со стороны так смотрится.Сорри. |
20 май 12, 00:04 [12583420] Ответить | Цитировать Сообщить модератору |
kdv Member Откуда: iBase.ru Сообщений: 29556 |
почитайте, как пишутся процедуры http://www.ibase.ru/devinfo/sp_call.htm посмотрите примеры в базе employee и в документации. Сопоставьте язык VB и язык PSQL (процедур в ФБ). Перепишите процедуру с VB на FB. |
20 май 12, 00:28 [12583490] Ответить | Цитировать Сообщить модератору |
a-phone Member Откуда: Сообщений: 6 |
Спасибо получилось хоть и криво но работает , код нужен чтобы заменять 7 -ми значный код полученый с штрихсканера обратно в штрихкод в связке с шрифтом:
С циклами еше не разобрался ,но если кто усовершенствует то заранее благодарен.
Сообщение было отредактировано: 21 май 12, 08:17 |
||
21 май 12, 00:01 [12585805] Ответить | Цитировать Сообщить модератору |
Exteris Member Откуда: Новосибирск Сообщений: 1021 |
Зачем вам эта куча переменных. Писали бы сразу: if (ls='0') then bartxtl='08220' ... |
||
21 май 12, 09:47 [12586362] Ответить | Цитировать Сообщить модератору |
Ivan_Pisarevsky Member Откуда: НН Сообщений: 8718 |
|
||
21 май 12, 10:47 [12586737] Ответить | Цитировать Сообщить модератору |
a-phone Member Откуда: Сообщений: 6 |
Ivan_Pisarevsky, надо так - там старт-стоп символ потерялся конец кода :
Спасибо за укорочение кода . |
|
21 май 12, 20:32 [12591129] Ответить | Цитировать Сообщить модератору |
a-phone Member Откуда: Сообщений: 6 |
1.Господа ,хотел спросить Вас ,можно ли малыми усилиями из процедуры которая выше сделать функцию? чтобы table.field1=function( table.fild2) я бы field1 так создал ALTER TABLE UNITS ADD CODE_BAR GENERATED ALWAYS AS (bc (units.card)) 2.Будет ли это работать? |
21 май 12, 23:27 [12591563] Ответить | Цитировать Сообщить модератору |
Ivan_Pisarevsky Member Откуда: НН Сообщений: 8718 |
|
||
21 май 12, 23:54 [12591647] Ответить | Цитировать Сообщить модератору |
Ivan_Pisarevsky Member Откуда: НН Сообщений: 8718 |
а. УДФ, для этого и не надо было твой код переписывать. скомпилил бы его в виде ДЛЛ (следуя правилам, см. ibase.ru) УДФ имеет свои преимущества и недостатки. Я лично предпочитаю по возможно не использовать УДФ, как повод мне необходима кроссплатформенность, компились УДФ под разные линухи и винды просто лениво. б. дождаться третьей версии ФБ. |
||
21 май 12, 23:59 [12591653] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52481 |
Попробуй. Раз уж используешь тройку - тебе и эксперименты ставить. Posted via ActualForum NNTP Server 1.5 |
||
22 май 12, 00:03 [12591662] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Firebird, InterBase | ![]() |