แจกฟรี ASP Script สำหรับการสุ่มหมายเลขบัตรประชาชน

Category »  ASP/ASP.Net
โดย : Webmaster เมื่อ 13/11/2553   เวลา: 17:42
(อ่าน : 5802)/(ตอบ : 4)  ข้อคิดเห็น   |   พิมพ์   |  
ก็ห่างหายจากการเขียนบทความเกี่ยวกับ ASP Script ไปเป็นปีๆเลยทีเดียว ... พอนำออกมาเขียนสักครั้ง ก็ต้องเคาะสนิมออกมาเสียงดังโป๊งกันเลยทีเดียว 55555+ ... รายละเอียดก็ดูตามคอมเมนท์ที่ผมเขียนเอาไว้ที่ Script แล้ว ... แต่ที่สำคัญ คือ บัตรประชาชนที่เราใช้กันอยู่ปัจจุบัน หลักแรกจะไม่มีเลข 0 และ เลข 9 นำหน้าน่ะครับ ... ดังนั้นหลักการ คือ จะต้องสุ่มตัวเลขเฉพาะหลักแรกออกมาก่อน วนรอบจนกว่าผลที่ได้ไม่ใช่เลข 0 หรือ เลข 9 จึงจะไปสุ่มหาเลขตัวที่ 2 - 12 ต่อไป ... สุดท้ายคือการคำนวณหาหลักที่ 13 ซึ่งเป็นหลักตรวจสอบความถูกต้อง (Check Digit) ... (หมายเหตุ: แต่จะมีสักกี่คนที่จะเข้ามาโหลด ASP Script ของผม เพราะส่วนใหญ่เขาใช้ PHP กันทั้งนั้น ... ส่วนตัวผมเอง ก็ยังคงเป็นข้าทาสรับใช้เทคโนโลยีผู้ซื่อสัตย์ของเล็กนิ่ม - Microsoft ต่อไปตลอดกาลนาน)
สามารถทดสอบผ่านเว็บไซต์แห่งนี้ได้เลย ... ที่นี่
ดาวน์โหลดไฟล์ ASP Script การสุ่มหมายเลขบัตรประชาชน
ข้อมูลเพิ่มเติม
แจกฟรี Source Code โปรแกรมการสุ่มหมายเลขบัตรประชาชน (VB6)
Source Code โปรแกรมการตรวจสอบหมายเลขบัตรประชาชน (VB6 + VB.Net)
มาดู Script กันเถอะ ...

<%
' เรียกไปยังฟังค์ชั่นในการสุ่มหมายเลขบัตรประชาชนเลยทันที
Call RandomNumber
%>
<h1>ASP Script การสุ่มหมายเลขบัตรประชาชน - www.g2gnet.com</h1>
<form name="frmRandom" method="post" action="">
<% Response.Write RandomNumber %>  
<input type="submit" name="cmdRandom" id="cmdRandom" 
value="สุ่มหมายเลขบัตรประชาชน" onClick="Call RandomNumber()">
</form>

