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