基于氚云平台的应用开发学习(三)

这篇将继续围绕上篇所说的第二种方法,记录说明一下自己遇到的问题以及解决方法。

一、创建或更新包含子表的表单

二、流程事件变化后执行某些逻辑

一、创建或更新包含子表的表单

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



至此是对氚云部分功能的一个简单介绍,后续会继续说明其它部分功能所遇到的问题以及解决方法。

如有疏漏错误之处,还请不吝赐教!

 

原文地址:https://www.cnblogs.com/yijialong/p/9579331.html

时间: 2024-10-24 10:14:20

基于氚云平台的应用开发学习(三)的相关文章

氚云平台介绍

氚云平台介绍 一.概述 氚云,自由构建一切应用 1.属于PaaS+SaaS: 2.提供开发与运行业务应用程序的所有功能(包括数据库.业务定制.工作流与审批.数据分析.可编程云逻辑.实时部署)以及丰富的模板SaaS应用(包括CRM.进销存.费控.流程管理等): 3.允许企业个性化或者全新构建具有社交和移动特性的应用程序. 二.功能介绍 1.完善的支撑架构 组织机构,扁平.矩阵等架构全支持 角色权限,功能.数据.字段全控制 SNS,人与人.人与系统全协同 工作流,全业务流程驱动 任务管理,系统工作实

亚马逊AWS在线系列讲座——基于AWS云平台的高可用应用设计

设计高可用的应用是架构师的一个重要目标,但是基于云计算平台设计高可用应用与基于传统平台的设计有许多不同.云计算在给架构师带来了许多新的设计挑战的时候,也给带来了许多新的设计理念和可用的服务.如何在设计应用的时候充分利用云平台的各种特点是基于云计算设计的一个重要条件.在这个在线讲座中,我们将以亚马逊AWS云平台为例,讨论如何设计一个高可用应用. 我们先会根据AWS服务是否天然高可用.高容错的特点把常见的AWS服务分类.比如AWS把下面服务设计成高可用和高容错的服务: ·     Amazon S3

Web开发从零单排之一:在新浪云平台SAE上开发一个html5电子喜帖

需求描述: 本人大婚将至,女朋友说“现在都流行在微信上发电子请帖了,你不是技(cheng)术(xu)宅(yuan)嘛,不会连这个都搞不定吧” 本人嘴上说这等小事何足挂齿,但心里还是七上八下的,虽然自认为几年开发经验在工作上还算得心应手,但也因为工作项目局限,对Web开发特别是前端和建站技术接触不多 于是打开搜索引擎和女朋友一起看看现在市面上的服务,基本上都是给出一套模板,自己填上内容和照片后,生成电子请帖,而形式有网页也有单张图片的 收费也不贵,都在百元左右.但收费是小,面子是大啊,作为一个软件

钉钉氚云平台人事管理学习日记(二)单据流水号

今天产品小哥过来跟我说要做一个自动产生流水号的功能,由于该字段是位于表体,系统标准流水号功能只支持表头,所以需要进行开发. 设计思路:查询数据库中最大流水编号,+1 后update字段 其实有想过做一个种子表的,但由于其前面编号的规则是根据2个下拉框结果组合产生的,就是年+A字段+B字段+流水号,一种组合生成一种流水号编码,要根据所有组合一一创建种子表,不建议使用. 话不多说,上代码 using System;using System.Collections.Generic;using Syst

点云平台之CloudCompare开发

现在博客终于又要开始更新了,告别了靠想象搞科研的日子,所以现在的我显得还是比较无拘无束,在我学习生涯前2年这段备受煎熬与折磨的日子里,在当年那个环境我是不会这么去表达自己内心想法的(估计绝大部分人都不会),身边的例子让我更加坚信了,要做一只默默无闻的羔羊,也很庆幸这段经历并没有伴随着我学习生活的始终,在恩师的学成归来后这一切都提前结束了,在接下来的日子里我还是体会到了什么是科研,所以也算是没白来这一遭,唯一遗憾的只是这一切来的晚了点.同时我还是特别希望我的遭遇只是一个意外(最好是我想多了,其他人

基于.NET的CAD二次开发学习笔记一:CAD开发入门

1.AutoCAD .NET API由不同的DLL文件组成,它们提供用于访问图形文件或AutoCAD应用程序的包含丰富的类.结构.方法和事件.每一个DLL文件都定义不同的使用基于功能的库组织组件的命名空间. 下面是你将频繁地要使用的AutoCAD .NET API 的三个主要的DLL文件: AcDbMgd.dll. 当使用图形文件中的对象时使用这个DLL文件. AcMgd.dll. 当使用AutoCAD应用程序时使用这个DLL文件. AcCui.dll. 当使用自定义文件时使用这个DLL文件.

基于.NET的CAD二次开发学习笔记二:AutoCAD .NET中的对象

1.CAD对象:一个CAD文件(DWG文件)即对应一个数据库,数据库中的所有组成部分,看的见(包括点.多段线.文字.圆等)和看不见(图层.线型.颜色等)的都是对象,数据库本身也是一个对象. 直线.圆弧.文字和标注等图形对象都是对象. 线型与标注样式等样式设置都是对象. 图层.编组和块等组织结构都是对象. 视图与视口等图形显示都是对象. 甚至图形和 AutoCAD 应用程序本身也是对象. 2.CAD中的容器:对于任何一个DWG文件,都会创建下列容器对像:九个固定的符号表(如下)和有名对像字典(包含

基于GBT28181:SIP协议组件开发-----------第三篇SIP注册流程分析实现

上两章节简要的讲解了SIP组件开发接口和开发环境的搭建.在本节将实现Linux 32平台的UAS和UAC,当然该UAS和UAC只实现了注册功能,并且是基于自主开发SIP组件libGBT28181SipComponent.so的,没有这个组件是运行不了的.其他功能在后续章节中讲解. 首先简单讲解一下GBT28181关于注册描述 一. GBT28181注册的流程如下图 电力系统注册稍微复杂点,但原来基本相同.多了个刷新注册的过程. 二.GBT28181关于注册的解释如下 三.SIP协议简介 一个合法

linux驱动开发学习三:异步操作

前面的队列以及锁都是基于阻塞是的操作.要实现同步,还可以通过信号也就是异步的方式来进行.例如在往文件的写入字符后,发送一个信号.捕捉到信号后执行动作.这样就不会造成阻塞,之前的阻塞性IO和POLL,是调用函数进去检查,条件不满足是造成阻塞. 应用层启动异步通知机制就三个步骤: 1 调用signal函数,让指定的信号SIGIO与处理函数sig_handle对应 2 指定一个进程作为文件的”属主(filp-owner)”, 这样内核才知道信号要发给哪个进程 3 在设备文件中添加FASYNC标志,驱动