<%
' ########################################################
Function RandomNumber
' ########################################################
    
    ' เริ่มต้นในการสุ่มตัวเลขก่อน
    Randomize
    
    ' สูตรการสุ่มตัวเลข เมื่อ High = ค่าสูงสุด และ Low = ค่าต่ำสุด
    'RandomNumber = Int((High - Low + 1) * Rnd) + Low
    
    ' ตั้งค่าเป็น False ไว้ก่อน
    blnFlag = False
    
    ' สุ่มเลขจำนวน 12 หลัก โดยที่หลักแรกต้องไม่ใช่ 0 และ 9
    ' เนื่องจากเราใช้การนับเริ่มต้นจาก 1 ไปสิ้นสุดที่ 12 โดยมีค่าเพิ่มขึ้นทีละ 1 เหมาะสมที่จะใช้ For
    For i = 1 To 12
        ' Not False หรือ ไม่จริง ก็คือ เท็จ (หรือเขียน blnFlag = False) ... 
        ' แสดงว่าตอนนี้เรากำลังจะหาตัวเลขหลักแรกอยู่
        If Not blnFlag Then
            ' สุ่มตัวเลขหลักแรก ต้องไม่ให้มีค่าเป็น 0 และ 9 ... นี่คือการทำซ้ำ หรือ Repetitive
            ' ใช้การวนรอบ (Loop) แบบ For จะไม่เหมาะสมสำหรับงานนี้ 
            ' เพราะเราไม่รู้ค่าเริ่มต้น ค่าสิ้นสุด และ ค่าเพิ่ม (หรือลด)
            ' แต่มันก็นำมาใช้ได้เหมือนกันน่ะครับ เพราะมันมีคำสั่งให้ออกจาก Loop ด้วย Exit For อยู่
            Do
                
                ' สุ่มหาตัวเลข 0 - 9 ... หากได้ 0 หรือ 9 ต้องสุ่มตัวเลขใหม่
                RandomNumber = Int((9 + 1) * Rnd)
                
            ' ทำจนกว่าหลักแรกต้องไม่เท่ากับ 0 และ 9 (เงื่อนไขต้องใช้ AND)
            ' เช่น เมื่อ RandomNumber มีค่า = 1
            ' ทำให้ได้เงื่อนไข 1 <> 0 และ 1 <> 9 (True AND True = True) 
            ' เงื่อนไขเป็น "จริง" ให้ออกจาก Loop
            
            ' หรือ เมื่อ RandomNumber มีค่า = 9
            ' ทำให้ได้เงื่อนไข 9 <> 0 และ 9 <> 9 (True AND False = False)
            ' เงื่อนไขเป็น "เท็จ" ให้วน Loop ต่อไป
            Loop Until RandomNumber <> 0 And RandomNumber <> 9
            
            ' หรือ ใช้เงื่อนไข Until แต่กลับกันด้วย Not
            'Loop Until Not RandomNumber = 0 And Not RandomNumber = 9
            
            ' หรือใช้ While แต่เงื่อนไขต้องกลับกันกับแบบ Until และต้องใช้ OR แทนที่
            ' เช่น เมื่อ RandomNumber มีค่า = 1
            ' ทำให้ได้เงื่อนไข 1 = 0 หรือ 1 = 9 (False OR False = False)
            ' เงื่อนไขเป็น "เท็จ" ให้ออกจาก Loop
            
            ' หรือ เมื่อ RandomNumber มีค่า = 9
            ' ทำให้ได้เงื่อนไข 9 = 0 หรือ 9 = 9 (False OR True = True)
            ' เงื่อนไขเป็น "จริง" ให้วน Loop ต่อไป
            'Loop While RandomNumber = 0 Or RandomNumber = 9
            
            ' แจ้งว่าหลักแรกหาตัวเลขที่ไม่ใช่ 0 หรือ 9 เสร็จสมบูรณ์แล้ว 
            ' หลักต่อไปจะได้ไม่ต้องเข้าไป Do Loop อีก
            blnFlag = True
			
            ' Flag ตัวนี้จะเปลี่ยนเป็น False เมื่อหาตัวเลขหลักต่อไป
            blnCheck = True
			
        End If

        ' หาก blnFlag เป็นจริง และ blnCheck เป็นจริง แสดงว่าพึ่งหลุดออกจาก Loop Do While
        If blnFlag And blnCheck Then
            ' จากหลักที่ 2 - 12 ต้องไม่ให้กลับมาในส่วนนี้อีก ให้ลงไปทำที่ Else เลย
            blnCheck = True
        Else
            RandomNumber = RandomNumber & Int((9 + 1) * Rnd)
        End If
		
    Next

    ' ########################################################
    ' เริ่มต้นคำนวณหาค่าผลรวมตัวเลขทั้ง 12 หลักแรกที่ได้ ดังนี้
    ' หาผลรวมตั้งแต่หลักที่ 1 ไปจนถึงหลักที่ 12 (นับจากซ้ายไปขวา)
    ' โดยให้หลักที่ 1 คูณด้วยน้ำหนักประจำหลัก = 13
    ' โดยให้หลักที่ 2 คูณด้วยน้ำหนักประจำหลัก = 12
    ' โดยให้หลักที่ 3 คูณด้วยน้ำหนักประจำหลัก = 11
    ' โดยให้หลักที่ .. คูณด้วยน้ำหนักประจำหลัก = ..
    ' โดยให้หลักที่ 12 คูณด้วยน้ำหนักประจำหลัก = 2
    ' จากนั้นนำผลการคูณของแต่ละหลักมารวมกันเข้าไป

    ' หลักแต่ละหลัก คือ Mid(RandomNumber, Count, 1))
    ' น้ำหนักของแต่ละหลัก คือ (14 - Count) เมื่อ Count เริ่มต้นจาก 1 ไปสิ้นสุดที่ 12
    ' ดังนั้นค่านี้ (14 - Count) จึงเริ่มต้นค่าจาก 13, 12, 11, ..., สิ้นสุดที่ 2 ครับผม
    Sum = 0 ' Clear ค่าผลรวมก่อน (เพื่อความแน่ใจ)
    For Count = 1 To 12
        Sum = Sum + Mid(RandomNumber, Count, 1) * (14 - Count)
    Next

    ' ########################################################
    ' ขั้นตอนนี้ คือ การหาค่า Check Digit หรือ หลักตรวจสอบความถูกต้อง (หลักที่ 13)
    ' นำผลรวมที่ได้ (Sum) มา Mod (การหารเอาเศษ) ด้วย 11 
    ' นั่นคือค่าที่เราจะได้ก็คือ 0, 1, 2, .. , 10 (Sum Mod 11)
    ' จากนั้นให้ลบออกด้วย 11 ก็จะทำให้ได้ค่าตั้งแต่ 1, 2, 3, ... , 11 (11 - (Sum Mod 11))
    ' แล้วให้เลือกตัวขวามือสุดมาหนึ่งตัว ด้วยคำสั่ง Right$ --> Right$(Str(11 - (Sum Mod 11)), 1)
    ' ค่าสุดท้ายนี้ก็คือ หลักที่ 13 หรือ หลักตรวจสอบความถูกต้อง (Check Digit) นั่นเอง
    CheckDigit = Right(11 - (Sum Mod 11), 1)
    ' ########################################################
    
    ' ########################################################
    ' เอาค่ามาจัดเรียงเพื่อนำไปใช้ในการสมัครเล่นเกมส์ต่อไป ... 55555+
    '
    RandomNumber = RandomNumber & CheckDigit
    '
    ' ########################################################

