SampleWF — طراحي فرآيند:
از منوي بالاي صفحه گزينه ايجاد فرآيند جديد را انتخاب وكرده،نام فرآيند را وارد مي كنيم و طبق راهنماي موتور گردش كار مجوزهاي لازم را براي اين فرآيند تنظيم مي كنيم:
مي خواهيم قبل از شروع فرآيند شرط خاصي را چك كنيم، يكي از مواردي كه قبل از اجراي فرآيند مي توانيم چك كنيم به گردش افتادن فرم از قبل است كه چنانچه فرم ما قبلا شروع فرآيند شده باشد ديگر گردش مجدد نخورد براي اين كار بر روي نود شروع كليك كرده و از پنجره باز شده قسمت تراكنش با بانك اطلاعاتي را انتخاب مي نماييم، سپس بر روي گزينه افزودن تراكنش كليك كرده و كد هاي مربوطه را در آن وارد مي كنيم:
كدهاي اين قسمت:
If Exists(select * from sends where entitytypecode = [Content.ETC]  and entitycode =  [Content.EC])
begin
begin
select 0, N'فرم جاري قبلا ارجاع گرديده است'
RETURN
End
كد بالا بر اساس كد مدرك و كد نوع مدرك در جدول ارسال ها جستجو مي نمايد و چنانچه ركوردي پيدا كند خطا مي دهد.
طبق الگوريتم بايد بعد از نود شروع يك نود جهت تشخيص متقاضي اضافه كنيم، به طور كل براي تشخيص يا تصميم گيري از نود "پردازش با بانك اطلاعاتي"  از قسمت نودهاي پردازشي استفاده مي كنيم:
بر روي اين نود كليك كرده و نام آن را به " كنترل متقاضي" تغيير مي دهيم:
نكته:در ابتداي نام هر نود كد شناسايي مربوط به آن نود را درج مي كنيم تا بعداً در هنگام خطايابي در صورت وجود نودهايي با اسامي تكراري دچار اشتباه نگرديم:
جهت تنظيم گزينه هاي تصميم گيري بر روي گزينه "مديريت پاسخ ها "  كليك كنيد:
در اين قسمت پاسخ هاي موجود و درصد تاثير هر كدام را اضافه مي كنيم:
سپس براي تنظيم اين پاسخ ها از گزينه "افزودن تراكنش با بانك اطلاعاتي" استفاده مي كنيم:
در اين قسمت كد زير را وارد مي كنيم:
كدهاي اين قسمت:
if ([Resource.ParentRoleID] = -1) --manager
begin
select 1
Return
end
begin
select 1
Return
end
if ([Resource.ParentRoleID] = 269)--managerUnit
begin
select 2
return
end
if  ([Resource.ParentRoleID] = 256 OR [Resource.ParentRoleID] = 260 OR [Resource.ParentRoleID] = 333 OR    [Resource.ParentRoleID] = 439) --karmand
begin
select 3
return
end
كد بالا بر اساس كد نقش پدر هر شخص، سمت آن را از لحاظ مديرعامل،مدير واحد و يا كارمند بودن تشخيص مي دهد و براساس آن پاسخ مناسب را انتخاب مي نمايد.
پس از اتمام تنظيمات مربوط به نود تشخيص متقاضي، ارتباط نود شروع با اين نود را تعيين مي كنيم:
در مرحله بعد يك نود امضاء از قسمت نودهاي عمليات ارجاع جهت امضاء مدير واحد اضافه مي كنيم:
بر روي اين نود كليك كرده و در قسمت گيرندگان ارجاع آن، كد زير را اضافه مي كنيم:
كدهاي اين قسمت:
[Role_ID] = (SELECT ParentID FROM Roles WHERE Role_ID = [Content.Starter])
كد هاي بالا كد نقش سمت پدر شروع كننده فرآيند را بدست مي آورد.اين كار باعث ميشود مدرك بعد از زدن شروع فرآيند توسط كارمند به كارتابل جهت امضاء مدير آن شخص ارجاع زده شود.
در همين نود در قسمت مديريت پاسخ ها موارد زير را اضافه مي كنيم:
به آن دليل كه در اين مرحله كليد بازگشت و رد مدرك يك مفهوم را داراست اين دو را تركيب مي كنيم.
پس از اتمام تنظيمات مربوط به اين نود نيز ارتباط آن را با نود كنترل متقاضي برقرار مي سازيم.
پس از برقراري ارتباط مي بايست پاسخ مناسب را براي مسير اين نود انتخاب كرد،براي اينكار ابتدا بر روي مسير مورد نظر كليك كرده و سپس از قسمت پاسخ مناسب را انتخاب ميكنيم تا بر روي مسير به نمايش درآيد:
چنانچه مدير واحد بخواهد فرم مرخصي را تاييد نماييد مي بايست اين فرم را امضاء نمايد كه ما در اينجا از امكان درج امضاء اتوماتيك استفاده مي كنيم، جهت انجام اين كار به 2 نود نيازمنديم:
نود پردازش با بانك اطلاعاتي:
بعد از اضافه كردن اين نود در قسمت افزودن تراكنش با بانك اطلاعاتي آن كدهاي زير را اضافه مي نماييم:
كدهاي اين قسمت:
Declare @UserName nvarchar(25)
Select @UserName = UserName From Users Where [User_ID] = [Resource.UserID]
Declare @SignatureXMl nvarchar(1000)
Set @SignatureXMl = N'<Document>’
Set @SignatureXMl = N'<Document>’
Set @SignatureXMl = @SignatureXMl + N'<EntityTypeCode><![CDATA[[Content.ETC]]]></EntityTypeCode>’
Set @SignatureXMl = @SignatureXMl + N'<EntityCode><![CDATA[[Content.EC]]]></EntityCode>’
Set @SignatureXMl = @SignatureXMl + N'<Signatures>'Set @SignatureXMl = @SignatureXMl + N'<Sign userName="' + @UserName + '" fieldName="UnitManagerSign" type="nvarchar">'Set @SignatureXMl = @SignatureXMl + N'</Sign>'Set @SignatureXMl = @SignatureXMl + N'</Signatures>’'Set @SignatureXMl = @SignatureXMl + N'</Document
Select @SignatureXMl
كدهاي بالا XML مربوط به امضاء را مي سازد كه در آن فقط كافيست فيلد امضاء گذاشته شده در فرم را معرفي كنيم در قسمت fieldName
چيدمان XML مربوط به متد درج امضاء در راهنماي SDK فرزين موجود است.
نود اسكريپت(DLL):
بعد از اضافه كردن اين نود بر روي آن كليك كرده و گزينه افزودن اسكريبت را انتخاب مي نماييم:
در اين قسمت براي بارگزاري DLL مربوط به افزودن امضاء همانند شكل زير مراحل را به ترتيب انجام دهيد:
پس از انجام مراحل فوق در همين نود گزينه افزودن پارامتر ورودي را انتخاب مي كنيم:
در اين قسمت همانند شكل زير نوع مقدار را بايد از نوع پاسخ مرحله قبل انتخاب نمود تا رشته XML ساخته شده در مرحله قبل را دريافت نمايد:
نماي فرآيند ساخته شده تا اين مرحله به شكل زير مي باشد:
طبق الگوريتم بعد از امضاء (تاييد) مدير واحد فرم مرخصي مي بايست جهت امضاء(تاييد) مدير عامل به كارتابل جهت امضاء ايشان ارجاع داده شود،براي اينكار يك نود امضاء ازقسمت نودهاي عمليات ارجاع اضافه مي كنيم و آن را همانند نود امضاء مدير واحد كه در قبل شرح داده شد تنظيم مي كنيم با اين تفاوت كه در قسمت تعيين گيرندگان ارجاع فقط كد نقش مدير عامل سازمان را اضافه مي كنيم:
چنانچه مدير عامل فرم مرخصي را تاييد نمايد فرم مي بايست امضاء گردد كه براي اين كار 2 نود مربوط به درج امضاء اتوماتيك را اضافه مي كنيم و تنظيمات آنها را همانند قبل انجام مي دهيم (نود پردازش با بانكاطلاعاتي و نود افزودن اسكريپت)
تا اينجا مسير نامه به اين شكل بوده كه فرم درخواست مرخصي را كارمند پر كرده و جهت امضائ مدير واحد ارسال شده، مدير واحد آن را تاييد كرده كه با تاييد آن به كارتابل جهت امضاي مدير عامل رسيده، مدير عامل هم فرم مرخصي را تاييد كرده است.
اينك گردش فرم درخواست مرخصي به اتمام رسيده است اما در اينجا مي خواهيم قبل از خاتمه يك هامش به عنوان اينكه مرخصي مورد تاييد قرار گرفت بر روي نامه اضافه گردد و نيز يك پيام براي فرد درخواست كننده ارسال شود تا از تاييد مرخصي خود مطلع شود، براي اين كار مراحل زير را انجام دهيد:
افزودن نود پردازش با بانك اطلاعاتي و تغيير نام آن به ارسال پيام تاييد:
در قسمت افزودن تراكنش با بانك اطلاعاتي اين نود كد زير را اضافه مي كنيم:
كد هاي اين قسمت:
Declare @CurrentMsgID int
Declare @StarterUserID int
Declare @StarterUserID int
Declare @PersonnelName nvarchar(300)
Declare @Sex bit
select @StarterUserID = UserID, @PersonnelName = FirstName + ' ' + LastName, @Sex = Gender From Users,Roles Where Users.User_ID = Roles.UserID and Roles.Role_ID =  [Content.Starter]
if(@Sex = 1)
Set @PersonnelName = N' آقاي ' + @PersonnelName
Else
Set @PersonnelName = N' خانم ' + @PersonnelName
Set @PersonnelName = N' خانم ' + @PersonnelName
INSERT INTO Msg_Sents (Subject , Description , SenderUserID) VALUES (@PersonnelName + N' مرخصي شما مورد تاييد قرار گرفت ', N'' , [Resource.UserID])
Select @CurrentMsgID = Max(Msg_ID) From Msg_Sents
--@CurrentMsgID = @@Identity
INSERT INTO Msg_Receivers ( MsgID , ReceiverUserID )  VALUES (@CurrentMsgID , @StarterUserID)
كدهاي بالا ساختار رشته اي يك پيام را ايجاد و سپس آن را در جداول مربوط به پيام ها درج مي كند.
افزودن نود پردازش با بانك اطلاعاتي و تغيير نام آن به افزودن هامش تاييد :
در قسمت افزودن تراكنش با بانك اطلاعاتي اين نود كد زير را اضافه مي كنيم:
كدهاي اين قسمت:
Declare @PersonnelName nvarchar(300)
Declare @Sex bit
select @PersonnelName = FirstName + ' ' + LastName, @Sex = Gender From Users,Roles Where Users.User_ID = Roles.UserID and Roles.Role_ID =  [Content.Starter]
if(@Sex = 1)
Set @PersonnelName = N' آقاي ' + @PersonnelName
Else
Set @PersonnelName = N' خانم ' + @PersonnelName
Set @PersonnelName = N' خانم ' + @PersonnelName
INSERT INTO Hamesh ( Title , Content , UserCode , RoleID , ETC , EC , CreationDate )  VALUES( @PersonnelName , N'مرخصي شما مورد تاييد قرار گرفت' ,  [Resource.UserID] ,  [Resource.Role_ID] ,  [Content.ETC] ,  [Content.EC] ,  GETDATE())
اين كد متن هامش را آماده و سپس در جدول هامش درج مي كند.
اگر بخواهيم مدرك ما بعد از تاييد در يكي از بايگاني هاي سازمان بايگاني شود و نيز در كارتابل شخصي افراد در قسمت نگهداري شخصي افزوده شود مراحل زير را انجام مي دهيم:
افزودن نود پردازش با بانك اطلاعاتي و تغيير نام آن به بايگاني اتوماتيك :
در قسمت افزودن تراكنش با بانك اطلاعاتي اين نود كد زير را اضافه مي كنيم:
Declare @CodeArchive nvarchar(255)
Declare @StarterUserID int
Declare @PersonnelName nvarchar(300)
Declare @Sex bit
Declare @SubjectDescription nvarchar(500)
Declare @ArchiveDescription nvarchar(1000)
Declare @SubjectID int
Declare @ETC Int
Declare @EC Int
Declare @RoleName nvarchar(300)
Declare @EntityTypeName varchar(512)
Declare @EntityTitleField varchar(512)
Declare @EntityTitleField varchar(512)
Declare @Query NVARCHAR(4000)
Declare @SematName nvarchar(512)
Declare @CodeArchiveRoot nvarchar(512)
Declare @ParentID int
SELECT @StarterUserID = UserID, @PersonnelName = FirstName + ' ' + LastName, @Sex = Gender , @RoleName = RoleName From Users,Roles Where Users.User_ID = Roles.UserID and Roles.Role_ID =  [Content.Starter]
if(@Sex = 1)
Set @PersonnelName = N' آقاي ' + @PersonnelName
Else
Set @PersonnelName = N' خانم ' + @PersonnelName
Set @PersonnelName = N' خانم ' + @PersonnelName
SET @PersonnelName = @PersonnelName
SET @SematName = N'سمتِ'  + N' ( ' + @Rolename + ' ) '
SET @CodeArchiveRoot =   N'WU' + Convert(nvarchar(50),@StarterUserID)
SET @CodeArchive =   N'WR' + Convert(nvarchar(50),[Content.Starter])
SET @SubjectDescription = N'پرونده توسط موتور توليد فرآيند ايحاد شده است'
SET @ETC =  [Content.ETC]
SET @EC = [Content.EC]
SET @ArchiveDescription = N'دخيره شده بوسيله موتور توليد فرآيند'
IF NOT EXISTS(SELECT Code FROM ArchiveDepartment WHERE (Code = @CodeArchiveRoot))
BEGIN
INSERT INTO [ArchiveDepartment]
(
[SubjectName],
[Code],
[SubjectDescription],
[ParentID],
[OrganizationID],
[DepartmentID]
)
VALUES
(
@PersonnelName,
@CodeArchiveRoot  ,
@SubjectDescription,
-1,
362,
76
)
END
SET @ParentID = (SELECT SubjectID  FROM ArchiveDepartment WHERE (Code = @CodeArchiveRoot))
IF NOT EXISTS(SELECT Code FROM ArchiveDepartment WHERE (Code = @CodeArchive))
BEGIN
INSERT INTO [ArchiveDepartment]
(
BEGIN
INSERT INTO [ArchiveDepartment]
(
[SubjectName],
[Code],
[SubjectDescription],
[ParentID],
[OrganizationID],
[DepartmentID]
)
VALUES
(
@SematName,
@CodeArchive  ,
@SubjectDescription,
@ParentID ,
362,
76
)
END
SET @SubjectID  = (SELECT SubjectID FROM ArchiveDepartment WHERE (Code = @CodeArchive))
SELECT * FROM Rel_ArchiveDepartment_Entities WHERE SubjectID = @SubjectID AND EntityTypeCode = @ETC AND EntityCode = @EC
IF NOT EXISTS (SELECT * FROM Rel_ArchiveDepartment_Entities WHERE SubjectID = @SubjectID AND EntityTypeCode = @ETC AND EntityCode = @EC)
BEGIN
INSERT INTO [Rel_ArchiveDepartment_Entities]
(
[SubjectID],
[EntityTypeCode],
[EntityCode],
[ArchiveDescription]
)
VALUES
(
@SubjectID,
@ETC,
@EC,
@ArchiveDescription
)
END
Select @EntityTypeName = EntityTypeName , @EntityTitleField = EntityTitleField From Entity_MetaData WHERE EntityTypeCode = @ETC
SET @Query = N' Declare @EntityTitle nvarchar(512)'
SET @Query = @Query + N' SELECT @EntityTitle = [' + @EntityTitleField + ']  FROM [Entity_' + @EntityTypeName + '] WHERE EntityCode=' + CAST( @EC AS NVARCHAR)
SET @Query = @Query + N' Update Rel_ArchiveDepartment_Entities Set EntityTitle =@EntityTitle WHERE EntityTypeCode = '+ CAST( @ETC AS NVARCHAR) + 'AND EntityCode = ' + CAST( @EC AS NVARCHAR)
Exec(@Query)
كد بالا مدرك را در بايگاني خاصي كه براي آن مشخص مي كنيد ذخيره مي كند.
افزودن نود پردازش با بانك اطلاعاتي و تغيير نام آن به نگهداري شخصي :
در قسمت افزودن تراكنش با بانك اطلاعاتي اين نود كد زير را اضافه مي كنيم:
Declare @ValidFolder bit;
Declare @FolderID int;
select @ValidFolder = count(*) from PersonalArchive
where RoleID =  [Content.Starter] and SubjectName = N'فرم هاي مرخصي روزانه'
if (@ValidFolder = 0)
BEGIN
insert into PersonalArchive (SubjectName,CreationDate,ParentID,RoleID)
values (N'فرم هاي مرخصي روزانه',GetDate(),-1, [Content.Starter])
set @FolderID = @@Identity
END
select @FolderID = SubjectID from PersonalArchive
select @FolderID = SubjectID from PersonalArchive
where RoleID =  [Content.Starter] and SubjectName = N'فرم هاي مرخصي روزانه'
insert into PersonalArchive_Sends (SubjectID,SendCode,ArchiveTime,ETC,EC)
values (@FolderID,-1,GetDate(),[Content.ETC], [Content.EC])
كد بالا پوشه با نام فرم هاي مرخصي روزانه ايجاد مي كند و سپس مدرك مورد نظر را در آن ثبت مي كند.
اكنون اين مسير به انتها رسيده است پس يك نود خاتمه از قسمت نودهاي پردازشي به انتهاي مسير اضافه مي كنيم:
نماي آخر مسير ساخته شده به شكل زير مي باشد:
نماي آخر مسير ساخته شده به شكل زير مي باشد:
تا اينجا فقط مسيري را طي كرديم كه فرم مرخصي توسط مدير واحد و مدير عامل تاييد مي شد، حال مراحلي را كه احتمال دارد مدير واحد يا مدير عامل فرم را تاييد نكنند(رد/بازگشت) پياده سازي مي كنيم:
به مرحله امضاء مدير عامل بر مي گرديم، در اين مرحله 2 پاسخ وجود داشت، تاييد و رد كه مسير تاييد آن را پياده سازي كرده ايم و اكنون براي ايجاد مسير پاسخ رد/بازگشت مراحل زير را انجام مي دهيم:
زماني كه فرم مرخصي رد مي شود و يا بازگشت مي خورد فقط كافيست هامشي جهت اعلام اينكه مرخصي تاييد نشده است ونيز پيامي با همين مضمون جهت اطلاع شخص درخواست كننده ارسال شود.
افزودن نود پردازش با بانك اطلاعاتي و تغيير نام آن به ارسال پيام رد :
در قسمت افزودن تراكنش با بانك اطلاعاتي اين نود همان كد قبلي را كه در نود ارسال پيام تاييد توضيح داديم اضافه مي كنيم با اين تفاوت كه متن پيام ارسالي را به "متاًسفانه مرخصي شما مورد تاييد قرار نگرفت " تغيير مي دهيم.
افزودن نود پردازش با بانك اطلاعاتي و تغيير نام آن به افزودن هامش رد :
در قسمت افزودن تراكنش با بانك اطلاعاتي اين نود همان كد قبلي را كه در نود افزودن هامش رد توضيح داديم اضافه مي كنيم با اين تفاوت كه متن هامش را به "متاًسفانه مرخصي شما مورد تاييد قرار نگرفت " تغيير مي دهيم.
اين مسير هم به انتها رسيده است پس براي آن يك نود خاتمه اضافه مي كنيم:
مسير ايجاد شده به شكل زير مي باشد:
به نود امضاء مدير واحد باز مي گرديم و مي خواهيم مسير رد/بازگشت كردن فرم مرخصي توسط مدير واحد را اضافه كنيم:
زماني كه مدير واحد درخواست مرخصي يك كارمند را خود رد/بازگشت مي نمايد گردش اين فرم به پايان رسيده است و فقط كافيست هامش تاييد نشدن مرخصي توسط مدير واحد و نيز ارسال پيام عدم تاييد مرخصي براي شخص درخواست كننده اضافه شود، اگر دقت كنيد متوجه خواهيد شد كه اين مسير را قبلاً  ايجاد كرده ايم پس كافيست كه به نود ابتداي آن مسير پرش كنيم براي اين كار مراحل زير را انجام مي دهيم:
از قسمت نود هاي پردازشي يك نود "پرش به مرحه بعدي"  اضافه مي كنيم:
بر روي اين كليك كرده و همانند شكل زير در قسمت مرحله بعدي، نود مورد نظر كه مي خواهيد به آن پرش كنيد را انتخاب كنيد:
ارتباط نود امضاء مدير واحد را با اين نود برقرار كنيد و سپس بر روي مسير بين اين 2 نود كليك كرده و پاسخ رد/بازگشت را انتخاب نماييد.
اين مسير به شكل زير در مي آيد:
اين مسير به شكل زير در مي آيد:
اگر به تصوير بالا دقت كنيد مي بينيدكه براي نود كنترل متقاضي فقط پاسخ كارمند را اضافه كرده ايم(حالتي كه شخص درخواست كننده مرخصي سمت كارمند داشته باشد)، حال براي اضافه كردن حالتهايي كه ممكن است فرد درخواست كننده مرخصي خود مدير واحد يا مدير عامل سازمان باشد مراحل زير را اضافه مي كنيم:
چنانچه درخواست كننده مرخصي مدير واحد باشد براي تاييد مرخصي خود نياز به تاييد و امضاي مدير عامل سازمان دارد كه اين مسير از قبل وجود دارد و نياز به اضافه كردن دوباره اين نودها نيست پس كافيست به اين ميسر پرش انجام دهيم.
يك نود پرش به مرحله بعدي اضافه كرده و مرحله بعدي آن را نود كارتابل جهت امضاء مدير عامل انتخاب مي كنيم
ارتباط نود كنترل متقاضي با اين را برقرار كرده و براي مسير بين آنها هم پاسخ مدير واحد را انتخاب مي كنيم.
اين مسير به شكل زير ساخته خواهد شد:
اين مسير به شكل زير ساخته خواهد شد:
آخرين مرحله حالتي را تعيين مي كنيم كه درخواست كننده مدير عامل سازمان باشد، دراين حالت نياز به تاييد و امضاي شخص ديگري نمي باشد، حتي نياز نمي باشد كه فرم مرخصي پس از ايجاد به كارتابل خود مدير عامل جهت امضاء ارجاع بخورد تا تاييد يا رد شود،پس فقط كافيست پس از زدن شروع فرآيند توسط مدير عامل فرم امضاء اتوماتيك شود و بقيه مراحل تا خاتمه انجام پذيرد. اين مسير در فرآيند ما وجود دارد پس فقط كافيست يك پرش به اين مسير انجام داد:
يك نود پرش به مرحله بعدي اضافه كرده و مرحله بعدي آن را نود امضاء اتوماتيك مدير عامل انتخاب مي كنيم
ارتباط نود كنترل متقاضي با اين را برقرار كرده و براي مسير بين آنها هم پاسخ مدير واحد را انتخاب مي كنيم.
اين مسير به شكل زير ساخته خواهد شد:
پس از اتمام مراحل طراحي فرآيند براي قابل استفاده كردن آن در فرم مورد نظر از قسمت خصوصيات فرآيند وضعيت فرآيند را به حالت "عملياتي – منتظر اجرا"  تغيير دهيد.
براي منتسب كردن فرآيند ساخته شده به فرم مرخصي روزانه از قسمت گام اول ويرايش ساختار فرم،فرآيند مرخصي روزانه را از ليست انتخاب كنيد: