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

راهنمای کدنویسی اقدام‌کننده بر اساس فیلد سمت سازمانی دیدگاه یا شروع‌کننده در مدل داده‌ای پویا 2

کدنویسی اقدام‌کننده

بررسی مسئله کدنویسی اقدام‌کننده براساس فیلد سمت سازمانی یا سمت شروع‌کننده

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