چطور کد ملی تقلبی از واقعی را در اکسس تشخیص دهیم ؟
سلام به یکی دیگر از آموزش های نرم افزار اکسس در سایت سافت پلاس خوش آمدید . امروز می خواهیم راجع به موضوعی تحت عنوان اعتبار سنجی کد ملی در اکسس با هم صحبت کنیم .
اما قضیه از چه قرار است ؟
فرض کن که فرمی را در اکسس طراحی کرده و آن را در اختیار کاربر قرار داده ای . کاری که این فرم قرار است انجام دهد این است از کاربر یک سری از اطلاعات را دریافت کند .
این اطلاعات شامل نام و نام خانوادگی کاربر ، کد ملی ، شماره همراه و یا هر اطلاعات دیگری از این دست باشد . طراحی این فرم یک روی سکه است اما روی دیگر سکه از این هم مهمتر است
روی دیگر سکه چیست ؟
کاربران همانطور که می توانند اطلاعات را به طور کامل و دقیق در اختیار برنامه شما قرار دهند به همان اندازه هم می توانند اطلاعات مورد نظر را بصورت نادرست وارد برنامه شما کنند .
همین مثال کد ملی را در نظر بگیر.
کد ملی یک فرمت استاندارد دارد .
– یعنی همیشه شامل ده رقم است .
– هیچ وقت حروف در ساختار آن استفاده نمی شود .
– امکان ندارد که تمامی رقم های کد ملی یکی باشند . مثلا ما کد ملی به صورت ۵۵۵۵۵۵۵۵۵۵ یا ۸۸۸۸۸۸۸۸۸۸ نداریم .
– در کنار همه اینها خود کد ملی هم از یک منطق خاصی پیروی می کند . یعنی قرار نیست ما ۱۰ رقم متفاوت را پشت سر هم قطار کرده و از آن به عنوان کد ملی استفاده کنیم .
خُب حالا فرم شما قرار است که در داخل یکی از فیلدهایش کد ملی را از کاربر بگیرد . حالا چطور باید مطمئن شوی که کاربر کد ملی خود را بطور دقیق و کاملا صحیح وارد می کند ؟.
پاسخ به این سوال ساده است .
برای اینکه خیالت را راحت کنی که کاربر کد ملی خود را بطور صحیح وارد می کند باید به سراغ استفاده از قابلیت Vaidation Rule یا همان اعتبار سنجی در اکسس بروی .
اعتبار سنجی کد ملی در اکسس دقیقا همان کاری است که در این آموزش می خواهیم مفصل راجع به آن با هم صحبت کنیم .
اگر تا انتهای این آموزش همراه من باشی یاد خواهی گرفت که چطور مطمئن شوی که کاربری که دارد از برنامه شما استفاده می کند :
– حتما فیلد مربوط به کد ملی را پر کند .
– حتما تعداد ۱۰ رقم را برای کد ملی وارد کند .
– به هیچ وجه قادر به استفاده از حروف در فیلد کد ملی نباشد .
– کد ملی وارد شده شامل ۱۰ رقم شبیه به هم نباشد .
– کد ملی وارد شده از منطق تعریف شده و استاندارد استفاده کند .
پس از شما دعوت می کنم که تا انتهای این آموزش من را همراهی کنید.
قانون اول در اعتبار سنجی کد ملی توسط اکسس : خالی ماندن فیلد ممنوع
قبلا گفتیم که برای فیلد مربوط به کد ملی باید یک سری قوانین را تعریف کنی . بسیار خوب . این اولین قانونی است که باید آن را برای اکسس تعریف کنی . اینکه به هیچ عنوان کاربر نباید فیلد مربوط به کد ملی را خالی بگذارد .
برای این کار باید با اکسس صحبت کنی و به او بگویی که وقتی کاربر وارد تکس باکس مربوط به کد ملی شد ولی
بدون اینکه اطلاعاتی را در آن وارد کند از آن خارج شد به محض خروج از تکس باکس مربوط به کد ملی یک چیز را کنترل کند .
آن یک چیز این است : آیا کاربر اطلاعاتی را در تکس باکس مربوط به کد ملی وارد کرده است یا نه ؟
اگر کاربر تکس باکس مربوط به کد ملی را خالی گذاشت آن وقت به اکسس می گویی که :
– اول یک کادر پیغام را به کاربر نمایش بده و به کاربر گوشزد کن که حتما باید فیلد کد ملی را پر کند .
– دوم بعد از اینکه کاربر بر روی دکمه موجود در کادر پیغام کلیک کرد بلافاصله فیلد یا تکس باکس مربوط به کد ملی
را به رنگ زرد در بیاور . اینطوری کاربر دقیقا می داند که در کجای فرم دچار خطا شده است .
اما از خودت بپرسی چطور باید از اکسس خواست که همه این کارها را انجام دهد ؟
خیلی ساده است باید به سراغ کدنویسی و برنامه نویسی وی بی ای رفته و همه اینها را در قالب کدهای VBA برای اکسس ترجمه کنی.
در ادامه می خواهیم همین کار را با هم پیش ببریم .
بهتر است تا به همین جا یک نگاهی به کدهایی که نوشتیم بیندازیم و چند نکته را با هم بررسی کنیم :
۱- نکته اول مربوط به خط بالای این کدهاست . جایی که عبارت cmd_gonext درج شده است .
شاید از خودت سوال کنی که این دیگر چیست ؟
در پاسخ به این سوال باید بگویم که که cmd_gonext در واقع اسم همان دکمه ای است که در عکس شماره ۱ با عنوان ” بعدی ” در داخل فرم ما قرار دارد .
اتفاقی که قرار است بیفتد این است:
” کاربر اطلاعات مربوط به تکس باکس های موجود بر روی فرم را تکمیل می کند و بر روی دکمه” بعدی “
کلیک می کند تا به سراغ وارد کردن اطلاعات برای فرد بعدی شود “
اما ما از اکسس خواسته ایم که به محض اینکه کاربر بر روی این دکمه کلیک کرد ، به سراغ کدهایی برود که برایش نوشته ایم . اما ما با استفاده از این کدها چه چیزی را اکسس می خواهیم ؟
در قدم اول از اکسس خواسته ایم که کنترل کند که آیا کاربر در فیلد مربوط به کد ملی اطلاعاتی را وارد کرده است یا اینکه این فیلد را بطور کلی خالی گداشته است .؟
اگر که این فیلد خالی بود آن وقت از برنامه می خواهیم که به کاربر یک کادر پیغام یا مسیج باکس را نمایش داده و پیغامی را که برایش تعریف کرده ایم را به کاربر نمایش دهد .
اگر به تصویر زیر دقت کنی می توانی یک خروجی از آن چیزی که تا به اینجا با هم برای آن کد نویسی کرده ایم را ببینی
خب تا به اینجای کار همه چیز به خوبی پیش می رود . اما این تازه شروع کار ما است . باز هم در ادامه می خواهیم کدهای خود را تکمیل تر کنیم.
در ادامه برای اینکه کاربر را بهتر متوجه اشتباهش کنیم ، از اکسس می خواهیم که رنگ پس زمینه تکس باکس مربوط به کد ملی را برای کاربر به رنگ زرد دربیاورد .
خب برای این کار کافی است که در ادامه کدهای قبلی این یک خط کد را اضافه کنیم . .
قانون دوم : متن بی متن
برای کد ملی و استفاده از آن یک قانون خیلی مهم دیگر هم وجود دارد و آن هم این است که به هیچ وجه نباید در ساختار کد ملی از متن ها و یا حتی یک حرف استفاده شود .
این یعنی به هم ریختن همه چیز و باید به نحوی از این کار ممانعت بعمل آوری . یعنی باید کاری کنی که اکسس به هیچ وجه به کاربر این اجازه را ندهد که بخواهد در ساختار مربوط به کد ملی خود حرف و یا حروفی را وارد کند .
خب برای این مورد هم باید به سراغ کدهای وی بی ای بروی .
مثلا می توانی از این کدها استفاده کنی .
Select Case Me.txt_mellicod
Case Is = "0000000000" Or "1111111111" Or "2222222222" Or "3333333333" Or "4444444444" _
or "5555555555" or "6666666666" or "7777777777" or "8888888888" or "9999999999"
MsgBox "کد ملی نمی تواند شامل ارقام شبیه به هم باشد "
End Select
در اینجا ما از تابع Isnumeric استفاده کرده ایم . در واقع از اکسس خواسته ایم که اگر مقداری که در تکس باکس مربوط به کد ملی توسط کاربر وارد می شود از نوع عددی نبود بلافاصله پیغام مورد نظر را برای کاربر نمایش دهد .
به این ترتیب و با استفاده از همین دو خط کد ساده به راحتی می توانی مطمئن شوی که کاربر قادر به وارد کردن و استفاد از متن و یا حروف در فیلد مربوط به کد ملی نخواهد بود
قانون سوم : فقط ۱۰ رقم ، نه کمتر و نه بیشتر
سومین قانونی که در مورد کد ملی باید حتما آن را در نظر بگیری این است که کد ملی هر فرد فقط و فقط شامل ۱۰ رقم است . نه یک رقم کمتر و نه یک رقم بیشتر .
پس باید به نحوی از اکسس بخواهی که کارهایی را که در زیر به آنها اشاره شده است را برایت انجام دهد .
- تعداد ارقام مربوط به کد ملی وارد شده را کنترل کند.
- اگر تعداد ارقام کد ملی کمتر یا بیشتر از ۱۰ رقم بود یک پیغام به کاربر بدهد .
- در صورت بروز خطا مانع از ادامه کار کاربر شود .
در ادامه با هم باید این کارها را در قالب کدهای وی بی ای برای اکسس ترجمه کنیم . برای این منظور می توانیم از کدهای زیر استفاده کنیم :
console.log( 'Code is Poetry' );
در خط اول از این کدها کاری را که قرار است این قطعه از کد برای ما انجام دهد را در قالب یک کامنت نوشته ایم .
خط سوم از این کدها ترجمه همان کامنت در قالب کدهای VBA است .
اگر تعداد ارقام کد ملی برابر با ۱۰ رقم نباشد خط شماره ۵ از این کدها اجرا شده و یک کادر پیغام برای کاربر نمایش داده می شود .
در اینجا برنامه برای شمارش تعداد ارقام وارد شده در تکس باکس مربوط به کد ملی از تابع LEN استفاده می کند .
این تابع یکی از صدها تابعی است که در داخل نرم افزار اکسس قرار دارد . اگر می خواهی بهتر با کارکرد این تابع آشنا شوی می توانی به مطلب زیر مراجعه کنی .
مطلب مرتبط : ۴ تابع کاربردی در اکسس که باید کار با آنها را یاد بگیرید .
در داخل این کادر کاربر متوجه می شود که چند رقم را برای کد ملی وارد کرده و با استفاده از این کادر از وی خواسته می شود که تعداد این ارقام را اصلاح کند .
در زیر می توانید یک نمونه از اجرای این کدها را مشاهده کنید
قانون چهارم: تکرار یک رقم برای ۱۰ بار نداریم
گفتیم که کد ملی برای هر نفر در نهایت ۱۰ رقم خواهد بود . اما فرض کنم که کاربر برای وارد کردن کد ملی ۱۰ بار پشت سر هم عدد ۵ را وارد کند .
خب اینجا برنامه ما از کاربر ایراد نمی گیرد چون برای برنامه تعریف کرده ایم که کاربر باید تعداد ۱۰ رقم را برای کد ملی وارد کند و این کار راهم کرده است .
اما آیا این شکل و شمایل برای کد ملی قابل قبول است ؟
چیزی که تعریف شده است این است که کد ملی هیچ فردی در هیچ جای کشور نمی تواند دارای ۱۰ رقم کاملا شبیه به هم باشد .
پس باید این قضیه را برای اکسس هم تعریف کنیم .
برای این کار می توانیم از کدهای زیر استفاده کنیم .
.
Select Case Me.txt_mellicod
Case Is = "0000000000" Or "1111111111" Or "2222222222" Or "3333333333" Or "4444444444" _
or "5555555555" or "6666666666" or "7777777777" or "8888888888" or "9999999999"
MsgBox "کد ملی نمی تواند شامل ارقام شبیه به هم باشد "
End Select
در این کدها ما از دستور select case استفاده کردیم . با استفاده از کدهای بالا دیگر خیالت از این بابت هم راحت می شود که کاربر قادر به دور زدم برنامه از این طریق هم نیست .
خب تا به اینجای کار یک سری از مقدمات مربوط به کار را انجام دادیم .
از برنامه خواستیم که کنترل کند که به هیچ وجه کاربر تکس باکس مربوط به کد ملی را خالی نگذارد .
دوم اینکه تعداد ارقامی را که برای کد ملی وارد می کند حتما باید برابر با ۱۰ رقم باشد .
این بخش اول از کار است . در بخش دوم می خواهیم به بررسی صحت کد ملی از لحاظ منطق آن بپردازیم .
یعنی چه از لحاظ منطق ؟
خُب مسلما قرار نیست که کاربر هر عدد ۱۰ رقمی را که وارد کند بشود آن را به عنوان کد ملی قبول کرد .
کد ملی تعریف شده برای هر فرد ار یک منطق خاص پیروی می کند .
اول بیایید منطق موجود در کد ملی را یاد بگیریم تا در مرحله بعد به برنامه خود هم یاد بدهیم که چطور این منطق را کنترل کرده تا هر عدد بی معنایی را به عنوان کد ملی قبول نکند .
قانون پنجم : کد ملی هم برای خودش قاعده و قانون دارد
قرار نیست ما هر عدد ۱۰ رقمی را به عنوان کد ملی قبول کنیم . کد ملی برای خودش یک قاعده ای دارد که
بر اساس آن این عدد ده رقمی اعتبار پیدا می کند .
اما این قاعده و قانون چیست ؟
گفتیم که کد ملی ۱۰ رقم دارد . قاعده ای که در کد ملی صدق می کند شامل ۳ قسمت است .
قسمت اول مربوط به ۳ رقم اول از سمت چپ کد ملی است .
این سه رقم مربوط به شهری است که شناسنامه فرد از آن شهر صادر شده است .
چون در یک شهر جمعیت زیادی زندگی میکنند پس سه رقم اول از سمت چپ برای همه افراد ساکن در
این شهر با هم یکی خواهد بود .
قسمت دوم شامل ۶ رقم بعد از آن است . این رقم برای هر فرد کاملا اختصاصی است و فقط متعلق به
خود آن فرد است .
یعنی امکان ندارد که این ۶ رقم برای دو فرد در یک شهر یکسان باشد .
رقم آخر هم یک عدد تک رقمی است که به آن عدد کنترل می گویند .
اما چطوری متوجه شویم که این کد ۱۰ رقمی معتبر هست یا نه .
برای این کار باید از آخرین رقم کد ملی یا همان رقم کنترل استفاده کنیم . این رقم کنترل از طریق یک
محاسبه ساده باید بدست بیاوریم .
اما این کار چه جوری انجام می شود ؟
برای این کار باید چند مرحله ساده زیر را انجام دهیم :
۱- فرض کنید که یک عدد 10 رقمی را به عنوان کد ملی در اختیار ما قرار داده اند و ما می خواهیم صحت
آن را بررسی کنیم .
برای شروع کار رقم های موجود در ساختار کد ملی را از سمت راست شماره گذاری می کنیم . یعنی اولین رقم شماره 1 و به همین ترتیب تا آخرین رقم که در سمت چپ قرار دارد شماره 10 را اختصاص می دهیم .
۲- در این مرحله از سمت راست شروع می کنیم و به غیر از عدد سمت راست یا همان رقم کنترل ؛ هر عدد را در شماره موقعیتی که آن عدد دارد ضرب می کنیم . یعنی چه ؟
بیایید در اینجا همه چیز را با استفاده از یک مثال عملی پیش ببریم .
در تصویر بالا ما یک کد ملی داریم و می خواهیم ببینیم که این عدد ده رقمی را می توان به عنوان یک کد ملی قبول کرد یا نه ؟
اول از سمت راست موقعیت هر یک از ارقام موجود در کد ملی را شماره گذاری می کنیم .
در قدم بعد از موقعیت شماره 2 شروع کرده و هر رقم از کد ملی را در شماره موقعیتی که قرار دارد ضرب کرده و در نهایت حاصل ضرب ها را با هم جمع می کنیم .
مثلا برای کد ملی موجود در تصویر بالا این محاسبات به صورت زیر خواهد بود
2*7+3*0+5*4+9* 5+4*6+7*4+8*9+7*9+10*0=266
همانطور که می بینی حاصل این عبارت عدد 266 خواهد بود .
در مرحله بعد همین عدد 266 را بر عدد 11 تقسیم می کنیم و باقی مانده آن را بدست می آوریم .
=266/11 >>>>> 2
حالا بر مبنای این عدد باقی مانده می توانیم درستی یا نادرستی کد ملی را قضاوت کنیم . به چه صورت ؟
در اینجا دو حالت پیش می آید :
حالت اول این است که عدد حاصل از عبارت بالا برابر و یا کمتر از 2 است . اینجا کار ما راحت است . چون در این صورت رقم آخر کد ملی برابر با همین عدد باقی مانده از این محاسبه است .
اما اگر عدد باقی مانده حاصل از این تقسیم بیشتر از 2 بود آن وقت باید یک محاسبه کوچک دیگر هم انجام بدهیم .
آن هم این است که باید عدد 11 را از عدد مربوط به باقی مانده تقسیم ( که در اینجا حتما باید بیشتر از 2 باشد) را کم کنیم هر عددی که بدست آید همان عدد باید با رقم آخر کد ملی برابر باشد . در غیر اینصورت نتیجه می گیریم که این کد ملی نا معتبر است .
این کل منطقی است که برای بررسی صحت کد ملی باید آن را بررسی کنیم . حالا همین منطق را باید با استفاده برنامه نویسی وی بی ای برای اکسس هم تعریف کنیم .
برای این منظور از کدهای زیر استفاده می کنیم .
Public Function cod_meli(txt As String, ctltxt As Control) As Integer
Dim a As Integer
Dim b As Integer
Dim c As Integer
Dim d As Integer
Dim l As Integer
a = Mid(txt, 10, 1)
b = (Left(txt, 1) * 10) + (Mid(txt, 2, 1) * 9)& cod_meli
+ (Mid(txt, 3, 1) * 8) + (Mid(txt, 4, 1) * 7)& _
cod_meli + (Mid(txt, 5, 1) * 6) + (Mid(txt, 6, 1) * 5) + (Mid(txt, 7, 1) * 4) + (Mid(txt, 8, 1) * 3) + (Mid(txt, 9, 1) * 2)
c = b - (b \ 11) * 11
d = 11 - c
If (c = a And c = 0) Or (c > 1 And a = d) Or (c = 1 And a = 1) Then
cod_meli = 1
Else
cod_meli = 0
MsgBox "کد ملي وارد شده صحيح نمي باشد", vbOKOnly + vbMsgBoxRight + vbInformation, "توجه"
ctltxt.SetFocus
End If
End If
بیایید با هم نگاهی به این کدها انداخته و هر کاری که هر خط از کدها انجام می دهند را بررسی کنیم .
در شروع این روال و در خط های 3 تا 7 ما 5 تا متغیر را تعریف کرده ایم . هر کدام از این متغیرها در طول این روال یک سری از مقادیر را در خود ذخیره می کنند .
کار بررسی کد ملی را از خط شماره 9 شروع می کنیم . در این خط از کدها اول تکست باکسی به اسم txt را به تابعی به نام Mid معرفی کرده ایم .
در قدم بعدی از این تابع می خواهیم که هر عددی را که در این تکس باکس وارد می شود را در نظر گرفته و از سمت چپ 10 رقم از آن را جدا کند .
در قدم بعدی می خواهیم که آخرین رقم از مجموعه این 10 رقم را جدا و آن را در متغیر a ذخیره کند .
این رقم در واقع همان رقم کنترل مربوط به کد ملی است .
پس تا به اینجا ما رقم کنترل مربوط به کد ملی را بدست آروده ایم .
در قدم بعدی به سراغ خط شماره 10 می رویم .
در این خط از کد ما متغیری داریم به اسم b که می خواهیم آن را مدار دهی کنیم .
این مقدار در واقع نتیجه حاصل از محاسباتی است که در چند خط از کدها مشاهده می کنیم .
اما این محاسبات چه هستند .
این محاسبات به این صورت هستند که از سمت چپ هر رقم از کد ملی را در شماره موقعیت همان عدد در ساختار کد ملی ضرب می کند .
یعنی اولین رقم از سمت چپ در ساختار کد ملی در جایگاه شماره 10 قرار دارد بنابراین این خود این عدد در رقم جایگاهش یعنی 10 ضرب می شود .
حالا به سراغ رقم دوم از سمت چپ رفته آن را در عدد 9 که مربوط به جایگاهش است ضرب می کنیم .
این کار را برای سایر رقم های کد ملی هم تکرار می کنیم .
دست آخر هم نتیجه هر کدام از این ضرب ها را با یکدیگر جمع می کنیم تا در انتها یک عدد نهایی را داشته باشیم .
این کار تا خط 14 از این کدها را به خود اختصاص می دهد .
در خط های 15 و 16 محاسبات ساده ای انجام می شود که متوجه شویم آیا باقی مانده حاصل از این محاسبات کمتر از 2 یا بیشتر از 2 است .
در خط های بعدی هم هر دوی این حالت ها را بررسی می کنیم و طبق منطقی که گفتیم به اکسس می گوییم که چه تصمیمی بگیرد .
در نهایت اگر اکسس تشخیص داد که ساختار و منطق این کد ملی درست است پیغام صحیح بودن و در غیر اینصورت به کاربر اخطار داده می شود که کد ملی وارد شده درست نیست و باید آن را اصلاح کند .
این هم از آموزش مربوط به کار با کد ملی و تشخیص تقلبی یا درست بودن کد ملی وارد شده در اکسس
امیدوارم این آموزش براتون کاربردی بوده باشد . خوشحال می شوم نظرات خودتون رو در باره این مطلب برام کامنت کنید .
در ضمن حتما سری هم به پیج اینستاگرام سایت بزنید مطمئنا ضرر نخواهید کرد .
مطالب زیر را حتما مطالعه کنید
ساخت برچسب در اکسس💥چطور آنها را ایجاد و مدیریت کنیم ؟
ریبون ها در اکسس💥از مخفی کردن تا مدیریت کردن آنها
چطوری متن ها و تصاویر را بصورت متحرک در اکسس نمایش بدهیم ؟
فرمت دهی نوشته ها در اکسس | کاربرد + مثالها
۵ ویژگی در فرم های اکسس که کمتر از آنها خبر داشتید .
باز کردن گزارش اکسس برای یک رکورد مشخص + نمونه فایل
دوره های آموزشی مرتبط
2 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام
استاد فرمول کد ملی شما, کد ملیهای صحیح رو هم نادرست می دونه؟ ایراد کار کجاست؟!!
سلام این مطلب مورد بازبینی قرار می گیرد و اگر اشتباهی در کار باشد اصلاح خواهد شد
با تشکر