2012-06-15 2 views
2

Прошу прощения, если заголовок вводит в заблуждение, но мне нужно разработать формат штрих-кода (либо 1D, либо 2D, не имеет значения). Штрих-код должен включать в себя заказ на поставку №, коносамент #, а также номер строки #, идентификатор продукта и количество каждого элемента, отображаемого в заказе на поставку. У кого-нибудь есть идеи для этого?Разработка эффективной системы штрих-кода/кода

Вот что я придумал до сих пор:

PurchaseOrder # - коносамент # | Product1ID Line # Кол-во | Product2ID Line # Кол-во | Product3 ...

Что строка для этой идеи на самом деле может выглядеть следующим образом:

VO12340000-APX132 * 65465 1 12 * 897965 2 5 * 98464 3 88 *

Эта идея использует "*", как символ разрыва, чтобы рассказать разницу между пунктами, а также иметь требуемую длину для каждого конкретного признака. Для меня, похоже, должен быть лучший способ добиться этого. Этой идее было бы очень сложно реализовать один из поставщиков моей компании, поскольку он очень сложный и точный. Любое понимание или идеи о том, как это сделать, будут высоко оценены.

EDIT: Хотя я использую VB.NET. Это скорее общий логический вопрос программирования.

ответ

1

Мы собираемся с помощью QR-кодов здесь. В вашем приложении вы можете использовать формат обычного текста, а затем обрабатывать их с помощью Regex. Кроме того, они имеют избыточность и множество бесплатных/открытых исходных программ для поддержки генерации и чтения.

+0

Спасибо за ответ, Любые конкретные ссылки на программное обеспечение с открытым исходным кодом? – SpartanSteelHead

+0

Возможно, больше того, что вы ищете, это метод [String.Split] (http://msdn.microsoft.com/en-us/library/system.string.split.aspx) для анализа любых разделителей (-ов) у тебя есть. –

0

Существуют другие сложные штрих-коды, такие как HIBC LIC и HIBC PAS с реализациями с использованием Code39 или Code128 (http://www.hibcc.org/autoidupn/standards.htm).

Важно, чтобы использовать символику, которая сможет генерировать сжатый штрих-код, чтобы читать обычным сканерам штрих-кодов. Таким образом, вы можете пойти с Code39 или Code128 (семейство GS1) и заменить * любым (AI/FUNC).

Если бы я был вами, я бы пошел с расширенной символикой Code93, оставляя спецификацию содержимого такой, какой она есть.

Следующий код из библиотеки, которую я сделал в прошлом для почти всех символик, которая даст вам то, что необходимо для реализации Code93 Extended. Это в C#, но легко преобразовать его в VB.NET. Имейте в виду, что вам придется изменить его для ваших нужд и что он генерирует только последовательность баров без их рисования.

 private static int[] 
      C93Table = { 131112, 111213, 111312, 111411, 121113, 121212, 121311, 111114, 131211, 141111, 211113, 211212, 211311, 221112, 221211, 231111, 112113, 112212, 112311, 122112, 132111, 111123, 111222, 111321, 121122, 131121, 212112, 212211, 211122, 211221, 221121, 222111, 112122, 112221, 122121, 123111, 121131, 311112, 311211, 321111, 112131, 113121, 211131, 121221, 312111, 311121, 122211 }; 
     static string[] 
      C93TableX = { "bU", "aA", "aB", "aC", "aD", "aE", "aF", "aG", "aH", "aI", "aJ", "aK", "aL", "aM", "aN", "aO", "aP", "aQ", "aR", "aS", "aT", "aU", "aV", "aW", "aX", "aY", "aZ", "bA", "bB", "bC", "bD", "bE", " ", "cA", "cB", "cC", "cD", "cE", "cF", "cG", "cH", "cI", "cJ", "cK", "cL", "cM", "cN", "cO", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "cZ", "bF", "bG", "bH", "bI", "bJ", "bV", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bK", "bL", "bM", "bN", "bO", "bW", "dA", "dB", "dC", "dD", "dE", "dF", "dG", "dH", "dI", "dJ", "dK", "dL", "dM", "dN", "dO", "dP", "dQ", "dR", "dS", "dT", "dU", "dV", "dW", "dX", "dY", "dZ", "bP", "bQ", "bR", "bS", "bT" }; 
     static string C93Set = "ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%abcd"; 

private void Code93X() 
     { 
      string source = request.Data; 
      Error valid = Validate(source, 197, C93Set); 
      if (valid != Error.None) 
      { 
       encoded = new Encoded() { Error = valid }; 
       return; 
      } 
      StringBuilder adapt = new StringBuilder(); 
      for (int i = 0; i < source.Length; i++) 
       adapt.Append(C93TableX[(byte)source[i]]); 
      Code93(adapt.ToString()); 
     } 

private void Code93(string source) 
     { 
      StringBuilder bars = new StringBuilder(); 
      bars.Append(111141); 
      int c = 0, k = 0; 
      int[] values = new int[source.Length + 1]; 
      for (int i = 0; i < source.Length; i++) 
      { 
       values[i] = C93Set.IndexOf(source[i]); 
       bars.Append(C93Table[values[i]]); 
      } 
      if (request.AddChecksum) 
      { 
       int weight = 1; 
       for (int i = source.Length - 1; i >= 0; i--) 
       { 
        c += values[i] * weight; 
        if (++weight == 21) 
         weight = 1; 
       } 
       c %= 47; 
       values[source.Length] = c; 
       bars.Append(C93Table[c]); 
       source += C93Set[c]; 
       weight = 1; 
       for (int i = source.Length - 1; i >= 0; i--) 
       { 
        k += values[i] + weight; 
        if (++weight == 16) 
         weight = 1; 
       } 
       k %= 47; 
       bars.Append(C93Table[k]); 
       if (request.DisplayChecksum) 
        source += C93Set[k]; 
      } 
      bars.Append(1111411); 
      source = string.Concat("*", source, "*"); 
      encoded = new Encoded(bars.ToString(), source); 
     } 


     private Error Validate(string source, int maxLength, string set) 
     { 
      Error valid = Validate(source, maxLength); 
      if (valid == Error.None) 
       for (var i = 0; i < source.Length; i++) 
        if (set.IndexOf(source[i]) < 0) 
        { 
         valid = Error.InvalidCharacters; 
         break; 
        } 
      return valid; 
     } 
+0

Я чувствую, что, возможно, я обманываю вас, ребята, с моим вопросом. То, что я прошу, находится внутри разработки контента, содержащегося в штрих-коде. Мое использование характерных линий разрывов и необходимость постоянной точной длины кажется сложным. – SpartanSteelHead

+0

Точная длина - не самая яркая идея. Прямая косая черта (/) или труба (|) или что-либо еще, что не будет путать вас с остальной частью контента, даст вам большую гибкость. В любом случае вы должны иметь возможность разделить содержимое на записи и поля. Примите это :) –

+0

ha! Принято, я думаю! спасибо за суровую правду: D – SpartanSteelHead

Смежные вопросы