您好,欢迎访问三七文档
程式碼控制流程說明文件一、用途EasyFlow流程大都由「流程設定精靈」或開啟表單之「流程設定」功能加以設定或修改。但若希望流程會依表單欄位內容而變,如會自動寄發通知給表單上通知人欄位中的所有人,或讓使用者在表單畫面上選擇要給哪些單位主管或員工,而不用開啟流程設定畫面自行拖拉流程。二、原理在EasyFlow流程資料尚未寫入至資料庫時,即讀取並變更之。三、程式碼撰寫點BeforeSendNewForm.asp或BeforeApproveForm.asp皆可,時間點不同,BeforeSendNewForm.asp是新填表單時,按下傳送表單鈕後,表單欄位資料及流程資料都還存在暫存區中,尚未實際寫入資料庫裡;BeforeApproveForm.asp是簽核者在表單上按下簽核鈕後,所有資料都還存在暫存區中,尚未實際寫入資料庫裡。在BeforeSendNewForm.asp中,原先程式碼如下,程式碼即是寫在灰色區塊範圍中。dimstrRedirectURLifRequest(Flow_Refreshed)Ythen'如果需要現在重新解析流程,則必須呼叫Flow_Refresh.asp,然後再將流程轉回來,'要達到此功能,請將下列3行的註解符號去除掉.'通常這樣做的目的是為了以程式的方式來組合流程,且會將Session(blnFlowChanged)設定為True'以免程式組合完成的流程又被重新解析了'strRedirectURL=../Flow_Refresh.asp?strRedirectURL=&Session(FormID)&/BeforeSendNewForm.asp'Response.Clear'Response.RedirectstrRedirectURLendif'您可以在這裡加上程式設定的流程或是其他的程式碼'如果將Session(blnFlowChanged)設定為True,則流程不會再重新解析.'通常不需要設定,因為使用者如果有修改過,自然會變成True'除非您不管[使用者]是否有修改過流程,都[要]或[不要]重新解析流程,'否則不需要變更Session(blnFlowChanged).'Session(blnFlowChanged)=False'都[要]重新解析流程'Session(blnFlowChanged)=True'都[不要]重新解析流程Response.ClearResponse.Redirect../SendForm.asp?CallBeforeNewForm=Y四、核心程式碼說明此為核心程式碼的概觀,底下會詳細說明。DimrstTRFlowSetrstTRFlow=Session(rstTRFlow)在此時間點,EasyFlow的表單欄位資料及流程資料都還沒實際寫入到資料庫中,而流程資料是存在Session(“rstTRFlow”)變數之中,所以要先把流程資料讀出來,放到rstTRFlow變數之中。CallInitFlow(0010,0001)這行程式碼會呼叫一個InitFlow的函式,來「新增」一個關號10,支號1的新關卡,底下為這個InitFlow函式的內容。在函式第一行就是rstTRFlow.AddNew來新增一筆記錄,底下的程式碼則是該筆記錄中每個欄位的「預設值」。從這段程式碼中可以看出,流程關卡資料就是存在resdb資料表中,BeforeSendNewForm.asp執行完畢後,系統會將Session(“rstTRFlow”)裡的流程資料存到resdb裡面,然後再從流程第一關開始執行。所以如果要用程式碼去控制流程,就要在系統還沒存到資料庫並執行流程關卡前修改流程資料。建議開啟EasyFlow的resdb資料表參考,開啟方式為登入EasyFlow後,左邊選單最底下有個「線上輔助DimrstTRFlowSetrstTRFlow=Session(rstTRFlow)CallInitFlow(0010,0001)SetSession(rstTRFlow)=rstTRFlowSubInitFlow(aNewFlowNo,aNewBranchNo)rstTRFlow.AddNewrstTRFlow.Fields(resdb001).Value=Session(FormID)'表單代號rstTRFlow.Fields(resdb002).Value=Session(SheetNo)'表單單號rstTRFlow.Fields(resdb003).Value=aNewFlowNo'關號rstTRFlow.Fields(resdb004).Value=aNewBranchNo'支號rstTRFlow.Fields(resdb005).Value=1'流程角色rstTRFlow.Fields(resdb006).Value=2'簽核種類rstTRFlow.Fields(resdb007).Value='流程參數1當角色為1=員工時,填入員工代號rstTRFlow.Fields(resdb008).Value='流程參數2rstTRFlow.Fields(resdb009).Value='流程參數3rstTRFlow.Fields(resdb010).Value='流程參數4rstTRFlow.Fields(resdb011).Value=24'容許簽核時間rstTRFlow.Fields(resdb012).Value=N'是否自動ByPass?rstTRFlow.Fields(resdb013).Value=0'ByPass方式?rstTRFlow.Fields(resdb014).Value=Y'是否強制簽核?rstTRFlow.Fields(resdb015).Value=N'是否單一簽核?rstTRFlow.Fields(resdb016).Value=N'可否列印?rstTRFlow.Fields(resdb017).Value=Y'可否撤簽?rstTRFlow.Fields(resdb018).Value=Y'可否加簽?rstTRFlow.Fields(resdb019).Value=N'可否轉會?rstTRFlow.Fields(resdb020).Value=N'可否轉寄?rstTRFlow.Fields(resdb021).Value=N'可否新增附加檔?rstTRFlow.Fields(resdb022).Value=N'可否修改附加檔?rstTRFlow.Fields(resdb023).Value=N'可否刪除附加檔?rstTRFlow.Fields(resdb024).Value=Y'可否閱讀附加檔?rstTRFlow.Fields(resdb025).Value=N'簽核時密碼驗證?rstTRFlow.Fields(resdb026).Value=N'流程是否已經解析?EndSub說明」,裡面有個「資料庫結構」,就可以找到resdb資料表的說明了。底下有列幾個範例加以說明:○1新增關號10、支號10之關卡,用意為通知表單關係人。callInitFlow(“0010”,”0010”)rstTRFlow.Fields(“resdb005”).value=18rstTRFlow.Fields(“resdb006”).value=4‘其他為預設值,故不修改○2新增一個關卡(0020),裡面有兩個流程角色,一個是請12這個員工簽核,並設定簽核時間為2小時,超過時間就AutoBypass;另一個是通知填表人。‘新增員工12簽核callInitFlow(“0010”,”0010”)rstTRFlow.Fields(“resdb007”).value=“12”rstTRFlow.Fields(“resdb011”).value=2rstTRFlow.Fields(“resdb012”).value=“Y”‘其他為預設值,故不修改‘新增通知填表人callInitFlow(“0010”,”0020”)rstTRFlow.Fields(“resdb005”).value=18rstTRFlow.Fields(“resdb006”).value=4‘其他為預設值,故不修改○3新增一關卡(0100),要通知資訊部(假設部門代號為12100)所有成員。‘新增通知部門成員callInitFlow(“0100”,”0010”)rstTRFlow.Fields(“resdb005”).value=8rstTRFlow.Fields(“resdb007”).value=“12100”rstTRFlow.Fields(“resdb006”).value=4‘其他為預設值,故不修改五、如何使用表單欄位不論在BeforeSendNewForm.asp或BeforeApproveForm.asp中,表單畫面都已消失,故無法再使用document.all(“XXX”).value的方式來讀取表單欄位內容值。雖然表單畫面已消失,但資料其實還存在暫存資料表中,所以要透過特殊的方式將資料從暫存資料表中讀出來,其方式如下:程式碼中標紅色字的部分,請修改成自己要讀取的資料表名稱(請注意大小寫),以EasyFlow內建表單簽呈(STD012)而言,其資料表名稱為efstc,所以上面的程式碼會改成如下所示:DimobjRE,rstEFSTC,strSQLSetobjDB=Server.CreateObject(EF2KPublic.Database)strSQL=select*fromefstcwhere(1=2)SetrstEFSTC=objDB.CreateRecordset(strSQL,Session(strProcID))SetrstEFSTC=GetRS(rstEFSTC,rstEFSTC)接下來就可以用rstEFSTC.Fields(“XXX”).value的方式來讀取欄位的內容了。而GetRS這個函式的內容如下:FunctionGetRS(strRecordsetName,rst)DimrsDimstrSQL,i,j,nDimstrFieldstrSQL=select*fromrestawherestrProcID='&Session(strProcID)&'andRecordsetName='&strRecordsetName&'orderbystrProcID,RecordsetName,RecordIndex,FieldNameSetrs=objRE.CreateRecordset(strSQL,Session(strProcID))Ifrs.RecordCount0Thenrs.MoveLastn=rs(RecordIndex)Fori=1Tonrst.AddNewrst.Fields(0)=strFormIDrst.Fields(1)=strSheetNoForj=2Torst.Fields.Count-1strField=rst.Fields(j).Namers.Filter=RecordIndex=&i&andFieldName='&strField&'Ifrs.RecordCount0ThenSelectCaserst.Fields(j).TypeCase135'adDBTimeStamprst(strField)=CDate(rs(FieldValue))Case205'adLongVarBinary'暫時不處理CaseElserst(strField)=rs(FieldValue)EndSelectEndIfNextNextEndIfSetrs=NothingSetGetRS=rstEndFunctionDimobjRE,rstDRF,strSQLSetobjDB=Server.CreateObject(EF2KPublic.Database)strSQL=select*fromdrfwhere(1=2)SetrstDRF=objDB.CreateRecordset(strSQL,Se
本文标题:程式码塞流程文件
链接地址:https://www.777doc.com/doc-654836 .html