1. 程式人生 > >基於氚雲平臺的應用開發學習(三)

基於氚雲平臺的應用開發學習(三)

ren sea member acc one principal 事件 tlist dstat

這篇將繼續圍繞上篇所說的第二種方法,記錄說明一下自己遇到的問題以及解決方法。

一、創建或更新包含子表的表單

二、流程事件變化後執行某些邏輯

一、創建或更新包含子表的表單

1、首先介紹關於在後端創建包含子表的表單:

 1 //根據ID查詢當前表單數據
 2 string sql1 = "select Warehouse1 as Warehouse1,MyProject as MyProject,Class1 as Class1,People as People,Dept as Dept," +
 3     "Principal as Principal from I_D000399SgProductionAcquisition where Objectid = ‘
" + ObjectId + ""; 4 System.Data.DataTable table1 = this.Engine.Query.QueryTable(sql1, null); 5 int rowCount1 = table1.Rows.Count; 6 7 //根據ID查詢當前表單子表數據 8 string sql2 = "select ControlCatalogue as ControlCatalogue,No as No,MaterialName as MaterialName,Type as Type,Unit1 as Unit1 " + 9 "from I_D000399SgBugApplyDetails where parentobjectid = ‘
" + ObjectId + ""; 10 System.Data.DataTable table2 = this.Engine.Query.QueryTable(sql2, null); 11 int rowCount2 = table2.Rows.Count; 12 13 List < H3.DataModel.BizObject > _list = new List<H3.DataModel.BizObject>(); 14 for(int i = 0;i < rowCount2; i++) { 15 //創建子表對象 16 H3.DataModel.BizObject childBo = new
H3.DataModel.BizObject(this.Request.Engine, this.Request.Engine.BizObjectManager.GetPublishedSchema("D000399SqOutbound01"), this.Request.UserContext.UserId); 17 childBo["ControlCatalogue"] = table2.Rows[i]["ControlCatalogue"].ToString(); 18 childBo["No"] = table2.Rows[i]["No"].ToString(); 19 childBo["MaterialName"] = table2.Rows[i]["MaterialName"].ToString(); 20 childBo["Type"] = table2.Rows[i]["Type"].ToString(); 21 childBo["Unit1"] = table2.Rows[i]["Unit1"].ToString(); 22 childBo.Create(); 23 _list.Add(childBo); 24 } 25 26 //創建主表對象 27 H3.DataModel.BizObject bo = new H3.DataModel.BizObject(this.Engine, this.Engine.BizObjectManager.GetPublishedSchema("D000399SqOutbound"), this.Request.UserContext.UserId); 28 bo["WDate"] = DateTime.Today.ToString("yyyy-MM-dd"); 29 bo["YearMonth"] = DateTime.Today.ToString("yyyyMM"); 30 bo["Title"] = "審核批量,生產領用出庫"; 31 bo["Acquisition"] = ObjectId; 32 bo["No"] = No; 33 bo["Money"] = AllMoney; 34 for(int i = 0;i < rowCount1; i++) { 35 bo["Warehouse1"] = table1.Rows[i]["Warehouse1"].ToString(); 36 bo["MyProject"] = table1.Rows[i]["MyProject"].ToString(); 37 bo["Class"] = table1.Rows[i]["Class1"].ToString(); 38 bo["People"] = table1.Rows[i]["People"].ToString(); 39 bo["Dept"] = table1.Rows[i]["Dept"].ToString(); 40 bo["Principal"] = table1.Rows[i]["Principal"].ToString(); 41 } 42 bo["D000399SqOutbound01"] = _list.ToArray(); 43 bo.Status = H3.DataModel.BizObjectStatus.Effective; 44 bo.Create();

上述代碼是根據ID,查詢某表單以及其子表數據,再將數據對應賦值給創建的表單以及創建表單的子表,這裏表單或者其子表的ID都是系統自己隨機生成,同時可以設置創建表單的狀態,需要註意的是這裏創建後的表單繼續會觸發它對應的業務規則。

2、再介紹關於在後端更新包含子表的表單:

 1 //查詢當前表單子表中需要沖減的數量
 2 string sql1 = "select ControlCatalogue as ControlCatalogue,Num3 as Num3 from I_D000399SgBuyDetails" +
 3     " where parentobjectId = ‘" + BuyApply + "‘ and Num3 != 0";
 4 System.Data.DataTable table1 = this.Engine.Query.QueryTable(sql2, null);
 5 int rowCount1 = table1.Rows.Count; 
 6 
 7 H3.Data.Filter.Filter filter = new H3.Data.Filter.Filter();
 8 H3.Data.Filter.And andMatcher = new H3.Data.Filter.And();
 9 
