السلام عليكم ورحمة الله وبركاته
اليوم أقدم لكم الدالة المعرفة AlsaqrIDTest لاختبار صحة الرقم القومى
طبقا للتالى
أولا الرقم القومى 14 رقم.... تمام قول تمام
مثال الرقم التالى
2 95 02 29 33 0027 7
والرقم دا خطا وهنعرف ليه دلوقتى بإذن الله
نتعرف سوا كدا على معنى الرقم دا
الرقم الأول وهو 2 يدل على القرن وهو القرن الـ 20
بمعنى ان من سنة 1900 حتى سنة 1999 هيكون رقم 2
وكل ما يزيد رقم يزيد قرن يعنى من 2000 حتى 2099 هيكون رقم 3
الرقم الثانى والثالث وهما 95 يدلان على السنة أى سنة 95
والقرن ال 19 وسنة 95 بمعنى سنة 1995 ميلادية
الرقم الرابع والخامس وهما 02 يدلان على الشهر أى الشهر 2 (فبراير)
الرقم السادس والسابع وهما 29 يدلان على اليوم أى اليوم 29 من شهر فبراير
الرقم الثامن والتاسع وهما 33 يدلان على كود المحافظة وكود 33 يعود لمحافظة مطروح.
وفى حالة كان الشخص مولوداً خارج مصر فيكون الرقم 88
من الرقم العاشر حتى الثالث عشر وهما 0027 يدلون على الجنسية (ذكر أم انثى) وهو رقم عشوائى
وهنا الرقم 7 الثالث عشر أى رقم فردى بمعنى هذا الرقم يعود لذكر وان كان رقم زوجى فيعود لانثى
الرقم الأربعة عشر والأخير وهذا الرقم وضعته وزارة الداخلية للتحقق من صحة الرقم القومى
وأن البطاقة ليست مزورة، ويختلف الرقم من بطاقة لأخرى بين الرقم 1و9.
طيب أنا قولت ان الرقم دا خطا ليه، لان فى سنة 1995 فى شهر فبراير كان 28 يوم بس وهنا اليوم 29
ومن هنا تأتى فكرة عمل الدالة المعرفة AlsaqrIDTest
عملها يقتضى بفحص القرن إذا كان 2 أو 3 وهو المتاح فى الوقت الحالى
لو عايز تزود عن 3 دا المفروض بعد قرن اللى يعيش بقى هقول على الجزء اللى تغيره فى الكود لذلك
وفحص صحة صياغة السنة والشهر واليوم
وفحص صحة كود المحافظة
والأربع أرقام بعد ذلك فهى عشوائية فيتم فحص الأرقام فقط
أما الرقم الأخير وهو الرقم الرقابى التى وضعته الوزارة
لو أعلم المنطق الخاص بذلك الرقم لوضعت شرط خاص به
لكن للأسف الوزارة لم تصرح بهذا الأمر
والآن كود الدالة المستخدم هو
CODE
Function AlsaqrIDTest(Num As String) As Boolean
Dim regEx As Object
Dim Y!, M%, D%, check As Boolean
Set regEx = CreateObject("VBScript.RegExp")
regEx.Pattern = "^[23]d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[01])(0[1-6]|[1-2][1-9]|3[1-5]|88)d{4}[1-9]$"
If regEx.test(Num) Then
Y = Mid(Num, 2, 2) / 4
M = Mid(Num, 4, 2)
D = Mid(Num, 6, 2)
check = IIf((Y = Int(Y) And M = "02" And D > 29) Or (Y <> Int(Y) And M = "02" And D > 28) Or (IsNumeric(Application.Match(M, Array("04", "06", "09", "11"), 0)) And D = 31), False, True)
AlsaqrIDTest = check
Else: AlsaqrIDTest = False: End If
End Function
تم تعديل الكود لإضافة كود المحافظة 05 و 06 لمحافظة حلوان والسادس من اكتوبر بعد تنبيهى من أحد الأعضاء وجزاه الله خيرا
لمن يريد أن يشمل التحقق لأكثر من 3 فى الخانة الأولى الخاصة بالقرن قم بتغيير الرقم 3 الموجود فى أول الجملة بعد ^[2 بهذا السطر
CODE
regEx.Pattern = "^[23]d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[01])(0[1-6]|[1-2][1-9]|3[1-5]|88)d{4}[1-9]$"
واكتب مكانه -4 ليتم التحقق حتى 4 أو 5 ليتم التحقق حتى 5 وهكذا كالتالى
CODE
^[2-4]
لتحميل ملف العمل وكود الدالة من هنا
الدالة من اعداد الأستاذ ياسر خليل بالتعاون مع اسلام عبدالله
الملف يحتوى جدول تحليل الرقم القومى وقائمة بأكواد المحافظات