بررسی مسئله انتخاب اقدامکنندگان درون یک گرید در مراحل قبل و ارائه یک راهحل برای آن:طرح مسئله: فرض کنید در فرآیندی اقدامکننده یک فعالیت کاربر فرآیند باید بتواند نام برخی افراد را در یک گرید قرار دهد تا فرم و دیتا برای تمام این افراد ارسال گردد.
یک راهکار: برای حل این مسئله یکی از راهکارها استفاده از دو فرآیند مجزاست. در فرآیند اول انتخاب گیرندگان صورت میگیرد و با روشی به ازای هر اقدامکننده، فرآیند دوم را اجرا کرده و فرم را برای اقدامکنندگان ارسال مینماییم. تصویر زیر نمونهای از دیاگرام این راهکار است:
همانطور که مشاهده میشود در اولین مرحلهی فرآیند اول فرم و دیتا پر میشود که تصویر فرم مربوطه در زیر آمده است:
ستون حاوی اقدامکنندگان فعالیت مورد نظر در فرایند دوم در این فرم کارشناس نام دارد که حتماً باید از نوع رابطه (سمت سازمانی دیدگاه) باشد، پس نام اقدامکنندگان مرحله بعد باید در این ستون قرار بگیرد.|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)
{
{
{
نکته : در پیادهسازی این راهکار در مشتریهای مختلف باید به نامهای جداول و ستونها و نام رشته اتصال دقت نمود؛ زیرا میتوانند از آنچه که دراین اسکریپتها آورده شده است متفاوت باشند.