پرش به محتوای اصلی

راهنمای انتخاب اقدام کنندگان در جدول در مدل داده‌ای پویا نسخه 2

راهنمای کدنویسی

بررسی مسئله انتخاب اقدام‌کنندگان درون یک گرید در مراحل قبل و ارائه یک راه‌حل برای آن:

طرح مسئله: فرض کنید در فرآیندی اقدام‌کننده یک فعالیت کاربر فرآیند باید بتواند نام برخی افراد را در یک گرید قرار دهد تا فرم و دیتا برای تمام­ این افراد ارسال گردد.

یک راهکار: برای حل این مسئله یکی از راهکارها استفاده از دو فرآیند مجزاست. در فرآیند اول انتخاب گیرندگان صورت می‌گیرد و با روشی به ازای هر اقدام‌کننده، فرآیند دوم را اجرا کرده و فرم را برای اقدام‌کنندگان ارسال می­‌نماییم. تصویر زیر نمونه­‌ای از دیاگرام این راهکار است:

همان‌طور که مشاهده می‌شود در اولین مرحله‌ی فرآیند اول فرم و دیتا پر می‌شود که تصویر فرم مربوطه در زیر آمده است:

ستون حاوی اقدام‌کنندگان فعالیت مورد نظر در فرایند دوم در این فرم کارشناس نام دارد که حتماً باید از نوع رابطه (سمت سازمانی دیدگاه) باشد، پس نام اقدام‌کنندگان مرحله بعد باید در این ستون قرار بگیرد.

1. در مرحله‌ی بعد فرآیند با استفاده از یک فعالیت کدنویسی (Script Task) موارد زیر را انجام می‌دهیم:

  • خواندن لیست اقدام‌کنندگان از گرید و قرار دادن آن درون یک متغیر DataTable
  • شمارش تعداد ردیف‌های گرید که در آن‌ها اقدام‌کننده قرار داده شده است و نگهداری آن در یک متغیر
  • تعریف متغیر شمارنده i و قرار دادن مقدار اولیه 0 در آن.

در زیر نمونه کدی که کارهای فوق را انجام می‌دهند مشاهده می‌فرمایید:

;using System

;using System.Data

;using System.Data.SqlClient

;using Chargoon.Didgah.BPMS.CommonApi

namespace Chargoon.Didgah.BPMS.Runtime

}

    public class ScriptTask : IScriptTask

  }

        public IExecution Execution { get; set; }

        ()public void Execute

       }

           ;()DataTable dt = new DataTable

            ;()Guid FileGuid = Guid.NewGuid

            ;int counttable = 0

            ;()SqlConnection conn = new SqlConnection

            ;conn.ConnectionString = Execution.GetConnectionString(“BPMSDDM”)

            ;()SqlCommand cmd = new SqlCommand

            ;cmd.Connection = conn

            cmd.CommandText = @”SELECT

      S.Id

  FROM [Demo_Didgah_BPMS].[dbo].[ddm_SpecialistJunction] SpeJ

  inner join [Demo_Didgah_Common].[dbo].[com_Staff] S on S.Guid=SpeJ.ForeignKey

  inner join [dbo].[ddm_SuggestionEvaluationJunction] SEJ on SEJ.[ForeignKey]=SpeJ.PrimaryKey

  ;”where SpeJ.Deleted=0 and SpeJ.ForeignKey is not null and SEJ.[PrimaryKey]=@BusinessKey

            ;cmd.Parameters.AddWithValue(“@BusinessKey”, Execution.GuidValue(“___BusinessKey”))

            ;()conn.Open

            ;dt.Load(cmd.ExecuteReader())

            ;()conn.Close

            ;()SqlCommand cmd2 = new SqlCommand

            ;cmd2.Connection = conn

           “@ = cmd2.CommandText

