اذهب الي المحتوي
أوفيسنا

فحص المدخلات والمتغيرات


AbuuAhmed

الردود الموصى بها

من الجيد الاحتراز بفحص المدخلات والمتغيرات ولكن نحتاج أن نوظفها التوظيف الصحيح وأن نختصرها أحيانا لتقليل كتابتها في الإجراءات والدوال.

فمثلا يمكن اختصار فحص الحقول/الصناديق التي قد تحتوي على قيمة Null كالتالي:
 

من:
IsNull([txtBox]) Or [txtBox] = "" Or Len([txtBox]) = 0
إلى:
Trim(Nz([txtBox],"")) = ""

أما استخدام Empty و Missing فتحتاج إلى عناية أكبر في معرفتها ومتى استخدامها، وهنا إجراء لفحص هذين النوعين كالتالي:
 

Sub EmptyAndMissing(A As Byte, Optional D As String, Optional E As Variant)
    Dim B, C
    
   'B not used
    C = 5
    
    Debug.Print "IsEmpty", IsEmpty(B), IsEmpty(C), IsEmpty(D), IsEmpty(E)
    Debug.Print "IsMissing", IsMissing(B), IsMissing(C), IsMissing(D), IsMissing(E)
    Debug.Print "-------------------------------------------------------------"
End Sub

وهذا اجراء لمناداة الإجراء أعلاه:
Sub EmptyAndMissingTest()
    Debug.Print , "B", "C", "D(Op)", "E(Op)"
    Debug.Print "-------------------------------------------------------------"
    
    Debug.Print "EmptyAndMissing(5):"
    Call EmptyAndMissing(5)
    
    Debug.Print "EmptyAndMissing(5, '5'):"
    Call EmptyAndMissing(5, "5")
    
    Debug.Print "EmptyAndMissing(5, , 5):"
    Call EmptyAndMissing(5, , 5)
End Sub


وهذه نتائج الاختبار:
              B             C             D(Op)         E(Op)
-------------------------------------------------------------
EmptyAndMissing(5):
IsEmpty       True          False         False         False
IsMissing     False         False         False         True
-------------------------------------------------------------
EmptyAndMissing(5, '5'):
IsEmpty       True          False         False         False
IsMissing     False         False         False         True
-------------------------------------------------------------
EmptyAndMissing(5, , 5):
IsEmpty       True          False         False         False
IsMissing     False         False         False         False
-------------------------------------------------------------

موفقين.

  • Like 1
رابط هذا التعليق
شارك

شكرا لك على التوضيح أستاذنا أبو أحمد 🙂 

وأعتقد أننا نحتاج منك لتحليل للنتائج الأخيرة للمفاضلة بين الطرق التي ذكرتها 🙂 

---------------------------

وفي ذات الموضوع .. وجدت في أحد المواقع دالة اسمها IsBlank وظيفتها فحص وجود البيانات من عدمه لجميع الأنواع، وأنا أستخدمها وتعمل معي بكفاءة عالية 🙂  :


'-----------------------------------------------------------------------------
' True if the argument is Nothing, Null, Empty, Missing or an empty string .
'-----------------------------------------------------------------------------
Public Function IsBlank(arg As Variant) As Boolean
    Select Case VarType(arg)
        Case vbEmpty
            IsBlank = True
        Case vbNull
            IsBlank = True
        Case vbString
            IsBlank = (LenB(arg) = 0)
        Case vbObject
            IsBlank = (arg Is Nothing)
        Case Else
            IsBlank = IsMissing(arg)
    End Select
End Function

وتناديها بهذا الشكل :

IsBlank(Me.UserNameTxt)
  
----------------------------------------مثال آخر 
If IsBlank(Me.CustomerReferenceTxt) Then
   MsgBox "Customer Reference cannot be left blank."
End If

المصدر

تم تعديل بواسطه Moosak
رابط هذا التعليق
شارك

2 ساعات مضت, Moosak said:

وأعتقد أننا نحتاج منك لتحليل للنتائج الأخيرة للمفاضلة بين الطرق التي ذكرتها 🙂 

كتبت رد قبل هذا على أساس أن الدالة التي أتيبت بها Built-in function ، لذلك رأيت أن ردي أبدا غير مناسب 🙂 
الدالة فكرتها ذكية وتختصر كتابة دوال الفحص ، ولكن لم أقم بتجربتها حتى الآن ، والإسم مشابه لدالة الإكسل حتى أني اعتقدت أنها تابعة لنسخة vba التابعة للإكسل.

الليلة إن شاء الله أقوم بتجربتها وأرجع لكم.

تم تعديل بواسطه AbuuAhmed
رابط هذا التعليق
شارك

9 ساعات مضت, Moosak said:

وأعتقد أننا نحتاج منك لتحليل للنتائج الأخيرة للمفاضلة بين الطرق التي ذكرتها 🙂

لقد قمت باختبار الدالة بشكل مكثف ولم تخفق في كل محاولاتي ، وهي دالة أوصي بها بشدة وخصوصا أنها تحمي "الجميع الخبراء قبل المبتدئين" ولا تحتاج لمستخدمها من التعمق في معرفة كل أنواع دوال الفحص ودهاليزها.

لقد قمت بإضافتها إلى موديول أدواتي لبرامجي وهي الثانية على ما أتذكر بعد إجراء mySendKeys.

فقط ملاحظة واحدة، في الدالة تم استخدام دالة LenB بدلا من Len ولم أعرف هدف المبرمج فالأولى تعد الحروف والثانية تعد مساحة تخزينها بالبايت!.

رابط هذا التعليق
شارك

21 ساعات مضت, AbuuAhmed said:
من:
IsNull([txtBox]) Or [txtBox] = "" Or Len([txtBox]) = 0
إلى:
Trim(Nz([txtBox],"")) = ""

عمل جميل للتحقيق ،

ولكن فعليا ، ما الدالة اللي وصلنا لها لعملنا اليومي ؟

 

انا استعمل

بدل
if IsNull([txtBox]) Or [txtBox] = "" Or Len([txtBox]) = 0

استعمل
if Len([txtBox] & "") = 0

 

جعفر

رابط هذا التعليق
شارك

40 دقائق مضت, jjafferr said:

ولكن فعليا ، ما الدالة اللي وصلنا لها لعملنا اليومي ؟

عزيزي ، من له حيلة فليحتال 🙂 
سبق إني كتبت أن الفيجوال به "تساهل" كبير ، فقد يعتبرها البعض عيوبا وقد يعتبرها آخرون ميزة ومرونة وسهولة للمبرمجين.
أنت في استعمالك تجمع قيمة نصية مع قيمة Null ، منطقيا فيها تعارض ولن تمررها لك كثير من اللغات ، ولكنها حل بديل لدالة Nz.
يبقى مسألة الفراغات السابقة واللاحقة للنص فإذا أردت التخلص منها فتحتاج إلى استعمال دالة Trim أما إذا أردت التعامل معا وإبقاءها كجزء من النص فما تقوم به فيه الكفاية.
بالنسبة لي سأستعمل دالة IsBlank قي برامجي الخاصة ، ولكن في الأمثلة للمنتدى فربما لا حتى لا أضطر أن أحمل معي موديول الأدوات.

 

تم تعديل بواسطه AbuuAhmed
  • Like 1
رابط هذا التعليق
شارك

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information