10 andMatcher.Add(new H3.Data.Filter.ItemMatcher("ObjectId", H3.Data.ComparisonOperatorType.Equal, UseAllPlan));
11 filter.Matcher = andMatcher;
12 H3.DataModel.BizObjectSchema accountSchema = this.Request.Engine.BizObjectManager.GetPublishedSchema("D000399SgUseAllPlan");
13 H3.DataModel.BizObject[] customers = H3.DataModel.BizObject.GetList(this.Request.Engine, this.Request.UserContext.UserId,
14     accountSchema, H3.DataModel.GetListScopeType.GlobalAll, filter);
15 if(customers != null && customers.Length > 0)
16 {
17     H3.DataModel.BizObject[]  details = (H3.DataModel.BizObject[]) customers[0]["D000399SgUseAllDetails"];
18     List < H3.DataModel.BizObject > boList = new List<H3.DataModel.BizObject>();
19     //保存原子表記錄,先獲取子表內容,循環將其原有數據添加到boList
20     if(details != null)
21     {
22         foreach(H3.DataModel.BizObject dt in details)
23         {
24             for(int i = 0;i < rowCount1; i++) {
25                 string ControlCatalogue = table1.Rows[i]["ControlCatalogue"].ToString();
26                 string Num3 = table1.Rows[i]["Num3"].ToString();
27 
28                 if(string.Equals(dt["ControlCatalogue"], ControlCatalogue))
29                 {
30                     int temp1 = Convert.ToInt32(dt["Num4"]) - Convert.ToInt32(Num3);
31                     dt["Num4"] = Convert.ToString(temp1);
32                     int temp2 = Convert.ToInt32(dt["Num5"]) + Convert.ToInt32(Num3);
33                     dt["Num5"] = Convert.ToString(temp2);
34                 }
35             }
36             boList.Add(dt);
37         }
38     }
39     H3.DataModel.BizObjectSchema schema = this.Request.Engine.BizObjectManager.GetPublishedSchema("D000399SgUseAllPlan");
40     H3.DataModel.BizObject schemaObject = new H3.DataModel.BizObject(this.Request.Engine, schema, this.Request.UserContext.UserId);
41     schemaObject.ObjectId = UseAllPlan;  //更新的表單ID為UseAllPlan
42     schemaObject.Load();
43     schemaObject["D000399SgUseAllDetails"] = boList.ToArray();
44     schemaObject.Update();
45 } 

上述代碼是根據ID,更新目標表單的子表數據,需要註意的是這裏更新後的表單同樣會觸發它對應的業務規則,如果不想觸發業務規則,也可采用sql語句更新的方式,如下所示。

1 //將‘項目信息‘中項目成員賦值給‘我的項目’的項目成員
2 string sql1 = "update I_D000399SgProjectMy set I_D000399SgProjectMy.Members = (select Members from I_D000399SgProject "+
3                 "where I_D000399SgProjectMy.Project = I_D000399SgProject.Objectid)";
4 this.Engine.Query.QueryTable(sql1, null);

二、流程事件變化後執行某些邏輯

當一個表單生效或作廢後,若有業務規則首先會執行業務規則,通常有更新或新增等操作。然後再執行流程變化後事件。前提是當前表單已經開啟了表單流程。代碼如下:

 1 protected override void OnWorkflowInstanceStateChanged(H3.Workflow.Instance.WorkflowInstanceState oldState, H3.Workflow.Instance.WorkflowInstanceState newState)
 2     {
 3         //流程審批結束,業務規則執行。還有個審批流程結束(finished狀態下直接刪除),就直接刪除也會觸發業務規則執行。在submit裏面處理
 4         if(oldState == H3.Workflow.Instance.WorkflowInstanceState.Running && newState == H3.Workflow.Instance.WorkflowInstanceState.Finished)
 5         {
 6             DoAfterPass1(this.Request.BizObject.ObjectId);
 7         }
 8         //流程審批結束後,重新激活,業務規則會執行。還有個審批流程結束(finished狀態下直接刪除),就直接刪除也會觸發業務規則執行。在submit裏面處理
 9         if(oldState == H3.Workflow.Instance.WorkflowInstanceState.Finished && newState == H3.Workflow.Instance.WorkflowInstanceState.Running)
10         {
11             DoAfterPass2(this.Request.BizObject.ObjectId);
12         }
13         base.OnWorkflowInstanceStateChanged(oldState, newState);
14     }

this.Request.BizObject.ObjectId; //當前表單的ID





至此是對氚雲部分功能的一個簡單介紹,後續會繼續說明其它部分功能所遇到的問題以及解決方法。

如有疏漏錯誤之處,還請不吝賜教!

 

基於氚雲平臺的應用開發學習(三)