EAN และ UPC เป็นชื่อที่คุ้นเคยจากบาร์โค้ดบนฉลากสินค้า ตัวเลขใต้แถบสีดำนั้นไม่ใช่ตัวเลขธรรมดาที่เรียงกันไปเรื่อย ๆ แต่หลักสุดท้ายคำนวณขึ้นจากหลักอื่นทั้งหมด การเข้าใจที่มาของหลักตัวนี้ช่วยให้ทีมพัฒนาระบบสินค้าคงคลังและระบบขายหน้าร้านแยกได้ว่าปัญหาที่พบมาจากข้อมูลนำเข้าที่ผิดหรือจากความเข้าใจผิดเกี่ยวกับความหมายของตัวเลข
หลักสุดท้ายของบาร์โค้ดสินค้ามาจากไหน?
ตัวเลขใต้แถบบาร์โค้ดที่ใช้กับสินค้าปลีกมีโครงสร้างที่แน่นอน โดยตำแหน่งสุดท้ายทำหน้าที่เป็นหลักตรวจสอบ หลักที่เหลือทั้งหมดใช้ระบุช่วงเลขที่ถูกจัดสรรให้กับผู้ประกอบการและรายการสินค้า
การมีหลักตรวจสอบอยู่ท้ายสุดทำให้เครื่องอ่านและระบบรับข้อมูลสามารถตรวจได้ทันทีว่าชุดตัวเลขที่อ่านได้สอดคล้องกันภายในตัวมันเองหรือไม่ หากอ่านได้ตัวเลขครบแต่ผลรวมไม่ลงตัว เครื่องหรือระบบปลายทางจะเตือนทันทีว่าควรอ่านซ้ำ
หลักตัวนี้ไม่ได้เพิ่มข้อมูลใหม่เกี่ยวกับสินค้า มันเป็นเพียงค่าที่คำนวณจากตัวเลขอื่นเพื่อให้ตรวจพบข้อผิดพลาดได้เร็วขึ้น จึงไม่ควรถูกนำไปตีความว่าเป็นรหัสหมวดหมู่หรือรหัสประเทศ
บาร์โค้ดสองความยาวที่พบบ่อยและตำแหน่งเริ่มถ่วงน้ำหนัก
แบบที่พบบ่อยในสินค้าปลีกมีสองความยาว ความยาวหนึ่งใช้กับการขายปลีกทั่วไปและพบเห็นได้บ่อยบนฉลาก อีกความยาวหนึ่งใช้ในแวดวงเดียวกันและมีพื้นที่น้อยกว่าจึงพบในสินค้าขนาดเล็ก
จุดที่ทำให้เกิดความผิดพลาดบ่อยคือตำแหน่งเริ่มต้นของการถ่วงน้ำหนัก น้ำหนักจะเริ่มจากด้านขวาเสมอ และเพราะความยาวต่างกัน ตำแหน่งที่น้ำหนักค่าหนึ่งตกจึงไม่ตรงกันระหว่างสองแบบ
ผลที่ตามมาคือการเขียนตรรกะโดยกำหนดความยาวตายตัวไว้ค่าเดียว จะทำให้อีกความยาวหนึ่งคำนวณผิดทันทีโดยไม่แจ้งข้อผิดพลาด สิ่งที่ควรทำคือให้ความยาวเป็นพารามิเตอร์ที่ส่งเข้ามา และตรวจความยาวก่อนคำนวณเสมอ
แนวคิดการถ่วงน้ำหนักจากขวาไปซ้าย
แนวคิดของหลักตรวจสอบแบบนี้คือการให้น้ำหนักสลับกันระหว่างค่าหนึ่งกับอีกค่าหนึ่ง โดยทั่วไปมักเป็นสามกับหนึ่ง แล้วนำผลคูณทั้งหมดมาบวกกัน จากนั้นจึงหาค่าส่วนเติมเต็มที่ทำให้ผลรวมหารลงตัวกับค่ามอดุลัส
ทิศทางที่ใช้คือจากขวาไปซ้าย ซึ่งทำให้ตำแหน่งสุดท้ายมีน้ำหนักคงที่ระยะหนึ่ง แล้วสลับไปมาตามความยาว การนับทิศทางให้ตรงนี้สำคัญมาก เพราะการนับกลับทางจะให้ผลลัพธ์ที่ต่างกันแทบทุกครั้ง
แนวทางนี้ยังเป็นสมาชิกของตระกูลมอดุลัสเช่นเดียวกับสูตรอื่น ซึ่งเปรียบเทียบโครงสร้างทั่วไปไว้ในภาพรวมอัลกอริทึมหลักตรวจสอบ และมีญาติร่วมตระกูลในงานสิ่งพิมพ์ที่อธิบายไว้ในหลักตรวจสอบของหนังสือและวารสาร
คำนำหน้าบาร์โค้ดบอกอะไร และไม่บอกอะไร
ความเข้าใจผิดที่พบบ่อยที่สุดเกี่ยวกับบาร์โค้ดสินค้าคือคิดว่าตัวเลขช่วงต้นบอกประเทศที่ผลิตสินค้า ความจริงคือช่วงต้นถูกจัดสรรโดยหน่วยงานมาตรฐานบาร์โค้ดให้กับช่วงหมายเลข ซึ่งสัมพันธ์กับภูมิภาคของผู้ขอใช้หมายเลข ไม่ใช่สถานที่ผลิต
สินค้าที่ผลิตในประเทศหนึ่งจึงสามารถมีหมายเลขที่ขึ้นต้นด้วยช่วงของอีกภูมิภาคได้ตามปกติ เพราะสิ่งที่กำหนดคือผู้รับผิดชอบหมายเลขนั้น ไม่ใช่สายการผลิต การนำตัวเลขนี้ไปใช้ระบุแหล่งผลิตจึงเป็นการตีความที่ผิดและอาจส่งผลทางกฎหมายได้
อีกจุดที่ควรระวังคือการแบ่งช่วงหมายเลขเกิดขึ้นในหลายระดับ ช่วงหนึ่งจัดสรรให้ผู้ประกอบการ อีกระดับจัดสรรให้ตัวสินค้า เมื่อช่วงหมายเลขถูกตัดแบ่งใหม่ในภายหลัง สินค้าชนิดเดียวอาจมีหมายเลขสองชุดที่ถูกต้องทั้งคู่
ผ่านการตรวจแล้วยิงเครื่องอ่านได้เสมอหรือไม่?
ไม่ใช่ เพราะการผ่านการคำนวณบอกเพียงว่าชุดตัวเลขสอดคล้องกันเอง ไม่ได้บอกว่าสินค้านั้นมีอยู่จริง หรือผู้ถือหมายเลขได้ลงทะเบียนสินค้ารายการนั้นไว้แล้ว
ในทางกลับกัน การไม่ผ่านการคำนวณมักชี้ไปที่คุณภาพของการอ่านหรือการพิมพ์มากกว่าจะเป็นการปลอมแปลง สาเหตุที่พบบ่อยมีดังนี้
- ตัวเลขตกหรือเกินไปหนึ่งหลักตั้งแต่ขั้นตอนพิมพ์ฉลาก
- ฉลากของสินค้าสองชิ้นวางชิดกันจนเครื่องอ่านรวมตัวเลขข้ามชิ้น
- ฉลากที่พิมพ์จางหรือเปรอะจนเครื่องอ่านเดาหลักผิด
- การนำตัวเลขไปกรอกใหม่ด้วยมือแล้วสลับตำแหน่งของสองหลัก
ดังนั้นเมื่อผลการตรวจไม่ผ่าน สิ่งแรกที่ควรทำคืออ่านซ้ำและตรวจว่าข้อมูลนำเข้ามีความยาวถูกต้อง มิใช่ตั้งสมมติฐานเรื่องการปลอมแปลงตั้งแต่ต้น
สำหรับทีมที่ต้องดูแลแคตตาล็อกสินค้า การแยกคำตอบให้ชัดระหว่างความผิดพลาดด้านรูปแบบกับความไม่สอดคล้องของหลักตรวจสอบช่วยให้จัดคิวงานแก้ไขได้ถูก เพราะสองกรณีนี้แก้โดยคนละวิธี
การแยกสองกรณีนี้ออกจากกันยังช่วยเรื่องการรายงานด้วย เพราะรายการที่รูปแบบผิดแก้ได้ในระบบของเราเอง แต่รายการที่หลักตรวจสอบไม่สอดคล้องต้องกลับไปตรวจที่ต้นทางของข้อมูล ซึ่งมักอยู่นอกการควบคุมของทีม จึงควรบันทึกไว้ด้วยว่าข้อมูลชุดนั้นรับมาจากแหล่งใด เพื่อให้ตามแก้ได้ตรงจุด
สำหรับนักพัฒนา: ตรวจเป็นชุดและหาตำแหน่งที่ผิด
การตรวจทีละหมายเลขเหมาะกับหน้ากรอกข้อมูล แต่เมื่อต้องนำเข้าแคตตาล็อกทั้งชุด ควรประมวลผลเป็นกลุ่มและรายงานผลเป็นรายบรรทัด เพื่อให้ผู้รับผิดชอบเปิดไปแก้ได้ตรงตำแหน่ง
สิ่งที่ควรเก็บในผลลัพธ์แต่ละบรรทัดคือค่าที่อ่านได้ ค่าหลังการปรับรูปแบบ และเหตุผลที่ปฏิเสธ การเก็บค่าต้นทางไว้สำคัญมาก เพราะค่าที่ปรับรูปแบบแล้วใช้ระบุปัญหายากในกรณีที่ตัวคั่นถูกวางไว้ผิดตำแหน่งตั้งแต่ต้น
อีกข้อคืออย่าผูกความยาวไว้ในตรรกะ ให้ตรวจความยาวและเลือกชุดน้ำหนักให้ตรงก่อนคำนวณ และควรมีชุดทดสอบที่ครอบคลุมความยาวทั้งสองแบบรวมถึงกรณีที่ข้อมูลยาวไม่ตรงกับแบบใดเลย หากคุณต้องการดูผลลัพธ์ของหมายเลขสมมติสั้น ๆ เพื่อทดสอบความเข้าใจ เครื่องมือตรวจสอบจะแสดงส่วนประกอบที่ใช้ตัดสินให้เห็นทีละชั้น
เมื่อพบรายการที่ไม่ผ่าน ควรบันทึกค่าต้นทางและค่าที่ปรับรูปแบบแล้วไว้คู่กันเสมอ เพราะเมื่อนำผลไปแก้ย้อนหลัง ต้องแยกให้ออกว่าความผิดพลาดเกิดจากข้อมูลที่รับมาหรือเกิดจากขั้นตอนปรับรูปแบบของเราเอง
ก้าวต่อไป
เริ่มจากการตรวจว่าส่วนคำนวณหลักตรวจสอบของระบบคุณรับความยาวเป็นพารามิเตอร์หรือไม่ หากยังกำหนดไว้คงที่ ให้แก้จุดนี้ก่อน เพราะเป็นสาเหตุที่พบบ่อยที่สุดของผลลัพธ์ผิดที่ไม่แจ้งเตือน
บาร์โค้ดและตัวเลขที่ยกมาในบทความนี้เป็นค่าสมมติสำหรับอธิบายการคำนวณเท่านั้น ไม่ใช่สินค้าจริง และการตรวจหลักสุดท้ายผ่านไม่ได้ยืนยันความแท้ของสินค้า