2

誤解を招くようなタイトルで申し訳ありませんが、バーコードのフォーマットを開発する必要があります (1D か 2D かは関係ありません)。バーコードには、発注書番号、船荷証券番号、ライン番号、製品 ID 番号、および発注書に記載されている各アイテムの数量を含める必要があります。これを行うためのアイデアはありますか?

これが私がこれまでに思いついたものです:

PurchaseOrder # - 船荷証券 # | Product1ID ライン番号 数量 | Product2ID 明細番号 数量| 製品3...

このアイデアの文字列は実際には次のようになります。

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

このアイデアでは、「*」をブレーク文字として使用して、アイテム間の違いを伝えるだけでなく、特定の特性ごとに必要な長さを持っています。私には、これを達成するためのより良い方法があるに違いないように思えます。このアイデアは非常に複雑で正確であるため、私の会社のサプライヤーに実装してもらうのは非常に困難です。これを達成する方法についての洞察やアイデアは大歓迎です。

編集:私はVB.NETを使用していますが。これは、より一般的なプログラミング ロジックの質問です。

4

2 に答える 2

1

ここではQRコードを使用します。アプリケーションでは、プレーンテキスト形式を使用してから、正規表現で処理できます。また、冗長性があり、生成と読み取りをサポートするための無料/オープンソースソフトウェアがたくさんあります。

于 2012-06-15T17:58:00.600 に答える
0

Code39 または Code128 (http://www.hibcc.org/autoidupn/standards.htm) を使用して実装された、HIBC LIC や HIBC PAS などの他の複雑なバーコードがあります。

重要なことは、一般的なバーコード スキャナーで読み取れるように、圧縮されたバーコードを生成できるシンボル体系を使用することです。したがって、Code39 または Code128 (GS1 ファミリ) を使用して、* を任意のもの (AIs/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 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%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;
        }
于 2012-06-15T18:00:21.683 に答える