對於 Easyflow 執行流程增減修改等動作中,比較有關聯的資料表有三個:
- 表單流程異動子檔(RESDB):紀錄表單所有的流程關卡,新增刪除或更新都由此表來操作。
- 表單流程異動明細檔(RESDC):紀錄表單流程已確定完成簽核的關卡簽核狀態。
- 表單流程異動明細簽核檔(RESDD):紀錄表單流程簽核中的所有詳細的歷程,例如: 對同流程關卡經歷多次上呈、退件的動作,每一次的簽核結果都會被詳盡紀錄。
無意間在網路上找到「程式碼控制流程說明文件」。雖然這是ASP版本的說明文件,但是文章中講到對流程控制時所使用的物件架構,在Dot.NET版本中它有被延用下來且物件名稱都一樣。
- rstTRFlow:「resdb」資料表物件,使用時機 流程簽核中。
- rstTRFlowDetail:「resdc」資料表物件,使用時機 流程簽核中。
- rstTRFlowApprove:「resdd」資料表物件,使用時機 流程簽核中。
在開單時可利用覆寫「BeforeSendNewFormAddFlow」函式,在送出來表單時手動加入新的流程關卡。※「TRFlowRESDB」類別所建立的物件,可以在開單時新增流程資訊。
protected override void BeforeSendNewFormAddFlow(TRFlowRESDB[] xFlowData, ref bool xBlnFlowChanged) { xBlnFlowChanged = false; //不要重新解析流程 int rows_count = MasterObj.DetailObjs[0].NewRows.Count;//取得grid有幾列資料 xFlowData = new TRFlowRESDB[rows_count];//宣告流程物件陣列及其大小 int resdb003=9901,index=0;//迴圈用的變數,流程關號、流程物件索引 //送出表單時插入自訂流程使用 MasterObj.DetailObjs[0].NewRows 物件 //DetailObjs[0]代表第一個Grid物件 //NewRows代表尚未存入資料庫的資料 foreach (DscRow dscRow in MasterObj.DetailObjs[0].NewRows) { if (!dscRow.IsDeleted) { xFlowData[index].resdb001 = formID; //表單代號 xFlowData[index].resdb002 = SheetNo; //表單單號 xFlowData[index].resdb003 = resdb003.ToString(); //關號 xFlowData[index].resdb004 = "0010"; //支號 xFlowData[index].resdb005 = 1; //流程角色 xFlowData[index].resdb006 = 4; //簽核種類 xFlowData[index].resdb007 = dscRow["empl1"].Value.ToString(); //流程角色參數1 (Grid物件中取得的員工編號值,中括號中填入"欄位名稱") xFlowData[index].resdb008 = ""; //流程角色參數2 xFlowData[index].resdb009 = ""; //流程角色參數3 xFlowData[index].resdb010 = ""; //流程角色參數4 xFlowData[index].resdb011 = 0; //容許簽核時間 xFlowData[index].resdb012 = "N"; //自動ByPass? xFlowData[index].resdb013 = "0"; //ByPass方式 xFlowData[index].resdb014 = "Y"; //是否強制簽核? xFlowData[index].resdb015 = "Y"; //是否單一簽核 xFlowData[index].resdb016 = "N"; //可否列印? xFlowData[index].resdb017 = "Y"; //可否撤簽? xFlowData[index].resdb018 = "Y"; //可否加簽? xFlowData[index].resdb019 = "N"; //可否轉會? xFlowData[index].resdb020 = "N"; //可否轉寄? xFlowData[index].resdb021 = "N"; //可否新增附加檔? xFlowData[index].resdb022 = "N"; //可否修改附加檔? xFlowData[index].resdb023 = "N"; //可否刪除附加檔? xFlowData[index].resdb024 = "Y"; //可否閱讀附加檔? xFlowData[index].resdb025 = "N"; //簽核時密碼驗證? xFlowData[index].resdb026 = "N"; //流程是否已經解析? xFlowData[index].resdb027 = ""; //流程提示訊息 xFlowData[index].resdb028 = ""; // xFlowData[index].resdb029 = ""; // resdb003++; index++; } } base.BeforeSendNewFormAddFlow(xFlowData, ref xBlnFlowChanged); }
而在流程簽核中則以覆寫「BeforeApprove」、「AfterApprove」這兩個函式來處理流程關卡的新增、刪除、修改。在這兩個函式中就可以使用 RstTRFlow、RstTRFlowApprove、RstTRFlowDetail 這三個物件來操作他們所對應的表單資料。
#region 簽核前處理 protected override void BeforeApprove(PublicUTIL.DBProcessor processor) { base.BeforeApprove(processor); //取得單身欄位資料 string sql_command = @"select empl1 from [EFNETDB].[dbo].[test2_2] where test2_2001='{0}' and test2_2002='{1}' "; sql_command = String.Format(sql_command, this.formID, this.SheetNo); SqlDataAdapter my_adapter = processor.getDataAdapter(sql_command); DataTable my_table= new DataTable(); my_adapter.Fill(my_table); if (AryFlowProperty.SerialSignResult == "2") //同意 { //如果關號是0010,則手動塞流程 if (this.FlowNo == "0010") { foreach (DataRow my_resdd_row in RstTRFlowApprove.Tables[0].Select("resdd003 like '2%'")) { my_resdd_row.Delete(); } foreach (DataRow my_resdc_row in RstTRFlowDetail.Tables[0].Select("resdc003 like '2%'")) { my_resdc_row.Delete(); } foreach (DataRow my_resdb_row in RstTRFlow.Tables[0].Select("resdb003 like '2%'")) { my_resdb_row.Delete(); } int resdb003=20; foreach( DataRow my_row in my_table.Rows ) { DataRow my_datarow = RstTRFlow.Tables[0].NewRow();//流程資料表建立一新的資料列 //開始設定資料列相關資資料 my_datarow["resdb001"] = formID; my_datarow["resdb002"] = SheetNo; my_datarow["resdb003"] = resdb003.ToString()+DateTime.Now.Second.ToString("00"); my_datarow["resdb004"] = "0010"; //支號 my_datarow["resdb005"] = 1; //流程角色 my_datarow["resdb006"] = 4; //簽核種類 my_datarow["resdb007"] = my_row["empl1"].ToString(); //流程角色參數1 (Grid物件中取得的員工編號值,中括號中填入"欄位名稱") my_datarow["resdb008"] = ""; //流程角色參數2 my_datarow["resdb009"] = ""; //流程角色參數3 my_datarow["resdb010"] = ""; //流程角色參數4 my_datarow["resdb011"] = 0; //容許簽核時間 my_datarow["resdb012"] = "N"; //自動ByPass? my_datarow["resdb013"] = "0"; //ByPass方式 my_datarow["resdb014"] = "Y"; //是否強制簽核? my_datarow["resdb015"] = "Y"; //是否單一簽核 my_datarow["resdb016"] = "N"; //可否列印? my_datarow["resdb017"] = "Y"; //可否撤簽? my_datarow["resdb018"] = "Y"; //可否加簽? my_datarow["resdb019"] = "N"; //可否轉會? my_datarow["resdb020"] = "N"; //可否轉寄? my_datarow["resdb021"] = "N"; //可否新增附加檔? my_datarow["resdb022"] = "N"; //可否修改附加檔? my_datarow["resdb023"] = "N"; //可否刪除附加檔? my_datarow["resdb024"] = "Y"; //可否閱讀附加檔? my_datarow["resdb025"] = "N"; //簽核時密碼驗證? my_datarow["resdb026"] = "N"; //流程是否已經解析? my_datarow["resdb027"] = ""; //流程提示訊息 my_datarow["resdb028"] = ""; // my_datarow["resdb029"] = ""; // RstTRFlow.Tables[0].Rows.Add(my_datarow);//將資料列插入流程資料表中 resdb003++; } } } } #endregion protected override void AfterApprove() { base.AfterApprove(); }
p.s:以上的程式碼片段僅為測試說明用,實際上可能未能符合流程關卡新增刪除相關資料表依存邏輯。