學習大綱:
- 了解最佳實踐的5條一般規則
- 如何使用Invoke Workflow活動
- 如果使你的項目更加簡潔高效
1. 最佳實踐
1) 在開始一個項目時,為每一個流程、子流程選擇合適的布局(FlowChart和Sequence)。
- 主流程用Flowchart/State Machine。一是能更清晰的了解整個項目;二是便於測試主流程中的某個單獨部分。
- 更高層面的決策或業務邏輯用Flowchart。
- UI交互用Sequence。一般交互都是一個活動接着一個活動的執行,沒有很多變化。
- 盡量不要使用嵌套的If活動,用Flowcharts代替會更容易理解。
2) 將整個流程分解為幾個更小的流程。開發者會通過將非常復雜的應用程序和算法分解成更小的可控的任務來實現它們。
- 每一小塊都可以獨立開發和測試。
- 一些流程可以在其他項目中重復利用,以減少開發時間。
- 在同一個項目中與多人合作開發。
3) 做好異常處理。異常處理用來捕獲和處理錯誤,至少要記錄這些錯誤用於之后分析。
- 把產生問題的流程放到Try Catch活動里。
- 把調用的外部流程放到Try Catch活動里。
- 將恢復操作放到Catch部分。
4) 使流程清晰可讀。可讀性好的流程更便於調試,而且在團隊項目里,別人可能需要使用你的流程。
- 使用描述性的名稱命名流程組件。
- 做好注釋和說明。
- 記錄實時的執行進度,這樣做有助於更快地查明錯誤。
- 將Workflow的設置保存到單獨的文件中,推薦使用JSON文件。
5) 保持運行環境的清潔。讓UiPath及時關掉不用的應用程序、窗口、網頁。
應用最佳實踐原則的好處:
- Reliable 可靠:能處理各種外部和內部的錯誤異常。
- Efficient 高效:減少開發時間;使程序在生產環境中流暢運行。
- Maintainable 維護:易於修改、合並、交接。
- Extensible 擴展:易於添加新情況。
2. Invoke Workflow File活動
使用Invoke Workflow File活動可以將一個項目分解成幾個小的組件,並且能將獨立的Workflow連接到一起。
1). 將Workflow中的某個Sequence保存為新的Workflow並調用它。
- 在Sap Login的Sequence上右鍵,選擇Extract as Workflow。
- 在彈出的窗口中命名新的Workflow為Sap Login。
- 在原Workflow里,Invoke Workflow File活動自動取代原先的Sequence。
這樣做的好處是,你可以隨意拖拽、復制Invoke Workflow File活動到Workflow的任何位置,也可以在其他項目里重復利用它。它便於維護和更新,也便於單獨進行測試。
2) 傳遞參數
- 在Enter User Data的Sequence里,timeout變量是本地變量,其余四個變量是全局變量。
- 右鍵Enter User Data,選擇Extract as Workflow。在提取出的Workflow中,本地變量timeout依然在Variables面板里保持不變,而其它四個全局變量出現在Arguments面板里。
-
在原本的Workflow中,會以一個Invoke Workflow File活動取代原先的Enter User Data Sequence。點擊Import Arguments,可以看到新Workflow的四個參數。
- 在Value列指定參數的值。可以直接填入固定值,也可以填入一個變量。
- 在Direction列指定參數的傳遞方向,In表示把值從Invoke活動所在的Workflow傳入被引用的Workflow(在本例中為從Flowchart傳給Enter User Data);Out表示把值從被引用的Workflow傳給Invoke活動所在的Workflow(從Enter User Data傳給Flowchart);In/Out則表示雙向傳遞,先傳入再傳出。
3) 多個Workflow組合
一般來說在執行Enter User Data(錄入用戶數據),首先需要Get User Data(獲取用戶數據)。
- 在主程序Flowchart里新建一個Sequence名為Get User Data,添加一些UI交互活動實現從網站取得用戶信息。取得的信息存放在變量里。
- 把這個Sequence提取為Workflow,把原先用來存儲用戶信息的變量設置為Out的參數。Out的參數是把Get User Data子Workflow的值,傳到主程序Flowchart里。Invoke Workflow File活動的Value一欄用來填寫保存傳出來的值的地方,一般是本地變量。
- 最后把Flowchart里保存用戶信息的變量填入到Enter User Data子Workflow對應的In參數的Value一欄里,把信息傳遞過去,並填入系統中。
3. 項目組織
實例:獲取x個用戶信息,並填入myCRM系統里。
思路:
- 獲取x個用戶信息
- 打開生成用戶信息的網站
- 生成並存儲x個用戶信息
- 關閉瀏覽器
- (上述活動放入一個Try-Catch里以保證程序的穩定性。)
- 把x個用戶信息填入myCRM系統
- 打開CRM應用程序
- 錄入x個用戶信息
- 循環x次(在循環內部添加Try-Catch,保證填寫某個用戶信息出錯時,不影響剩余的用戶信息的填寫。)
- Try-填入用戶信息
- Catch-登記錯誤信息
- 循環x次(在循環內部添加Try-Catch,保證填寫某個用戶信息出錯時,不影響剩余的用戶信息的填寫。)
- 關閉應用程序
過程:
本課需要我們整體的看某個項目,因此對於具體操作、活動不做詳細的說明。
- 主程序:
- 創建一個主Workflow和兩個子Workflow,可以按照從上到下的、從里到外的順序編號命名,提高可讀性。比如:0. Main,1. Get User,2. Insert User。
- 子程序-獲取用戶信息:
- 子程序1. Get User由一個Try-Catch活動構成。
- 在Try的部分,添加一個Open Browser活動打開生成用戶信息的網站。
- 在Open Browser的Do里添加一個Do While循環。設置一個counter變量作為循環變量,初始值為0。假設我們要取得10個用戶的信息,那么Do While活動的條件就是counter<10。10可以用參數numberOfUsers傳遞,方便隨時修改。Do While的主體里需要添加一個Assign活動,使counter=counter+1,否則會進入死循環。
- 在Do While里添加一個Invoke Workflow File活動,引入我們之前已經做好的獲取用戶信息的子程序,配好參數(Out,實在搞不清直接填In/Out),該子程序可以命名為1.1 getUserData。
- 保存多個用戶的信息最好使用datatable。在Do While活動之前添加一個Build Data Table活動,創建一個空的datatable變量usersDT,它包括Name列,Email列,Addr列和Status列(Status列用來記錄用戶信息是否正確輸入CRM)。在Do While里的Invoke Workflow File活動之后,添加一個Add Data Row活動,將從1.1 getUserData里取得的name,email,address寫入datatable。
- 在Do While活動之后添加一個Excel Application Scope活動,把usersDT存到excel文件users.xlsx里。添加一個Close Application活動關閉瀏覽器。
- 添加一個Output Data Table活動和Log Message活動用來驗證結果是否正確。
- 子程序-錄入用戶信息:
- 子程序2. InsertUsers由一個Workflow構成。如下圖:
- Load User 是一個Excel Application Scope活動,在其中添加Read Range活動讀取子程序1中存儲用戶數據的Excel文件users.xlsx。
- 在Read Range活動之后添加一個Assign活動,新建一個Datarow[](數組)類型的變量Rows,給它賦值usersDT.Select("Status is NULL"),表示選取Datatable里Status值為空或NULL的行。
- Select可以用來對Datatable的數據進行篩選,篩選結果是一個Datarow的數組。
- 在Google搜索datatable select可以查詢Select的語法。
- Load Users的部分現在如下圖所示:
- 在Flowchart的Load User后面添加Open Application活動,用來打開myCRM應用程序。
- 接下來,我們要做一個Flowchart的循環,來逐一添加用戶信息,而且可以使用我們之前已經寫好的EnterUser Workflow。這個循環基本如下:
- 判斷Datatable里是否還有下一個用戶數據需要錄入。
- 如果有則錄入數據。沒有則執行Close Application活動。
- 如果數據錄入成功,則繼續判斷Datatable是否還有下一行數據。
- 首先是一個Decision,判斷是否有下一行數據的。這需要知道當前執行到哪一行了,因此要創建一個計數用的變量counter,設置其初始值為0。
- 判斷條件為counter < Rows.GetLength(0)。Rows.GetLength(0)計算Rows這個數組變量中一共有幾個元素(DataRow)。
- 私以為在循環里應該有Assign活動為變量counter+1,視頻里沒有講到,此處請自行實驗。
- Try Add User實際上是一個Try Catch活動。Try的部分里:
- 添加一個Log Message活動記錄和顯示實時運行情況。
- 添加Invoke Workflow File活動把之前做好的錄入信息的workflow引入進來,並設置參數。
- 添加Assign活動,新建Boolean型變量haveError,賦值為False。因為如果程序運行到該位置還沒Catch到錯誤,說明用戶信息已經錄入成功了。
- 再添加一個Log Message活動記錄實時運行情況。
- 添加Excel Application Scope活動+Write Range活動,在users.xlsx的Status列寫入ok。
- 在Try的部分,我們可能遇到的問題是:
- 配置Invoke Workflow File的參數。如圖所示:
- Rows(counter)表示索引號為counter的行,即當前錄入的行。其后加上("Addr")就可以表示該行對應的Addr列的數據,最后加上.ToString將其轉換為字符串型。
- .Split(" "c)表示已空格為分隔符對前面的字符串進行拆分,(0)表示用Split方法拆分后得到的字符串數組里的第一個元素,在此例中即人名,(1)則表示姓。這個方法在此例中可以正常運行,因為全名里沒有包括中間名。
- Write Range活動的單元格地址。我們已知Status在D列,但是行號是變化的。寫法是"D"+(usersDT.Rows.IndexOf(Rows(counter))+2).ToString。
- Rows(counter)表示的是Rows變量里的第counter個元素(DataRow),也就是當前行。
- usersDT.Rows.IndexOf(DataRow)表示的是DataRow在usersDT的所有行里的索引號。
- 最后的結果+2。Excel的行號從1開始,而Datatable是從0開始,因此要+1。考慮到Excel里的第一行是標題行,因此需要再+1.
- 配置Invoke Workflow File的參數。如圖所示:
- 對於Try Add User的Catch的部分:
- 首先添加一個Log Message活動,寫入exception.Message和exception.Source,以獲得錯誤信息方便后期調試。
- 添加一個Assign活動,把haveError賦值為True。
- 添加一個和Try部分里的一樣的Excel Application Scope活動,只是寫入的內容為fail,表示錄入用戶信息失敗。
- 最后,對錄入信息是否成功的Decision進行設置,判斷條件為變量haveError。如果haveError的值為True則接着執行下一行;如果為False,此處使用的處理方法需要手動關閉myCRM,程序會自動打開myCRM。
- 修改程序項目-增加可讀性和靈活性
- 可讀性:修改每一個程序的名稱,使結構一目了然。
- 靈活性:將一些后期容易發生變化的設置寫入配置文件里,可以是excel文件、csv文件、或者JSON文件。此處使用JSON文件,它的易用性比較好。
- 私以為增加可讀性和靈活性的工作應該在開始制作這個項目的時候就同時進行,否則后期對活動的參數的修改很容易有遺漏或錯誤。
- 如何進行配置,可以參考下面的方法:
- 在項目文件夾里新建一個txt文件命名為config。
- 在config文件里按照JSON的書寫方式寫入配置的參數,如下圖。此處寫入了兩個參數,一個是Excel文件的路徑,一個是每次運行時提取多少個用戶的信息(回憶一下,在1.GetUser子程序里,Do While循環的條件是counter<你想要提取用戶信息的數量)。
- 保存並關閉config文件。
- 在UiPath里,以設置Excel文件路徑為例,首先在Load Users添加一個Read Text File活動。讀取config.txt的內容到變量configFile中。
- 添加Deserialize JSON Object活動,並配置jsonString參數為configFile,Output為一個新變量GlobalParams。
- 接着就需要把所有的Excel文件的地址修改為GlobalParams("usersFilePath").ToString。
- 對所以的主程序和子程序進行修改:
4. 練習(略)
*本課使用過的新活動、方法、函數等:
Deserialize JSON Object
Convert.ToInt32()
ps. OTZ 我已經記不清之前有什么了...