فروم تخصصی - پشتیبانی CPSD
تابع Switch - نسخه‌ی قابل چاپ

+- فروم تخصصی - پشتیبانی CPSD (http://cpsd.ir/forum)
+-- انجمن: آموزش (/forumdisplay.php?fid=9)
+--- انجمن: عمومی (/forumdisplay.php?fid=21)
+---- انجمن: توابع داخلی اکسس (/forumdisplay.php?fid=30)
+---- موضوع: تابع Switch (/showthread.php?tid=66)



تابع Switch - CPSD Admin - ۲۸ ارديبهشت ۱۳۹۰ ۱۰:۰۰ عصر

ضمن سلام

در این قسمت به بررسی یکی از توابعی می پردازیم که متاسفانه در اکثر موارد جایگاهی مناسب در حل مشکلات پیدا نکرده , که این می تواند تا حدودی ناشی از عدم اطلاع از کاربرد این تابع داشته باشد

قبل از شروع نگاهی کوتاه به دو ساختار تصمیم گیری می اندازیم

ساختارهای تصمیم گیری به آن قسمت از الگوریتمها اطلاق میشود که , برنامه با توجه به شرایط و قوانین برقرار شده , قادر به ارسال خروجی مناسب میباشد

دو الگوی بسیار کاربردی در این زمینه دستور IF و Select Case میباشند

این دو الگو قادر هستند ضمن بررسی و پذیرش شروطی که توسط برنامه نویس اعمال میشوند , اقدام به تغییر روال اجرایی و محاسباتی برنامه نموده و با توجه به محقق شدن / نشدن شرط , خروجیهای متفاوت را به نمایش گذارند

معادل دستور IF در بخش توابع داخلی اکسس با تابع IIF سنجیده میشود ( در حال حاضر قصد بررسی این تابع را نداریم )

ولیکن این سئوال مطرح میشود که آیا معادل دستور Select Case نیز در بخش توابع داخلی اکسس وجود دارد ؟

در پاسخ باید گفت : بله

تابع Switch قادر است این الگوریتم را با درصد انطباقی بسیار بالا و به سادگی شبیه سازی نماید

حال چرا استفاده از این تابع توصیه میشود ؟

تابع Switch بر خلاف تابع IIF ( که متاسفانه اکثراً از سوی کاربران همین تابع نیز مورد استفاده قرار میگیرد ) , تنها اقدام به بررسی شروط در حالتی مینماید که مقدار برگشتی TRUE باشد

به شکل کلی دستور IIF نگاهی بیندازیم :

کد:
IIf(expr, truepart, falsepart)

expr در واقع بخشی بوده که شما اقدام به درج شرط می نمایید , در صورتی که شرط محقق شود ( TRUE باشد ) بخش truepart و در صورتی که شرط ناصحیح باشد , بخش falsepart اجرا میشود

نکته ای که مبهم میباشد این است که چرا حتی در صورت صحیح بودن عبارت اولیه , بخش دوم و یا همان falsepart نیز مورد بررسی قرار میگیرد !

یکی از دلال کند بودن تابع IIF بررسی دوباره شرط میباشد , امری که منجر به کندی مشهود این تابع میگردد .

در مقابل این رویه , تابع Switch با ساختار زیر قرار دارد :

کد:
Switch(expr1, value1 [, expr2, value2 ] … [, exprn, valuen ] )

در این حالت ورودی از سمت چپ به راست مورد بررسی قرار گرفته و در صورت تطابق شرط / expr , مقدار معادل ( Value ) بر روی خروجی بازگردانده میشود

تنها امری که میتواند باعث شود تابع Switch اقدام به بررسی کلیه عبارتها نماید , عدم تطابق هیچ یک از عبارتها با شروط مورد نظر میباشد

به بیانی دیگر تابع Switch به محض برخورد با اولین عبارتی که مقدار TRUE را باز گرداند معادل آن را در بخش Value بر روی خروجی صادر خواهد نمود

مزایای تابع Switch بر تابع IIf میتواند در موارد زیر خلاصه گردد :

- ساختار نوشتاری بسیار واضح تر و منطقی تر
- محدودیت هفت لایه داخلی که بر روی تابع IIf سایه انداخته است , در این تابع وجود ندارد
- سرعت بالاتر در هنگام اجرا


به مثال زیر توجه نمایید :

کد:
Switch(Left([CustomerID],1)="A","A Level",Left([CustomerID],1)="B","B Level",Left([CustomerID],1)<>"A" Or Left([CustomerID],1)<>"B","C Level")

در مثال فوق , تابع اقدام به جداسازی اولیه حرف سمت چپ فیلد CustomerID می نماید , در صورتی که برابر با A باشد , مقدار A Level , در صورتی که برابر با B باشد مقدار B Level و در صورتی که برابر با هیچ یک از این دو نباشد مقدار C Level را بر روی خروجی ارسال مینماید

استفاده ار این تابع در بسیاری موارد به جایگزینی تابع IIf توصیه میشود

IIf مخفف immediate if و یا همان if فوری میباشد , ولی متاسفانه تنها در نوشتار اولیه رنگ و بویی از فوریت برده است و نه در اجرا !

موفق باشید