شرح صورت مسئله: فرض کنید در یک فرآیند نیاز است هر فرد در یک بازه زمانی مشخص و تعداد مشخصی فرآیند را شروع کند:
در همان ابتدای فرآیند بعد از رویداد شروع با استفاده از کد زیر بررسی میکنم که اگر زمان شروع فرآیند در بازه زمانی مورد نظر است (دراین مثال بازه ۱ ساله) و همچنین فرد شروعکننده فرآیند هنوز به تعداد مدنظر ما فرایند را شروع نکرده است. (در این مثال 5)، آنگاه فرآیند ادامه پیدا کند و در غیر این صورت فرآیند خاتمه پیدا کند.
کد زیر را بر روی مسیر ترتیبی همانند تصویر زیر مینویسیم.
و برای مسیر خاتمه مانند تصویر زیر روی مسیر ترتیبی کلیک میکنیم و با انتخاب تغییر نوع، مسیر پیشفرض را انتخاب میکنیم تا در صورتی که فرآیند از مسیر قبلی نرود از این مسیر برود و فرایند خاتمه یابد.
using System;
using System.Data;
using System.Data.SqlClient;
using Chargoon.Didgah.BPMS.CommonApi;
using System.Globalization;
namespace Chargoon.Didgah.BPMS.Runtime
{
public class ConditionalFlow : IConditionalFlow
{
public IExecution Execution { get; set; }
public bool Evaluate()
{
// تعریف یک متغییر عدد صحیح به نام NumberExecuted که در آن تعداد فرایندهای اجراشده توسط این شروعکننده را میریزیم.//
int NumberExecuted=0;
// اتصال به دیتابیس. BPMSConnection نام رشته اتصال است.//
SqlConnection conn=new
SqlConnection(Execution.GetConnectionString(“BPMSConnection”));
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
// در کوئری SQL به جای X باید ProcessId فرایند را درج کنیم که از دیتابیس آن را دریافت میکنیم
//و بعد از محاسبه مقدار @ Permitted به جای Y تعداد مجاز مدنظر را درج میکنیم (در این مثال 5) و بررسی میکنیم اگر مقدار @ Permitted
//بیشتر و یا مساوی با Y باشد مقدار متغیر @result را 1 و در غیر این صورت 2 درج میکنیم.//
cmd.CommandText =@”
DECLARE @result int ,@ Permitted int= (SELECT COUNT([StarterStaffId])
FROM [Didgah_BPMS].[dbo].[bpm_ProcessInstances]
WHERE [StarterStaffId] = ANY (SELECT [StarterStaffId] FROM
[Didgah_BPMS].[dbo].[bpm_ProcessInstances]
WHERE [ProcessId]=X AND [StarterStaffId]= @StaffID))
if(@Permitted >= Y)
SET @result = 1
else
SET @result = 2
select @result” ;
//متغیر @StaffID را در این بخش مقداردهی میکنیم. برای مثال در این بخش ___StarterStaffId که مقدار StaffId فرد شروعکننده است را درون این متغیر میریزیم.//
cmd1.Parameters.AddWithValue(“@StaffID”,Execution.IntegerValue(“___StarterStaffId”));
conn.Open();
NumberExecuted = Convert.ToInt32(cmd.ExecuteScalar());
conn.Close();
}
}
// حالا برای بررسی اینکه در بازه زمانی مورد نظر باشیم (1ساله)، تاریخ ابتدا و انتها بازه زمانی مورد نظر را به ترتیب درون متغییرهای date1//
//و date2 میریزیم و تاریخ لحظه را درون متغییر date3 درج میکنیم و در آخر نتیجه مقایسه تاریخها را درون متغییر های result1//
//و result2 میریزیم .//
DateTime date1= new DateTime (2021,3,20);
DateTime date2 = new DateTime(2022,3,19);
DateTime date3 = DateTime.Now;
int result1 = DateTime.Compare(dt1, dt3);
int result2 = DateTime.Compare(dt2, dt3);
// در نهایت بررسی میکنیم اگر زمان در بازه زمانی موردنظر باشد و هنوز به تعداد موردنظر نرسیده باشیم فرایند ادامه پیدا کند.//
if (result2 > 0 && result1 < 0 && NumberExecuted == 0 )
return true;
else
return false;
}
}
}