ว่าด้วยเรื่องการคำนวณตัวเลขตรวจสอบ (Check Digit)

ได้รับมอบหมายจากทีมในการสร้าง Oracle Function เพื่อคำนวณตัวเลขตรวจสอบ (check digit) ของการชำระเงินค่าสมัครผ่านช่องทางการชำระเงินช่องทางหนึ่ง โดยได้รับ requirement มาดังภาพข้างล่างนี้

จากภาพข้างต้นจะมีข้อมูลสำหรับการนำเข้า 4 ชุดซึ่งประกอบด้วย

  • ชุดที่ 1 : Customer No.1/Ref.1 
  • ชุดที่ 2 : Due Date (DDMMYY : พ.ศ.)  
  • ชุดที่ 3 : Customer No.2/Ref.2
  • ชุดที่ 4 : จำนวนเงินที่ต้องชำระ

พร้อมด้วยขั้นตอนวิธีในการคำนวณตัวเลขตรวจสอบ (check digit) ดังนี้

มาทำความเข้าใจกับวิธีคำนวณกันก่อนที่จะเริ่มต้นสร้าง Oracle Function

ถ้ามาดูรายละเอียดของวิธีการคำนวณในข้อที่ 1 ซึ่งเป็นการหาค่าประจำหลักของข้อมูลนำเข้า โดยวิธีการคือ นำข้อมูลแต่ละหลักคูณค่าคงที่ คือ 6, 4, 5, 8, 7 ไปเรื่อย ๆ ตามลำดับ

การหาค่าประจำหลักของข้อมูลนำเข้า จะสังเกตุว่าถ้านำข้อมูลนำเข้าทั้ง 4 ชุดข้อมูลมาเรียงต่อกันจะมีความยาวเท่ากับ 35 โดยที่

  • ลำดับที่ 1, 6, 11, 16, 21, 26, 31 นำค่าข้อมูลคูณด้วย 6
  • ลำดับที่ 2, 7, 12, 17, 22, 27, 32 นำค่าข้อมูลคูณด้วย 4
  • ลำดับที่ 3, 8, 13, 18, 23, 28, 33 นำค่าข้อมูลคูณด้วย 5
  • ลำดับที่ 4, 9, 14, 19, 24, 29, 34 นำค่าข้อมูลคูณด้วย 8
  • ลำดับที่ 5,10, 15, 20, 25, 30, 35 นำค่าข้อมูลคูณด้วย 7

กรณีถ้าไม่ต้องคิดให้ซับซ้อนเราก็บอกว่า fix ค่าไปเลยตามเงื่อนไขข้างต้น ก็สามารถจะหาค่าประจำหลักของข้อมูลนำเข้าแต่ละตัวได้ แต่ถ้าจะยืดหยุ่นกว่านั้นก็สามารถมองได้ว่า

  • ลำดับที่ 1, 6, 11, 16, 21, 26, 31 เมื่อ mod ด้วย 5 จะได้ค่ากับ 1
  • ลำดับที่ 2, 7, 12, 17, 22, 27, 32 เมื่อ mod ด้วย 5 จะได้ค่ากับ 2
  • ลำดับที่ 3, 8, 13, 18, 23, 28, 33 เมื่อ mod ด้วย 5 จะได้ค่ากับ 3
  • ลำดับที่ 4, 9, 14, 19, 24, 29, 34 เมื่อ mod ด้วย 5 จะได้ค่ากับ 4
  • ลำดับที่ 5,10, 15, 20, 25, 30, 35 เมื่อ mod ด้วย 5 จะได้ค่ากับ 0

ดังนั้นเราก็สามารถค่าประจำหลักของข้อมูลนำเข้าได้ดังต่อไปนี้

  • ค่าลำดับที่ mod ด้วย 5 ได้เท่ากับ 1 ให้นำค่าข้อมูลคูณด้วย 6
  • ค่าลำดับที่ mod ด้วย 5 ได้เท่ากับ 2 ให้นำค่าข้อมูลคูณด้วย 4
  • ค่าลำดับที่ mod ด้วย 5 ได้เท่ากับ 3 ให้นำค่าข้อมูลคูณด้วย 5
  • ค่าลำดับที่ mod ด้วย 5 ได้เท่ากับ 4 ให้นำค่าข้อมูลคูณด้วย 8
  • ค่าลำดับที่ mod ด้วย 5 ได้เท่ากับ 0 ให้นำค่าข้อมูลคูณด้วย 7

จากแนวคิดข้างต้นและขั้นตอนวิธีการคำนวณตาม requirement ที่กำหนดให้สามารถเขียนเป็น Oracle Function เพื่อจะคำนวณหาค่าตัวเลขตรวจสอบ (check digit) ได้ดังนี้

    FUNCTION GetPaymentCheckDigit (var_reference_1   IN VARCHAR2,

                                   var_reference_2   IN VARCHAR2,

                                   var_amount        IN VARCHAR2,

                                   var_due_date      IN VARCHAR2)

        RETURN VARCHAR2

    IS

        var_text_concat   VARCHAR2 (50);

        var_total_sum     NUMBER (5);

        var_x             VARCHAR2 (1);

        var_out_result    VARCHAR2 (2);

        var_text_length   NUMBER (2);

    BEGIN

        var_total_sum := 0;

        var_text_concat :=

            var_reference_1 || var_due_date || var_reference_2 || var_amount;

        var_text_length := LENGTH (var_text_concat);

        FOR i IN 1 .. var_text_length

        LOOP

            var_x := TO_NUMBER (SUBSTR (var_text_concat, i, 1));

            CASE

                WHEN MOD (i, 5) = 1

                THEN

                    var_total_sum := var_total_sum + var_x * 6;

                WHEN MOD (i, 5) = 2

                THEN

                    var_total_sum := var_total_sum + var_x * 4;

                WHEN MOD (i, 5) = 3

                THEN

                    var_total_sum := var_total_sum + var_x * 5;

                WHEN MOD (i, 5) = 4

                THEN

                    var_total_sum := var_total_sum + var_x * 8;

                WHEN MOD (i, 5) = 0

                THEN

                    var_total_sum := var_total_sum + var_x * 7;

            END CASE;

        END LOOP;

        var_out_result := TRIM (TO_CHAR (MOD (var_total_sum * 3, 100), ’00’));

        RETURN var_out_result;    

END;

หลังจากที่ได้เขียน Oracle Function : GetPaymentCheckDigit ตามเงื่อนไขวิธีการคำนวณเรียบร้อยแล้ว ได้ทำการทดลอง Exec Oracle Function : GetPaymentCheckDigit โดยใช้ข้อมูลทดสอบตามไฟล์ตัวอย่างข้างต้นโดยที่

  • Customer No.1/Ref.1  = 6400000327
  • Due Date (DDMMYY : พ.ศ.)  = 311264
  • Customer No.2/Ref.2  = 649002300013
  • จำนวนเงิน = 0050000
  • ตัวเลขตรวจสอบ (check digit) = 87

ตัวเลขลขตรวจสอบ (check digit) จากไฟล์ตัวอย่างมีค่าเท่ากับ 87 และผลจากการรัน Oracle Function : GetPaymentCheckDigit ผลลัพธ์ที่ได้คือ 87 เท่ากัน

อันนี้เป็นตัวอย่างวิธีหนึ่งในการคำนวณ กรณีเพื่อน ๆ มีวิธีการอย่างอื่นก็สามารถแนะนำหรือนำเสนอกันได้นะคะ หวังว่าโพสนี้จะเป็นประโยชน์ต่อผู้อ่านไม่มากก็น้อยนะคะ แล้วพบกันใหม่ค่ะ

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.