سؤال

لدي تطبيق ASP كلاسيكي كبير يجب علي صيانته، وأجد نفسي محبطًا بشكل متكرر بسبب الافتقار إلى القدرة على تقييم الدائرة القصيرة.على سبيل المثال، لن يسمح لك VBScript بالإفلات من العقاب:

if not isNull(Rs("myField")) and Rs("myField") <> 0 then
...

...لأنه إذا كانت قيمة Rs("myField") فارغة، فستحصل على خطأ في الشرط الثاني، مقارنة القيمة null بالصفر.لذلك عادةً ما سأنتهي من القيام بذلك بدلاً من ذلك:

dim myField
if isNull(Rs("myField")) then 
    myField = 0
else
    myField = Rs("myField")
end if

if myField <> 0 then
...

من الواضح أن الإسهاب مروع للغاية.بالنظر إلى قاعدة الأكواد الكبيرة هذه، فإن أفضل حل بديل وجدته هو استخدام وظيفة كتبها المبرمج الأصلي، تسمى TernaryOp، والتي تعمل بشكل أساسي على تطعيم وظائف تشبه المشغل الثلاثي، لكنني ما زلت عالقًا في استخدام متغير مؤقت لن يفعل ذلك يكون ضروريًا بلغة أكثر اكتمالاً.هل هناك طريقة أفضل؟هل توجد طريقة فائقة السرية لوجود دائرة قصر في VBScript؟

هل كانت مفيدة؟

المحلول

ربما ليست الطريقة الأفضل، لكنها بالتأكيد تعمل..وأيضًا، إذا كنت تستخدم الإصدار vb6 أو ‎.net، فمن الممكن أن يكون لديك طرق مختلفة للتحويل إلى النوع المناسب أيضًا.

if cint( getVal( rs("blah"), "" ) )<> 0 then
  'do something
end if


function getVal( v, replacementVal )
  if v is nothing then
    getVal = replacementVal
  else
    getVal = v
  end if
end function

نصائح أخرى

IFs المتداخلة (أقل تفصيلاً قليلاً):

if not isNull(Rs("myField")) Then
   if Rs("myField") <> 0 then

لقد استخدمت دائمًا عبارات Select Case لمنطق الدائرة القصيرة في VB.شيء مثل..

Select Case True

Case isNull(Rs("myField"))

    myField = 0

Case (Rs("myField") <> 0)

    myField = Rs("myField")

Case Else

    myField = -1        

End Select

قد يكون بناء الجملة الخاص بي معطلاً، منذ فترة.إذا ظهرت الحالة الأولى، فسيتم تجاهل كل شيء آخر.

أو ربما حصلت على نهاية خاطئة للسؤال.هل تقصد شيئا مثل iIf() في لغة البرمجة VB؟هذا يعمل بالنسبة لي:

myField = returnIf(isNothing(rs("myField")), 0, rs("myField"))

أين returnIf() هي وظيفة مثل ذلك:

function returnIf(uExpression, uTrue, uFalse)
    if (uExpression = true) then returnIf = uTrue else returnIf = uFalse : end if
end function

إذا كتبته على شكل اثنين مضمنة IF البيانات، يمكنك تحقيق ماس كهربائى:

if not isNull(Rs("myField")) then if Rs("myField") <> 0 then ...

ولكن لديك then يجب أن يظهر الإجراء على نفس السطر أيضًا.إذا كنت بحاجة إلى بيانات متعددة بعد then, ، يمكنك فصلهم مع : أو انقل الرمز الخاص بك إلى روتين فرعي يمكنك الاتصال به.على سبيل المثال:

if not isNull(Rs("myField")) then if Rs("myField") <> 0 then x = 1 : y = 2

أو

if not isNull(Rs("myField")) then if Rs("myField") <> 0 then DoSomething(Rs("myField"))

ليت ذلك كان موجودًا يا صديقي -- TernaryOp هو أملك الوحيد.

نعم، هذا ليس الحل الأفضل ولكن ما نستخدمه هو شيء من هذا القبيل

function ReplaceNull(s)
    if IsNull(s) or s = "" then
        ReplaceNull = "&nbsp;"
    else
        ReplaceNull = s
    end if
end function

يتبادر إلى الذهن خياران:

1) الاستخدام len() أو lenb() لاكتشاف ما إذا كان هناك أي بيانات في المتغير:

if not lenb(rs("myField"))=0 then...

2) استخدم دالة تُرجع قيمة منطقية:

if not isNothing(rs("myField")) then...

أين isNothing() هي وظيفة مثل ذلك:

function isNothing(vInput)
    isNothing = false : vInput = trim(vInput)
    if vartype(vInput)=0 or isEmpty(vInput) or isNull(vInput) or lenb(vInput)=0 then isNothing = true : end if 
end function

قد تكون قادرا على استخدام فقط Else للقبض على القيم الخالية، ""s، وما إلى ذلك.

If UCase(Rs("myField")) = "THING" then
  'Do Things
elseif UCase(Rs("myField")) = "STUFF" then
  'Do Other Stuff
else
  'Invalid data, such as a NULL, "", etc.
  'Throw an error, do nothing, or default action
End If

لقد اختبرت هذا في الكود الخاص بي وهو يعمل حاليًا.قد لا يكون مناسبًا لحالة الجميع بالرغم من ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top