SELECT

      COUNT(*) as counttable

  FROM [Demo_Didgah_BPMS].[dbo].[ddm_SpecialistJunction] SpeJ

  inner join [Demo_Didgah_Common].[dbo].[com_Staff] S on S.Guid=SpeJ.ForeignKey

  inner join [dbo].[ddm_SuggestionEvaluationJunction] SEJ on SEJ.[ForeignKey]=SpeJ.PrimaryKey

 ;”where SpeJ.Deleted=0 and SpeJ.ForeignKey is not null and SEJ.[PrimaryKey]=@BusinessKey

          ,”cmd2.Parameters.AddWithValue(“@BusinessKey

 ;(Execution.GuidValue(“___BusinessKey”)

            ;()conn.Open

            ;counttable = Convert.ToInt32(cmd2.ExecuteScalar())

            ;()conn.Close

            ;Execution.SetVariable(“dtVariable”, dt)

            ;Execution.SetVariable(“counttable”, counttable)

            ;Execution.SetVariable(“i”, 0)

            ;Execution.SetVariable(“BusinessKey3”, Execution.GuidValue(“___BusinessKey”))

      {

  {

{

2. با ایجاد یک حلقه در فرآیند به ازای هر ردیف از جدول اقدام‌کننده را تشخیص داده، سپس فرایند دوم را با استفاده از یک رویداد پیام اجرا می‌کنیم و اقدام‌کننده را نیز به فرآیند دوم ارسال می‌­کنیم.

همچنین با استفاده از متغیر شمارنده، در هر بار اجرای حلقه در فرآیند، نام یکی از اقدام‌کنندگان از آرایه را استخراج کرده و از آن استفاده می­‌نماییم.

با استفاده از کد زیر حلقه را ایجاد کرده و همچنین به ازای هر بار اجرای حلقه در فرآیند یکی به متغیر شمارنده اضافه می­‌نماییم:

using System;

;using System.Data

;using Chargoon.Didgah.BPMS.CommonApi

namespace Chargoon.Didgah.BPMS.Runtime

}

    public class ScriptTask : IScriptTask

   }

        public IExecution Execution { get; set; }

        ()public void Execute

       }

            ;int[] arrray = new int[Execution.DataTableValue(“dtVariable”).Rows.Count]

            for (int i = 0; i < Execution.DataTableValue(“dtVariable”).Rows.Count; i++)

          }

                ;arrray[i] = Convert.ToInt32(Execution.DataTableValue(“dtVariable”).Rows[i][0])

           {

            ;Execution.SetVariable(“abc”, arrray[Execution.IntegerValue(“i”)])

            ;int temp = Execution.IntegerValue(“i”)

            ;temp += 1

            ;Execution.SetVariable(“i”, temp)

      {

{

{

3. در ادامه، در قسمت کدنویسی درگاه انحصاری (Exclusive Gateway) کمتر بودن مقدار متغیر شمارنده از تعداد اقدام‌کنندگان است جدول را بررسی می­‌نماییم. این درگاه انحصاری (Exclusive Gateway) به محض آنکه مقدار متغیر شمارنده از تعداد اقدام‌کنندگان بزرگ‌تر یا مساوی شد، تکرار حلقه را خاتمه می‌دهد.

;using System

;using Chargoon.Didgah.BPMS.CommonApi

namespace Chargoon.Didgah.BPMS.Runtime

}

    public class ConditionalFlow : IConditionalFlow

  }

        public IExecution Execution { get; set; }

        ()public bool Evaluate

       }

            if (Execution.IntegerValue(“i”) < Execution.IntegerValue(“counttable”))

                ;return true

            else

                ;return false

       {

   {

{

4. حال با استفاده از یک رویداد پایان پیام (End Event – message) فرآیند دوم را اجرا کرده و متغیر abc که حاوی شناسه اقدام‌کننده (StaffId) است را به فرآیند دریافت‌کننده پیام ارسال می­‌نماییم.

در فرآیند دوم اقدام‌کننده‌ی تسکی که باید توسط اقدام‌کننده مورد نظر اجرا شود ‌را از نوع کدنویسی انتخاب کرده و کد زیر را درون آن می‌نویسیم:

;using System

;using Chargoon.Didgah.BPMS.CommonApi

namespace Chargoon.Didgah.BPMS.Runtime

}

    public class OwnerSelector : IOwnerSelector

   }

        public IExecution Execution { get; set; }

        ()public Owner GetOwner

       }

            ;int UserStaffId = Execution.IntegerValue(“abc”)

            ;return new Owner(UserStaffId)

    {

{

{

نکته : در پیاده­‌سازی این راهکار در مشتری­‌های مختلف باید به نام‌­های جداول و ستون‌ها و نام رشته اتصال دقت نمود؛ زیرا می­‌توانند از آن‌چه که دراین اسکریپت­‌ها آورده شده است متفاوت باشند.


[ratemypost]