عنوان:

‫WF:Windows Workflow #۴


نویسنده: محمد جواد تواضعی
تاریخ: ۱۳۹۱/۰۹/۰۵ ۵:۱۵
آدرس: www.dntips.ir
 Flowchart Workflow

در این قسمت به ساخت یک Workflow از طریق Flowchart می‌پردازیم. در Workflow هایی که از طریق Flowchart تعریف می‌شوند٬ فعالیت‌ها به صورت درختی تعریف شده و با هم در ارتباط بوده و ارتباط آنها از طریق درخت‌های تصمیم گیری می‌باشد.
برای استفاده از آن، از قسمت Toolbox ٬ قسمت Flowchart ٬ کنترل Flowchart را به داخل صفحه کشیده، حال می‌توانیم از دیگر کنترل‌ها در درون Flowchart استفاده کنیم.
نکته :  تفاوتی که در Sequence و Flowchart است، در نحوه اجرای فعالیت‌ها می‌باشد. در Sequence فعالیت‌ها همانطور که از بالا به پایین چیده شده است اجرا می‌شوند٬ ولی در Flowchart می‌توان در خواست‌هایی را که جهت اجرای فعالیت‌ها فرستاده می‌شوند، کنترل کرد.

FlowDecision
این کنترل برای مشخص کردن یک شرط می‌باشد و بر اساس این شرط٬ این کنترل می‌تواند دو خروجی داشته باشد. یکی در صورت درست بودن شرط و دیگری در صورت غلط بودن. این شرط  هم مانند دستور IF یک خصوصیت شرط دارد که در قسمت Properties آن مشخص می‌شود.


DateTime.Now.Hour==1
اگر به برچسب‌های True و False دقت کنید٬ خروجی‌های کنترل را نشان می‌دهند. این نوشته‌ها ثابت نیستند و می‌توانید با انتخاب کنترل، از قسمت Properties آنها را عوض کنید.
نکته : به عکس بالا دقت کنید. زمانیکه از کنترل خروجی گرفته شده است٬ سمت پیکان‌ها به سمت کنترل WriteLine می‌باشد و این به این معنا می‌باشد که این پیکان از کنترل Decision به سمت پاین کشیده شده است. اگر این کار را بر عکس انجام دهیم دیگر کنترل Decision کنترل WriteLine  را نمی‌شناسد و در صورت درست بودن شرط در خروجی مقداری چاپ نمی‌شود.
در کنترل Flowchart امکان استفاده از کنترل Sequence  وجود دارد و همینطور بالعکس. این امر بستگی به نوع فرآیند شما دارد که چه موقع باید از ساختار ترتیبی استفاده شود و کجا درختی و شاید این امکان وجود داشته باشد که فرآیند مورد نظر ترکیبی از دو باشد.
Flow Switch
زمانیکه از کنترل Decision استفاده می‌کنید٬ محدود می‌شوید به دو مقدار True و False. ولی زمانیکه از کنترل Flow Switch یا Switch استفاده می‌کنید٬ این محدودیت از بین می‌رود و شما می‌توانید n دستور عمل را اجرا کنید. این کنترل دقیقا شبیه دستور Switch Case در #C عمل می‌کند.
نحوه کار کردن آن به این صورت می‌باشد که ابتدا کنترل را انتخاب کرده٬ سپس از قسمت Properties ٬ در قسمت Expression آن، مقدار مورد نظر خود را وارد می‌کنیم. اینجا این سئوال پیش می‌آید این کنترل از کجا متوجه می‌شود که خروجی Expression  آن باید از چه نوعی باشد؟ اگر به شکل کنترل Flow Switch ٬ در قسمت Toolbox دقت کرده باشید می‌بینید که نحوه نوشتن آن مانند این است که یک Generic Class تعریف کرده باشیم و دقیقا به همین صورت می‌باشد. زمانیکه این کنترل به درون کنترل Flowchart کشیده می‌شود، شکل زیر نمایان خواهد شد.

همانطور که مشاهده می‌کنید نوع T، از نوع عددی صحیح تعیین شده و این نوع، مقدار پیش فرض است. البته می‌توان این نوع را عوض کرد. T می‌تواند از نوع Object، مثلا کلاس دانش آموزان باشد و یا از نوع یک Workflow دیگر٬ که در جلسات بعدی توضیح داده خواهد شد.