End Function
%>

Conclusion:
เรียกได้ว่า VB มันจะมาคู่กันกับ ASP เลยก็ว่าได้ แล้วยิ่งผสมผสานกับการอ่าน Tag ของ HTML ได้ด้วย (ก็ทำเว็บได้นั่นแหละครับ) ก็ยิ่งจะทำให้เข้าใจใน ASP Script ได้อย่างไม่ยากนัก ... สำหรับ ASP Script ที่ใช้งานนี้ (RandomNumber) มันไม่ได้เปลี่ยนไปจากเดิมของ VB6 เลย ... แต่ที่สำคัญมากที่สุดเห็นจะเป็นเรื่องของ Algorithm ซ่ะมากกว่า เพราะมันก็ไม่ได้เปลี่ยนแปลงไปตามภาษา หรือ เครื่องมือที่ใช้งานเลยครับ ... พี่น้อง

ร่วมแสดงความคิดเห็น

[ความเห็นที่:  1] จากคุณ : dos_network เมื่อ 15/11/2553 10:23:57  IP: 118.175.90.37

มีผมคนนึงค้าบบบ ที่นิยมชมชอบ ASP ก็ได้แต่ศึกษาค้นคว้าด้วยตนเอง

[ความเห็นที่:  2] จากคุณ : Mr.Den เมื่อ 16/11/2553 11:47:24  IP: 58.9.63.15

ผมยังไม่รู้ว่าจะเริ่ม ที่ตัวไหนดี  VB6ก็งูงูปลาปลา ตัวอื่นไม่รู้เรื่องเลย..แฮะแฮะ
แน่นอนคงต้องเป็น ASPเท่านั้น เพราะมี 'G2GNet' เป็นที่พึ่ง 5555++..
(โหลดเก็บไว้คืกษาแล้ว)
 
ขอบคุณมากคร๊าบบ..อาจารย์

[ความเห็นที่:  3] จากคุณ : jirata เมื่อ 1/12/2553 11:11:56  IP: 202.142.199.92

เคยเจอเหมือนกันกับวิธีการตรวจสอบหมายเลขบัตรประชาชน

ก็แอบสงสัยตั้งนานว่าเค้ารู้ได้ไงว่าอันใหนหมายเลขจริง 55+

//ไม่ได้หายไปใหนแคแอบมาอ่านเฉย ๆ นะป๋าทองก้อน

[ความเห็นที่:  4] จากคุณ : por เมื่อ 7/5/2555 13:05:48  IP: 223.207.202.35

อยากได้โปรแกรมที่ทายเลขบัตร 9ตัวหน้าอะครับผมรู้แค่ 4ตัวหลัง ครับ ผมอยากได้มาใช้และศึกษาดูอะครับ ใครมีบอกด้วยนะครับ ด่วนเลยครับ ขอบคุณมากครับ