فراخوانی اطلاعات یک نمونه فرایند در فرایندی دیگر با استفاده از شماره درخواست
طرح مسئله: فرض کنید در یک فرایند درخواست کالا جدولی برای اعلام کالاهای مورد درخواست وجود دارد. در این فرایند کالاهایی که موجود نیستند، باید خریداری شوند. برای خرید کالاهای ناموجود فرایند دیگری با نام درخواست پرداخت اجرا میشود. در صورتی که قصد داشته باشیم در فرایند درخواست پرداخت، اطلاعات کالاهای ناموجود در یک نمونه درخواست کالا در فرم فراخوانی شوند، به روش ارائهشده در این راهنما عمل میکنیم.
یک راهحل: در فرایند درخواست کالا جدولی ایجاد میکنیم که در زمان اجرای فرایند، در آن جدول کالاهای درخواستی درج میشود و در آن باید وضعیت موجود بودن کالا نیز مشخص شود (شکل 1).
شکل 1
در فرایند پرداخت باید یک فرم در شروع فرایند که حاوی فیلدی برای وارد کردن شماره درخواست کالا است توسط درخواستکننده پر شود (شکل 2). با درج شماره نمونه فرایند درخواست کالا در ابتدای فرایند درخواست پرداخت، میتوانیم در کدی که در ادامه ارائه خواهد شد، اطلاعات نمونه فرایند کالا را از پایگاه داده نرمافزار استخراج کنیم. فیلد شماره درخواست کالا ثبتشده را در خروجی فعالیت کاربری که مقدار میگیرد به عنوان پارامتر خروجی اضافه میکنیم تا بتوانیم از مقدار آن در کدنویسی استفاده کنیم.
شکل 2
در فرایند پرداخت برای فراخوانی اطلاعات جدول فرایند درخواست کالا، یک فعالیت از نوع کدنویسی ایجاد میشود (شکل 3).
شکل 3
در قسمت کدنویسی، کد ارائهشده را قرار میدهیم:
;using System
;using System.Data
;using System.Data.SqlClient
;using Chargoon.Didgah.BPMS.CommonApi
namespace Chargoon.Didgah.BPMS.Runtime
}
public class ScriptTask : IScriptTask
}
public IExecution Execution { get; set; }
()public void Execute
}
using (SqlConnection conn = new SqlConnection(Execution.GetConnectionString(“BPMS”)))
}
using (SqlCommand cmd = new SqlCommand())
}
;cmd.Connection = conn
;cmd.CommandType = CommandType.Text
cmd.CommandText = @”declare @ParentBK uniqueIdentifier=(Select [Didgah_BPMS].[dbo].[bpm_ProcessInstances].BusinessKey
from [Didgah_BPMS].[dbo].[bpm_ProcessInstances]
inner join [Didgah_BPMS].[dbo].[ddm_GoodREquest] on [Didgah_BPMS].[dbo].[ddm_GoodREquest].Guid=[Didgah_BPMS].[dbo].[bpm_ProcessInstances].BusinessKey
(where ReqNumber=@RN
declare @inserted table
([Guid] uniqueidentifier
[Deleted] bit,
[Tilte] nvarchar(4000),
[Row] int,
[Amount] decimal(18,2),
[ComPrice] decimal(18,2),
[InventoryStatus] nvarchar(4000),
[Note] nvarchar(4000),
(
insert into [Didgah_BPMS].[dbo].[ddm_ReqPa_Table1]([Guid],[Deleted]
[Title],
[Row],
[Amount],
[ComPrice],
[InventoryStatus],
[Note],
(
,output inserted.[Guid]
inserted.Deleted,
inserted.[Title],
inserted.[Row],
inserted.[Amount],
inserted.[ComPrice],
inserted.[InventoryStatus],
inserted.[Note],
into @inserted
Select NEWID(),0
[Tilte],
[Row],
[Amount],
[ComPrice],
[InventoryStatus],
[Note],
FROM [Didgah_BPMS].[dbo].[ddm_GoodREquest_Table1] join [Didgah_BPMS].[dbo].[ddm_GoodREquestJunction]
on [Didgah_BPMS].[dbo].[ddm_GoodREquestJunction].ForeignKey=[Didgah_BPMS].[dbo].[ddm_GoodREquest_Table1].Guid
‘موجود نیست’where [InventoryStatus] = N
and [Didgah_BPMS].[dbo].[ddm_GoodREquestJunction].PrimaryKey=@ParentBK
insert into [Didgah_BPMS].[dbo].[ddm_ReqPaJunction]([RelationGuid],[PrimaryKey],[ForeignKey],[Deleted])
Select ‘1342B72C-4118-1203-027A-0D5D648F73D1’,@BusinessKey,[Guid],0
;”from @inserted
;cmd.Parameters.AddWithValue(“@BusinessKey”, Execution.GuidValue(“___BusinessKey”))
;cmd.Parameters.AddWithValue(“@RN”, Execution.StringValue(“ReqNumberPa”))
;()conn.Open
;()cmd.ExecuteNonQuery
;()conn.Close
{
{
{
{
{
|کد ارائهشده عملیات زیر را انجام میدهد:
- تعریف یک رشته اتصال برای اجرای کوئری مورد نیاز
- در کوئری استفادهشده در کد ابتدا یک متغیر از نوع Guid برای ذخیره شناسه BusinessKey نمونه فرایند درخواست کالا با توجه به شماره درخواست کالای دریافتشده از کاربر در مرحله اول فرایند تعریف شده است. سپس برای استخراج شناسه نمونه فرایند درخواست کالا پس از Join بین جدول ProcessInstances، جدول Junction مدل دادهای فرایند درخواست کالا و جدول اصلی مدل دادهای فرایند درخواست کالا، رکوردی در جدول مدل دادهای کالا که ستون شماره درخواست آن برابر با مقدار وارد شده توسط کاربر است فیلتر شده است. مقدار شماره درخواست واردشده توسط کاربر با استفاده از دستور Parameters.AddWithValue به کوئری ارسال شده است. در ادامه کوئری یک جدول برای ذخیره مقادیر Insert شده در جدول کالاهای قرار گرفته روی فرم فرایند درخواست پرداخت تعریف شده است. ذخیره این مقادیر به این جهت است که باید مقدار ستون Guid که با استفاده از دستور (NEWID) ایجاد شده است را عیناً در ستون ForeignKey جدول Junction مدل دادهای فرایند Insert کنیم تا رکوردها در جدول روی فرم فرایند درخواست پرداخت نمایش داده شوند. در قسمت Select عملیات Insert به جدول کالاهای فرایند درخواست پرداخت، رکوردهایی از جدول مبدأ که وضعیت آنان موجود نیست، وجود دارد. با توجه به شناسه نمونه فرایند درخواست کالا که پیشتر استخراج شد، انتخاب میشوند. عملیات Insert بعدی در جدول Junction مدل دادهای فرایند انجام شده است. در ستون RelationGuid ،Guid رابطه بین مدل دادهای فرایند و جدول کالاها قرار گرفته است که از جدول Relations در پایگاه داده Didgah_DynamicDataModel استخراج شده است. در ستون PrimaryKey مقدار BusinessKey نمونه فرایند در جریان وارد شده است. این مقدار با استفاده از دستور AddWithValue و متغیر عمومی مربوطه به کوئری منتقل شده است. در ستون ForeignKey همان مقادیر Guid واردشده در جدول اصلی که پیشتر ذخیره شدند وارد شده است.
در صورتی که در جدول کالاهای درخواستی فرایند درخواست کالا، ردیفهایی با وضعیت “موجود نیست” وارد شده باشد (شکل 4)، پس از درج شماره درخواست کالای مورد نظر در ابتدای فرایند درخواست پرداخت، کالاهای ناموجود فرایند درخواست کالا در جدول کالای فرایند درخواست پرداخت فراخوانی میشوند (شکل 5).
شکل 4
شکل 5