همانطور که در شکل بالا مشاهده می‌کنید از کنترل Decision دو خروجی گرفته شده است و هر دو به کنترل Switch ٬ اشاره دارند. این امر به این معنا می‌باشد که شرط در هر حالتی که باشد٬ چه درست چه غلط، پس از چاپ رشته مورد نظر، به کنترل Switch اشاره می‌کند.
Convert.ToInt32(((DateTime.Now.Month % 12) + 1) / 4) 
شرط کنترل Switch در بالا مشخص شده است و بر اساس عددی که بر می‌گرداند٬ رشته مورد نظر را چاپ می‌کند. همچنین یک مقدار Default وجود دارد که حتما باید مشخص شود.
Parallel
از این کنترل برای اجرای هم زمان چندین فعالیت استفاده می‌شود . 
به مثال زیر توجه کنید :

در کنترل‌های WriteLine کد زیر نوشته شده است :
"Time: " + DateTime.Now.TimeOfDay.ToString() 
"Date: " + DateTime.Now.Date.ToShortDateString() 
"Today is: " + DateTime.Now.ToString("dddd") 
کنترل Parallel باعث می‌شود ٬ که سه رشته هم زمان در خروجی چاپ شود .


اگر به عکس بالا دقت کنید٬ از بین حالت‌های مختلفی که کنترل Switch می‌تواند داشته باشد٬ یک اتصال به کنترل Parallel صورت گرفته و این به آن معنا است که در هر حالتی کنترل Parallel انجام می‌گیرد. البته شایان ذکر است که این روش را می‌توان محدود کرد.

نظرات

  • Mehrsa در ۱۳۹۱/۰۹/۰۶ ۱۲:۸

    من اینو تو محیط کنسول نوشتم این ارور رو بهم داد

    'workflow1': the private implementation of activity '1: workflow1' has the following validation error:   condition must be set before the flowdecision in flowchart 'flowchart' can be used.

    • محمد جواد تواضعی در ۱۳۹۱/۰۹/۰۶ ۱۴:۴۲
      سلام دوست عزیز 
      به نظر می‌آید که مشکل از شرطی است که برای Flowdecision باید ست شود، باشد.  شما قبل از اینکه عناصر را به هم متصل کتید ابتدا باید تکلیف Flowdecision  و شرط مربوطه را مشخص کنید و سپس خروجی مورد نظر را از آن دریافت کنید .
  • Mehrsa در ۱۳۹۱/۰۹/۰۶ ۱۴:۵۸

    بله مشکل از همینجا بود ممنون

    و یک سوال : فرض بر اینکه ما یک برنامه حسابداری داریم که به چند شرکت مختلف فروختیم هر شرکت روش کاره خودش رو برای کار داره مثلا یه شرکت یک سند حسابداری مستقیم به دست حسابدار میرسونه ولی یه شرکت دیگه اول به دست رییس مربوط میرسونه و در صورت تایید به دست حسابدار امکان نوشتن workflow وجود داره که خود کاربر نهایی بتونه یه همچین چیزیو تنظیم کنه بنویسه و به راحتی ازش استفاده کنه
    و اینکه از workflow میشه تو معماری چند لایه استفاده کرد؟
    و این ترجمه کتاب beginning wf از apressنیست ؟
    ولی در کل از این مطالبتون بسیار ممنون مرجع فارسی از workflow میشه گفت اصلا وجود نداره

    • محمد جواد تواضعی در ۱۳۹۱/۰۹/۰۶ ۱۶:۳۳
      بله دوست عزیز من زمانی که شروع به یاد گیری WF کردم از همان PDF که مربوط به نشریات Apress است شروع کردم واینکه از WF در هر نوع معماری که بشود در .NET پیاده سازی کرد قابل استفاده می‌باشد و هیچ گونه محدودیتی برای توسعه دهنده ایجاد نمی‌کند .
      با استفاده از Activity code می‌توان این جور مشکل‌ها را با در WF پیاده سازی کنیم . 
  • مهمان در ۱۳۹۱/۰۹/۰۷ ۱۲:۱۸
    آقا خیلی ممنون. عالیه. اگه میشه سریعتر پیش برین.
    • محمد جواد تواضعی در ۱۳۹۱/۰۹/۰۷ ۱۷:۱۶
      سلام 
      چشم آقا حمید :)
  • مهمان در ۱۳۹۱/۱۲/۲۳ ۱۱:۳۶
    ممنون از مطالب مفید و عالی که در سایت قرار میدید.