بررسی مسئله کدنویسی اقدامکننده براساس فیلد سمت سازمانی یا سمت شروعکننده
طرح مسئله: فرض کنید قصد داریم در فرآیندی در صورت انتخاب یک سمت سازمانی مشخص بر روی فرم فعالیت A فعالیت B برای آن سمت سازمانی انتخابشده ارسال شود و در صورتی که سمت سازمانی انتخاب نشد، فعالیت B برای سمت شروعکننده فرآیند ارسال شود.
یک راهحل: راهکار مناسب برای حل مسئله این است که یک فیلد سمت سازمانی را بر روی فرم فعالیت کاربر A قرار دهید و نوع اقدامکننده فعالیت B را کدنویسی قرار دهید.
شکل 1
شکل 2
فیلد مورد نظر در این فرم باید از جنس رابطه (Staff (سمت سازمانی)) باشد.
در فعالیت B اقدامکننده را در حالت کدنویسی قرار میدهیم و کد ارائهشده را با اعمال تغییرات متناسب با فرآیند خود قرار میدهیم.
در کد قرارگرفته در اقدامکننده فعالیت کاربر B موارد زیر انجام شده است:
- یک متغیر از نوع عدد صحیح برای ذخیرهسازی خروجی کوئری تعریف شده است.
- یک رشته اتصال برای اتصال به پایگاه داده دیدگاه و اجرای کوئری مورد نظر ایجاد شده است.
- کوئری ارائهشده بررسی میکند که آیا در فیلد سمت سازمانی دیدگاه بر روی فرم فعالیت کاربر، سمتی درج شده است یا خیر. برای این منظور از دستور If Exists استفاده شده است. در صورت انتخاب شدن سمت مقدار Id متناظر با سمت انتخاب شده از جدول Staff از پایگاه داده Didgah_Common انتخاب میشود. در غیر این صورت مقدار 0 انتخاب میشود.
- با توجه به اینکه فیلد سمت سازمانی دیدگاه از نوع رابطه است، مقدار ذخیرهشده در این فیلد در ستون ForeignKey از جدول Junction مدل دادهای فرایند نگهداری میشود. برای فیلد سمت سازمانی دیدگاه این مقدار برابر است با مقدار Guid سمت انتخابشده در جدول Staff از پایگاه داده Didgah_Common.
- با توجه به اینکه برای مقداردهی به تابع Owner باید از مقدار StaffId که متناظر با ستون Id از جدول Staff است استفاده کنیم، پس از لحاظ کردن Join مناسب بین جدول Junction مدل دادهای فرایند و جدول Staff ستون Id از این جدول انتخاب شده است.
- برای محدود کردن خروجی کوئری به رکوردهای ثبتشده در فیلد سمت سازمانی دیدگاه مورد نظر از مقدار RelationGuid رابطه مربوطه استفاده میشود. این مقدار همان ستون Guid از جدول Relations در پایگاه داده Didgah_DynamicDataModel است.
- برای محدود کردن خروجی کوئری به اجرای نمونه فرایند مورد نظر از شرط برابری ستون PrimaryKey با مقدار شناسه نمونه فرایند یا BusinessKey که با دستور AddWithValue به کوئری منتقل شده است، استفاده میشود.
- خروجی کوئری با استفاده از دستور ExecuteScalar در متغیر عدد صحیح پیشتر ایجاد شده ذخیره شده است.
- در نهایت با توجه به اینکه خروجی کوئری مقدار 0 است یا مقدار StaffId یک سمت سازمانی انتخابشده در فیلد سمت سازمانی به تابع Owner مقداردهی میکنیم. در صورتی که مقدار خروجی کوئری 0 باشد مقدار StaffId شروعکننده فرایند را با استفاده از متغیر عمومی مربوطه به عنوان ورودی تابع Owner لحاظ میکنیم. در صورتی که خروجی کوئری StaffId یک سمت باشد، همین مقدار را به عنوان ورودی تابع Owner لحاظ میکنیم.
در زیر نمونه کدی که عملیات فوق را انجام میدهد ارائه شده است:
;using System
;using Chargoon.Didgah.BPMS.CommonApi
;using System.Data
;using System.Data.SqlClient
namespace Chargoon.Didgah.BPMS.Runtime
}
public class OwnerSelector : IOwnerSelector
}
public IExecution Execution { get; set; }
()public Owner GetOwner
}
;int StaffID
;SqlConnection conn = new SqlConnection(Execution.GetConnectionString(“BPMS”))
using (SqlCommand cmd = new SqlCommand())
}
;cmd.Connection = conn
;cmd.CommandType = CommandType.Text
cmd.CommandText = @”if exists (SELECT
[dbo].[com_Staff].Id
FROM [dbo].[ddm_RequestPaymentJunction]
inner join [dbo].[com_Staff] on [dbo].[com_Staff].Guid=[dbo].[ddm_RequestPaymentJunction].ForeignKey
where RelationGuid=’43C3D8BC-3F93-F3D3-E2E0-8BA2BA6DBB4A’ and PrimaryKey=@BusinessKey)
SELECT
[dbo].[com_Staff].Id
FROM [dbo].[ddm_RequestPaymentJunction]
inner join [dbo].[com_Staff] on [dbo].[com_Staff].Guid=[dbo].[ddm_RequestPaymentJunction].ForeignKey
where RelationGuid=’43C3D8BC-3F93-F3D3-E2E0-8BA2BA6DBB4A’ and PrimaryKey=@BusinessKey
;”else (select 0 as Id)
;cmd.Parameters.AddWithValue(“@BusinessKey”, Execution.GuidValue(“___BusinessKey”))
;()conn.Open
;StaffID = Convert.ToInt32(cmd.ExecuteScalar())
;()conn.Close
{
if (StaffID == 0)
;return new Owner(Execution.IntegerValue(“___StarterStaffId”))
else
;return new Owner(StaffID)
{
{
{
نکته : در پیادهسازی این راهکار برای مشتریهای مختلف باید به نامهای ستونها و نام رشته اتصال دقت کرد؛ زیرا میتوانند از آنچه که در این اسکریپت آورده شده است، متفاوت باشند.