راهنمای کدنویسی اقدام‌کننده بر اساس فیلد سمت سازمانی دیدگاه یا شروع‌کننده در مدل داده‌ای پویا 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)

{

{

{

نکته : در پیاده­‌سازی این راهکار برای مشتری­‌های مختلف باید به نام‌­های ستون‌ها و نام رشته اتصال دقت کرد؛ زیرا می‌توانند از آن‌چه که در این اسکریپت­‌ آورده شده است، متفاوت باشند.

نظرات کاربران 0 نظر

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *