郝勇 发表于 2020-3-14 07:20:09

氚云开发者手册学习历程

本帖最后由 郝勇 于 2021-4-10 18:05 编辑

氚云无代码设计基本掌握后,搭建了一些应用,应用太过初级,用起来不爽。

掌握氚云代码才能做出更好的产品,我没有从事过向对象的编程工作,多次阅读氚云开发者手册根本看不懂,对氚云代码的学习一直无法入门、无法突破。

氚云帮助的“开发者手册”对与我这种代码小白来说根本不知道如何使用。

在氚云社区管理员大土的引荐下观看了吴登杰吴总的视频:0基础入门代码,助力企业员工建立IT能力(以下简称吴总视频)。

吴总视频看完后,氚云开发者手册里的内容逐个验证、学习。现将入门过程记录如下,一方面记录下自己学习代码过程,另一方面分享给代码初学者入门哈。

氚云专业版提供了前后端代码编写功能(氚云后端语法为C#,前端语法为Javascript,数据库语法为MYSQL),大幅提升了系统的能力。能够实现前后台交互、数据库查询、对接第三方系统等较复杂功能。



一、从后端代码学起
1、开发者手册-后端常用接口示例-控件的取值、赋值

=================================
this.Request.BizObject["控件编码"]:其中控件编码是指表单设计-图形设计-控件属性中的“控件编码”。这点非常容易理解。this.Request.IsCreateMode:是否创建模式,true,false

应用编码(appcode)、表单编码(schemaCode、id)、控件编码

=================================

示例:

加载表单页面初始化赋值//吴总视频中对代码的添加位置做了详细说明,本文不再赘述,不知道添加位置的可仔细观看吴总视频。protected override void OnLoad(H3.SmartForm.LoadListViewResponse   response)    {          if(this.Request.IsCreateMode)    //判断是否为创建模式,赋值默认数值      {            this.Request.BizObject["F0000001"] = "表单加载默认值";//[]中内容是当前表单的控件编码,应修改为当前表单的相应控件编码,如图1:控件“单行文本”的控件编码是“ F0000001”。      }          base.OnLoad(response);    }
//以上代码的执行效果如图2。
//以上代码结合读取其他表单控件内容的代码即可实现能用于实际应用的加载默认功能。



提交时的赋值/取值      protected override void OnSubmit(string actionName,   H3.SmartForm.SmartFormPostValue postValue,   H3.SmartForm.SubmitSmartFormResponse response)    {          this.Request.BizObject["F0000001"] = "表单提交默认值";//在提交时直接赋值          string va =   this.Request.BizObject["F0000002"] + string.Empty;//将控件“副本_单行文本”的内容赋值给变量va,但为何要加入“+ string.Empty”还不理解,或许是将F0000002转换为字符串。开发者手册中该出这行有何用处不清楚,因此加了后面一行代码。          this.Request.BizObject["F0000003"] =va;//开发者手册中无本行          base.OnSubmit(actionName, postValue, response);      }
//以上代码是将当前表单的“单行文本”控件内容在提交时直接赋值"表单提交默认值",无论该控件填写什么内容都不会保存。//剩下两行代码是在提交时将输入“副本_单行文本”的内容赋值给“单行文本3”并保存。以上代码的执行效果如图3、图4

表单任意模式(创建模式、编辑模式)对控件赋值;    protected override void OnLoad(H3.SmartForm.LoadSmartFormResponse response)    {      string   userId = this.Request.UserContext.UserId + string.Empty; //获取当前用户ID         this.Request.BizObject["F0000002"] = userId; //"F0000002"为人员单选控件;      this.Request.BizObject["F0000003"] = DateTime.Now;//赋值当前时间,"F0000003"为日期控件
      base.OnLoad(response);}
















郝勇 发表于 2020-3-14 08:17:14

本帖最后由 郝勇 于 2020-4-25 16:20 编辑

2、开发者手册-后端常用接口示例-业务对象

添加业务对象在实际应用开发中,需要在某一个表单中创建或是添加另一个表单的数据,比如:CRM中把线索转为客户,在线索状态设置转为新客户就自动在客户表单中新增一条客户信息。
注:业务对象只可操作表单数据,无法操作氚云系统表的数据。
以下示例涉及两张表单:当前表单“A”和另一表单“B”。即在A表单中编写代码已实现向B表单中添加数据。=================================H3.DataModel.BizObjectSchema:业务对象的模式,在该类中定义了这个类型的业务对象的属性名称、属性类型、方法名称、方法返回值等信息 this.Request.Engine.BizObjectManager.GetPublishedSchema("D001321Sqcuqmkisn1aa0gs6j76y9c355"):获取模块(表单)SchemaH3.DataModel.BizObject:业务对象。业务对象默认提供对象的创建、获取、更新和删除方法;业务对象不支持序列化,但是其中ValueTable属性是可以序列化H3.DataModel.BizObject.Status:业务对象的状态,生效、草稿和作废this.Request.UserContext.UserId:当前登录用户IDH3.DataModel.BizObjectStatus.Effective:对象状态生效H3.DataModel. BizObject.Create():创建业务对象this.Request.BizObject.OwnerId:所有人,即拥有者
=================================主表业务对象创建://得到一个IEngine对象H3.IEngine engine = this.Request.Engine;//获取系统虚拟用户的人员Id(表单设计后端类、列表设计后端类、定时器类、自定义接口类中都可以获取)string systemUserId = H3.Organization.User.SystemUserId;
//获取当前登录人的人员Id(只能在表单设计后端类、列表设计后端类中获取)string currentUserId = this.Request.UserContext.UserId;
//获取D00021**table表单的表单结构对象H3.DataModel.BizObjectSchema aSchema = engine.BizObjectManager.GetPublishedSchema("D00021**table");
//new一个D00021**table表单的业务对象H3.DataModel.BizObject aBo = new H3.DataModel.BizObject(engine, aSchema, systemUserId);
//设置业务对象的创建人为当前登录人aBo.CreatedBy = currentUserId;
//设置业务对象的归属人为当前登录人aBo.OwnerId = currentUserId;
//设置控件编码为F0000027(单行文本控件)的值aBo["F0000027"] = "https://www.h3yun.com/";
//设置控件编码为F0000024(日期控件)的值aBo["F0000024"] = DateTime.Parse("2020-03-18 00:00:00");
//设置控件编码为F0000039(数字控件)的值aBo["F0000039"] = 99;
//设置控件编码为F0000038(单选框控件)的值aBo["F0000038"] = "选项1";
//设置控件编码为F0000025(复选框控件)的值aBo["F0000025"] = "选项1;选项2";
//设置业务对象数据为生效状态aBo.Status = H3.DataModel.BizObjectStatus.Effective;
/*        aBo.Status的所有取值与意义:           H3.DataModel.BizObjectStatus.Draft:草稿           H3.DataModel.BizObjectStatus.Effective:生效(若此表单有业务规则,则此项设置会在Create()中触发生效时业务规则)           H3.DataModel.BizObjectStatus.Running:进行中(此设置并不会发起流程,带流程的表单数据创建请参考他处,一般不会将数据状态设置成进行中)           H3.DataModel.BizObjectStatus.Canceled:作废*/
//将业务对象创建到数据库中,即创建到表名为i_D000001Account的表中aBo.Create();


=================================
示例:
主表的数据创建
//以下代码填写在A表中,具体位置见图1,实现在A表添加数据并提交后同时为B表添加数据。H3.DataModel.BizObjectSchema accountSchema =   this.Request.Engine.BizObjectManager.GetPublishedSchema("D001321Sqcuqmkisn1aa0gs6j76y9c355");   //获取模块(表单)Schema;双引号里内容是指B表的“表单编码”,表单编码可在图形设计中“表单属性”中直接看到,最方便的还是在“后端代码”界面复制:一般是第7行,public class后面一长串字符即为“表单编码”,如图1。使用该行代码时,“表单编码”一定要换成相应编码。          H3.DataModel.BizObject accountBo = new   H3.DataModel.BizObject(this.Request.Engine, accountSchema,   this.Request.UserContext.UserId); //构造对象         accountBo["F0000001"]   = "C0001";   //给自定义属性赋值;方括号里为控件编码         accountBo["F0000002"] =   "环盈科技";         accountBo.Status =   H3.DataModel.BizObjectStatus.Effective;//将对象状态设置为生效,不赋值默认为曹稿(论坛发帖过滤不智能,拼音都被过滤了,只能用同音字替代)          accountBo.Create(); //创建对象
//以上代码填写在A表中,A表提交数据时即可在B表中添加数据。执行效果如图2、图3。

//当前A表中内容提交后同时填写到B表中。将前面所提到的代码融合在一起,如下:

H3.DataModel.BizObjectSchema accountSchema =   this.Request.Engine.BizObjectManager.GetPublishedSchema("D001321Sqcuqmkisn1aa0gs6j76y9c355");   //获取模块Schema;双引号里内容是指的“表单编码”,表单编码可在图形设计中“表单属性”中直接看到,最方便的还是在“后端代码”界面复制:一般是第7行,public class后面一长串字符即为“表单编码”,如图1。使用该行代码时,“表单编码”一定要换成相应编码。          H3.DataModel.BizObject accountBo = new   H3.DataModel.BizObject(this.Request.Engine, accountSchema,   this.Request.UserContext.UserId); //构造对象         accountBo["F0000001"]   =   this.Request.BizObject["F0000001"];   //给自定义属性赋值;方括号里为控件编码         accountBo["F0000002"]   =   this.Request.BizObject["F0000002"];         accountBo.Status =   H3.DataModel.BizObjectStatus.Effective;//将对象状态设置为生效,不赋值默认为曹稿(论坛发帖过滤不智能,拼音都被过滤了,只能用同音字替代)          accountBo.Create(); //创建对象




携带子表数据的创建//以下这段代码添加在A表中,实现A表提交后向B表增加记录的功能,当然增加的是代码中双引号里的固定字符。
H3.DataModel.BizObjectSchema schema =   this.Request.Engine.BizObjectManager.GetPublishedSchema("D001321Sqcuqmkisn1aa0gs6j76y9c355");//表单编码为B表的主表表单编码            H3.DataModel.BizObject obj = new   H3.DataModel.BizObject(this.Request.Engine, schema,   this.Request.UserContext.UserId); //主表对象            obj.CreatedBy   = this.Request.BizObject.OwnerId;             //以下四行为B表主表的控件编码            obj["F0000001"] = 1;            obj["F0000002"] = "其他";            obj["F0000003"] = "其他";            obj["F0000004"] = "其他";
            List <   H3.DataModel.BizObject > lstObject = new List<H3.DataModel.BizObject>();            H3.DataModel.BizObject zibiao = new   H3.DataModel.BizObject(this.Request.Engine,   schema.GetChildSchema("D001321F08cdcde36a934fe992e5514f7f91347c"),   this.Request.UserContext.UserId);//子表对象;GetChildSchema为B表子表的控件编码            zibiao["F0000005"] ="12";    //向B表子表BZ1控件赋值“12”            zibiao["F0000006"] ="34"; //向B表子表BZ2控件赋值“34”            lstObject.Add(zibiao);
            obj["D001321F08cdcde36a934fe992e5514f7f91347c"] = lstObject.ToArray(); //子表数据赋值;双引号内为B表子表的控件编码            obj.Create();   //创建对象//以上代码执行效果如图4

//将以上代码中的赋值内容固定字符换成当前表单的控件值的代码如下:H3.DataModel.BizObjectSchema schema =   this.Request.Engine.BizObjectManager.GetPublishedSchema("D001321Sqcuqmkisn1aa0gs6j76y9c355");//表单编码为B表的主表表单编码            H3.DataModel.BizObject obj = new   H3.DataModel.BizObject(this.Request.Engine, schema,   this.Request.UserContext.UserId); //主表对象            obj.CreatedBy   = this.Request.BizObject.OwnerId;             //以下四行为B表主表的控件编码;向B表主表四个控件赋值当前表单主表四个控件的值            obj["F0000001"] = this.Request.BizObject["F0000001"];            obj["F0000002"] = this.Request.BizObject["F0000002"];            obj["F0000003"] = this.Request.BizObject["F0000003"];            obj["F0000004"] = this.Request.BizObject["F0000004"];
            List <   H3.DataModel.BizObject > lstObject = new List<H3.DataModel.BizObject>();            H3.DataModel.BizObject zibiao = new   H3.DataModel.BizObject(this.Request.Engine,   schema.GetChildSchema("D001321F08cdcde36a934fe992e5514f7f91347c"),   this.Request.UserContext.UserId);//子表对象;GetChildSchema为B表子表的控件编码            zibiao["F0000005"] =this.Request.BizObject["F0000001"];    //向B表子表BZ1字段赋值当前表单主表控件A1的值            zibiao["F0000006"] =this.Request.BizObject["F0000002"]; //向B表子表BZ2字段赋值当前表单主表控件A2的值            lstObject.Add(zibiao);
            obj["D001321F08cdcde36a934fe992e5514f7f91347c"] = lstObject.ToArray(); //子表数据赋值;双引号内为B表子表的控件编码            obj.Create();   //创建对象//氚云使用无代码方式时氚云不支持子表值赋值给其他表,那么在代码中当前表单的子表控件值现在还不知道如何获取,学到后再分享。

郝勇 发表于 2020-3-14 15:18:51

本帖最后由 郝勇 于 2020-4-25 16:56 编辑

3、开发者手册-后端常用接口示例-业务对象


修改业务对象
与添加业务对象一样,修改业务对象主要实现不同表单之间的数据修改或更新。如:与客户签订合同成交后,把对应的客户状态设置为已成交客户。
===============================H3.DataModel.BizObject.Load(System.String,H3.IEngine,System.String,System.String,System.Boolean)H3.DataModel.BizObject.Load(this.Request.UserContext.UserId,this.Request.Engine,"schemaCode",this.Request.BizObjectId,false)
参数说明
"engine"业务对象访问引擎的连接
"schemaCode"业务对象模式编码
"objectId"业务对象Id
"requireRelatedObjects"

"userId"用户Id
返回值
加载好的业务对象

===============================示例:以下代码一直没弄明白,执行报错
H3.DataModel.BizObject accountBo =   H3.DataModel.BizObject.Load(this.Request.UserContext.UserId,this.Request.Engine,"schemaCode",this.Request.BizObjectId,false);   //Load对象(双引号内一大串字符为B表单编码,this.Request.BizObjectId为当前表单objectid)          accountBo["CustomerName"] = "深圳氚云网络科技有限公司";//修改对象属性值          accountBo["CustomerL**l"] = "已成交";      accountBo.Status =   H3.DataModel.BizObjectStatus.Effective; // 将对象状态设为生效          accountBo.Update();//更新对象

郝勇 发表于 2020-3-14 17:12:29

4、开发者手册-后端常用接口示例-业务对象

删除业务对象以下代码没搞明白,无法调通示例:
H3.DataModel.BizObject accountBo =   H3.DataModel.BizObject.Load(this.Request.UserContext.UserId,this.Request.Engine,"schemaCode",this.Request.BizObjectId,false);   //Load对象(schemaCode为表单编码,this.Request.BizObjectId为当前表单objectid)          accountBo["CustomerName"] = "深圳氚云网络科技有限公司";//修改对象属性值          accountBo["CustomerL**l"] = "已成交";      accountBo.Status =   H3.DataModel.BizObjectStatus.Effective; // 将对象状态设为生效          accountBo.Remove();//删除对象

郝勇 发表于 2020-3-14 17:13:46

5、开发者手册-后端常用接口示例-业务对象


查询业务对象先构建过滤器,过滤器支持各种条件组合类似sql的where条件并支持嵌套。示例:
H3.Data.Filter.Filter filter = new H3.Data.Filter.Filter();//构建过滤器                  H3.Data.Filter.And andMatcher = new H3.Data.Filter.And();    //构造And匹配器                  andMatcher.Add(new H3.Data.Filter.ItemMatcher("AccountName",   H3.Data.ComparisonOperatorType.Equal, "氚云")); //添加查询条件                  filter.Matcher = andMatcher;                  H3.DataModel.BizObjectSchema accountSchema =   this.Request.Engine.BizObjectManager.GetPublishedSchema("D000001Account");   //获取模块Schema                  H3.DataModel.BizObject[] customers =   H3.DataModel.BizObject.GetList(this.Request.Engine,   this.Request.UserContext.UserId,                  accountSchema,   H3.DataModel.GetListScopeType.GlobalAll, filter); //查询返回的结果对象

郝勇 发表于 2020-3-14 18:03:31

本帖最后由 郝勇 于 2021-4-24 16:18 编辑

开发者手册-后端常用接口示例-表单

表单按钮修改/增加表单按钮,初始化加载按钮。示例:
protected override void   OnLoad(H3.SmartForm.LoadSmartFormResponse response){                base.OnLoad(response);                response.Actions.Remove("Save");//删除按钮;系统“暂存”按钮                response.Actions.Remove("Submit");//删除系统“提交”按钮                response.Actions.Remove("Remove");//删除系统“删除”按钮                response.Actions.Remove("Print");//删除系统“打印”按钮                response.Actions.Remove("CancelInstance");//删除系统流程“作废”按钮                response.Actions.Remove("ViewQrCode");//删除系统查看“二维码”按钮                Dictionary   < string, H3.SmartForm.ViewAction > dicActions = new   Dictionary<string, H3.SmartForm.ViewAction>();                //重新添加按钮,并修改显示名称                dicActions.Add("Submit", new   H3.SmartForm.ViewAction("Submit", "一键初始化",   ""));                foreach(KeyValuePair < string, H3.SmartForm.ViewAction > action   in response.Actions)                      dicActions.Add(action.Key, action.Value);                response.Actions = new   Dictionary<string, H3.SmartForm.ViewAction>();                response.Actions = dicActions;}
/*   平台默认按钮key/按钮actionName大全:   Create:新增(图标编码-->icon-dian)   Import:导入(图标编码-->icon-import2)   Export:导出(图标编码-->icon-export2)   Remove:删除(图标编码-->icon-remove2)   PrintQrCode:打印二维码(图标编码-->icon-erweima)*/
按钮名称ActionName编码
暂存Save
提交Submit
删除Remove
撤回RetrieveInstance
同意Submit
不同意Reject
作废CancelInstance
打印Print
二维码ViewQrCode
全屏FullScreen
关闭Close
编辑Edit
转交Forward
已阅Read

更多内容详见:https://help.h3yun.com/contents/887/1004.html



发表于 2020-4-1 11:14:48

哈哈哈,一边学习一边验证,学起来超爽的。
加油加油。

李润光 发表于 2020-4-4 12:26:54

厉害,氛围激发学习。

庞聪 发表于 2020-4-9 00:04:20

我昨天第一次尝试使用后端代码,需要在后端直接调用人员多选控件或部门多选控件里的人员USERID,在开发手册里找不着,就在社区里搜。结果关注到这里来了。将会继续跟进学习!

大夫地 发表于 2020-4-13 21:01:14

楼主研究下:列表的某一列,当值等于“否”时,字体显示为红色,或背景色显示为红色。

大夫地 发表于 2020-4-13 21:02:29

第二个需求研究下:子表的某一列值相同时,不能提交。

大夫地 发表于 2020-4-13 21:04:47

第三个需求研究下:当前表单中的关联控件选择了目标表单的某一表单后(在提交前),其他人就不能再选择目标表单已被选择的表单。

王基 发表于 2020-5-15 15:01:46

this.Request.IsCreateMode:是否创建模式,true,false
这个创建模式是什么意思啊

一年级小学生 发表于 2020-8-21 14:22:41

庞聪 发表于 2020-4-9 00:04
我昨天第一次尝试使用后端代码,需要在后端直接调用人员多选控件或部门多选控件里的人员USERID,在开发手册 ...

select objectid,createdby,extractvalue(F0000007,'/ArrayOfString/string') as usersid from I_D001433c13b54e2936842609fff898de9c4ea84 where objectid='" + this.Request.BizObjectId + "'";
MySQL查询语句:F0000007是人员多选控件,查询出来结果赋值给QueryTable,然后在DataRow中获取usersid(获取的是多个人员id,中间用空格隔开),如果想得到每个人的id,就用字符串函数split以空格隔开,赋值给一个字符串数组就OK了。

冰哥 发表于 2021-1-27 11:05:15

MARK

柠檬遇上蜂蜜 发表于 2021-3-2 16:43:44

点赞,学习

郝勇 发表于 2021-3-31 17:53:47

本帖最后由 郝勇 于 2021-4-10 02:26 编辑

王基 发表于 2020-5-15 15:01
this.Request.IsCreateMode:是否创建模式,true,false
这个创建模式是什么意思啊

$.SmartForm.ResponseContext.FormMode   // 0为审批/办理 1为办理完结 2为创建 4为查阅

郝勇 发表于 2021-4-10 11:13:42

本帖最后由 郝勇 于 2021-4-13 17:13 编辑

向铎老师直播学习历程



第一讲:一般控件的前后端操作
直播录像如下
https://h5.dingtalk.com/group-live-share/index.htm?encCid=2836994b1e954d690a81d8954b28820b&liveUuid=9bd7c46d-f2e6-4400-b2ef-5795d93965d7#/

前端代码

GetValue()、GetText()——获取文本、SetReadonly()、SetVisible()等方法的使用;

注意:
1、添加代码位置:在OnLoad:function()中;
2、前端代码区分大小写;
3、氚云新版表单和旧版表单视图的前端代码编辑器不同,建议始终在新版下;
如何获取前台控件的值?

答:获取前台控件的值使用前端控件的GetValue()方法,该方法适用于文本控件、日期控件、数值、选项控件、关联表单、子表控件。详见氚云开发者手册:https://help.h3yun.com/contents/241/799.html

1、GetValue()方法示例
// 表单插件代码
$.extend($.JForm,{
    // 加载事件
    OnLoad:function(){

       var data = this.F0000001.GetValue(); //获得文本控件的值
       alert(data);   //弹框该文本控件的值;注意:论坛屏蔽,在使用时将alert()转换为半角

    },

//弹框见图1

2、GetText()方法示例
// 表单插件代码
$.extend($.JForm,{
    // 加载事件
    OnLoad:function(){

       var data = this.F0000001.GetText(); //获得文本控件的值
       alert(data);   //弹窗该文本控件的值;注意:论坛屏蔽,在使用时将alert()转换为半角

    },


//弹框见图1

//GetText()和GetValue()区别
GetText()获取文本值,比如获取关联表单控件的数据标题文本;GetValue()获取GUID,比如获取关联表单控件的ObjectId;

测试用例如下:
// 表单插件代码
$.extend($.JForm,{
    // 加载事件
    OnLoad:function(){

       var dataText = this.F0000001.GetText();//获取单行文本控件F0000001的文本值


       var dataValue = this.F0000002.GetValue();//获取关联表单控件F0000002的值
      
       **(dataText); //弹框如图1
      
       **(dataValue);//弹框如图2

    },

//表单如图3






3、SetReadonly()方法
// 表单插件代码
$.extend($.JForm,{
    // 加载事件
    OnLoad:function(){

      this.F0000001.SetReadonly(false);//单行文本控件F0000001
      this.F0000002.SetReadonly(true);    //关联表单控件F0000002
    },


4、SetVisible()方法
// 表单插件代码
$.extend($.JForm,{
    // 加载事件
    OnLoad:function(){

      this.F0000002.SetVisible(false);

    },



控件
控件取值/赋值
this.F0000002.GetValue(); //获取控件值,   F0000002为控件编码this.F0000002.GetText();//获取控件文本值,   F0000002为控件编码this.F0000002.SetValue("");//控件赋值, F0000002为控件编码


其他常见方法
1、获取人员/部门控件值用GetUnitDS;
2、下拉框、单选框、多选框清空项用ClearItems(),添加选项用AddItem(value);应用场景比如根据不同的角色拥有不同选项;
3、子表的GetCellManager以后,获得的对象,不能使用GetText和AddItem;



后端代码
1、初始值赋值务必填写在Onload中;
    protected override void OnLoad(H3.SmartForm.LoadSmartFormResponse response)
    {

      this.Request.BizObject["F0000001"]="张思";
      base.OnLoad(response);
    }

2、控件只读
    protected override void OnLoad(H3.SmartForm.LoadSmartFormResponse response)
    {

      this.Request.BizObject["F0000001"]="张思";
      base.OnLoad(response);
      response.ReturnData["F0000001"].Editable=false;//只读,即不可编辑
      response.ReturnData["F0000002"].Editable=false;
      response.ReturnData["F0000003"].Editable=false;
    }

3、控件可见、隐藏
    protected override void OnLoad(H3.SmartForm.LoadSmartFormResponse response)
    {

      this.Request.BizObject["F0000001"]="张思";
      base.OnLoad(response);
      response.ReturnData["F0000001"].Visible=false;//不可见,即隐藏
      response.ReturnData["F0000002"].Visible=false;
      response.ReturnData["F0000003"].Visible=false;
    }

注意:1、设置控件初始值放在base.OnLoad前面;2、设置控件可见、隐藏权限(属性)时放在base.OnLoad后面;3、多选控件赋值使用分号;隔开;包括复选框、人员多选、部门多选、关联表单多选控件    protected override void OnLoad(H3.SmartForm.LoadSmartFormResponse response)
    {

      this.Request.BizObject["F0000001"]="张思";
      this.Request.BizObject["F0000004"]="A;B";//F0000004为复选框控件

      base.OnLoad(response);
//       response.ReturnData["F0000001"].Visible=false;
    }


案例1:不同的角色看到不同的数据
    protected override void OnLoad(H3.SmartForm.LoadSmartFormResponse response)
    {


      base.OnLoad(response);

      //获取用户所有角色
      H3.Organization.OrgRole[] roles = this.Request.Engine.Organization.GetUserRoles(this.Request.UserContext.UserId, true);
      bool flag = false;
      foreach(H3.Organization.OrgRole item in roles)
      {
            if(item.Name == "金额查看")//金额查看为角色
            {
                flag = true;
            }
      }
      response.ReturnData["money"].Visible = flag;

    }
案例2:不同的角色能选择不同的下拉框选项:复选框
后端代码如下:    protected override void OnLoad(H3.SmartForm.LoadSmartFormResponse response)
    {


      base.OnLoad(response);

      //获取用户所有角色
      H3.Organization.OrgRole[] roles = this.Request.Engine.Organization.GetUserRoles(this.Request.UserContext.UserId, true);
      bool flag = false;
      foreach(H3.Organization.OrgRole item in roles)
      {
            if(item.Name == "金额查看")
            {
                flag = true;
            }
      }
//      response.ReturnData["money"].Visible = flag;
      response.Message=flag + string.Empty;//传递到前端;并且将bool类型的flag转换为string类型


    }

前端代码如下:
    // 加载事件
    OnLoad: function() {

      var flag = $.SmartForm.ResponseContext.Message;//前端API

环境参数,详见https://help.h3yun.com/channels/3.html#%E5%89%8D%E7%AB%AFAPI



      //**(flag);//弹框显示flag的值
      //debugger;//调试断点,配合浏览器“检查”
      if( flag == "False" )
      {
            this.F0000004.ClearItems();
            this.F0000004.AddItem("一");
            this.F0000004.AddItem("二");
            this.F0000004.AddItem("三");

      }


有一个坑描述:如果我设置某个字段为不可写(图形设计界面设置),然后我用前端代码设置了值,它实际上是不会保存到数据库里面去的,你必须手动把PostValue里面的值赋到this.Request.BizObject里面去
1、图形设计中将文本控件F0000001设置为不可写;
2、前端代码如下:    // 加载事件
    OnLoad: function() {
      this.F0000001.SetValue("张三");
},

3、后端代码为:
protected override void OnSubmit(string actionName, H3.SmartForm.SmartFormPostValue postValue, H3.SmartForm.SubmitSmartFormResponse response)
{

this.Request.BizObject["F0000001"]=postValue.Data["F0000001"]+string.Empty;
    base.OnSubmit(actionName, postValue, response);
}






郝勇 发表于 2021-4-10 15:49:38

本帖最后由 郝勇 于 2021-4-10 21:50 编辑

向铎老师直播学习历程

第二讲:氚云子表的常见操作
直播录像如下

https://h5.dingtalk.com/group-live-share/index.htm?encCid=2836994b1e954d690a81d8954b28820b&liveUuid=af732d3a-28f0-4a51-8397-507a651394a0#/

主表、子表都是BizObject;parentObjectid指向主表才使主表、子表关联起来
1、前端子表常见方法AddRow、ClearRows、UpdateRow、ClearRows氚云开发手册:https://help.h3yun.com/contents/895/1011.html
表单加载时子表的空行不显示(清空)
前端代码如下:
    // 加载事件
    OnLoad: function() {
        this.D001321Ff34d161e0752423596c0894bfd78e727.ClearRows();//其中D001321Ff34d161e0752423596c0894bfd78e727为子表控件编码
},

表单加载时子表添加数据(数据初始化)   
    // 加载事件
    OnLoad: function() {

      this.D001321Ff34d161e0752423596c0894bfd78e727.ClearRows();//先清空表单加载默认的空行
      var controlManager = this.D001321Ff34d161e0752423596c0894bfd78e727;//获取子表控件对象
      var subObjectId = $.IGuid();//创建行ID,即声明子表Id
      controlManager.AddRow( subObjectId, {
            "D001321Ff34d161e0752423596c0894bfd78e727.F0000005": "你好",

      })

},

表单加载时更新子表数据
//更新子表第一行数据
      var currentRowId = this.D001321Ff34d161e0752423596c0894bfd78e727.GetValue()[ 0 ].ObjectId; //第一行子表ID
      this.D001321Ff34d161e0752423596c0894bfd78e727.UpdateRow( currentRowId, {
            "D001321Ff34d161e0752423596c0894bfd78e727.F0000005": "你好",
      });

//更新子表第二行数据
      var currentRowId = this.D001321Ff34d161e0752423596c0894bfd78e727.GetValue()[ 1 ].ObjectId; //第二行子表ID
      this.D001321Ff34d161e0752423596c0894bfd78e727.UpdateRow( currentRowId, {
            "D001321Ff34d161e0752423596c0894bfd78e727.F0000005": "你好",
      });
//遍历更新子表数据
      var zibiao = this.D001321Ff34d161e0752423596c0894bfd78e727.GetValue();
      for( var i = 0;i < zibiao.length;i++ ) {
            var currentRowId = zibiao[ i ].ObjectId; //遍历子表ID
            this.D001321Ff34d161e0752423596c0894bfd78e727.UpdateRow( currentRowId, {
                "D001321Ff34d161e0752423596c0894bfd78e727.F0000005": "你好",
            });
      }

2、BindChange()绑定控件变化事件
//主表绑定控件变化事件
       this.F0000001.BindChange("key",function(){
            **("改变了");//alert()--警告消息框
      })

//主表控件F0000001发生控件变化事件将主表F0000007的值赋值给主表控件F0000008注意:BindChange应写在表单前端OnLoad事件里,BindChange第一个参数key为任意的一个不重复字符串。
      var that = this;
      that.F0000001.BindChange( "key", function() {            //此处是回调函数,要将this换成上面定义的that
            //获取值
            var value1 = that.F0000007.GetValue();
            //设置值
            that.F0000008.SetValue( value1 );
      });

//主表控件F0000007发生变化事件时则主表控件F0000008不可写
      var parent=this;
      this.F0000007.BindChange('key',function(){
            parent.F0000008.SetReadonly(true);
      })


//子表绑定控件变化事件
      this.D001321Ff34d161e0752423596c0894bfd78e727.BindChange('key',function(res){
            if(res[ 0 ].DataField=="D001321Ff34d161e0752423596c0894bfd78e727.F0000005"){
                **("改变了");//alert()--警告消息框
            }
      })
//子表控件F0000006发生变化事件则控件F0000005不可写
如何控制子表某一列的值变更时,控制其他列的值?
参见氚云开发手册:https://help.h3yun.com/contents/241/799.html

获取子表中的控件GetCellManager()参见氚云开发手册:https://help.h3yun.com/contents/895/1011.html

      var parent=this;
      this.D001321Ff34d161e0752423596c0894bfd78e727.BindChange('key',function(res){
            if( res.DataField == "D001321Ff34d161e0752423596c0894bfd78e727.F0000006"){
                var objectid = res[ 0 ].ObjectId;
                var cellObj =parent.D001321Ff34d161e0752423596c0894bfd78e727.GetCellManager( objectid,"D001321Ff34d161e0752423596c0894bfd78e727.F0000005");
                cellObj.SetReadonly(true);
            }
      })




注意:BindChange()方法针对主表、子表的控件值改变的判断不同。

案例展示案例1:出库时,校验库存数量在氚云图形设计界面中表单设置->提交校验针对子表的校验无效。进销存场景中,本次出库数量大于库存数量的校验。库存出库场景的提交校验,氚云子表不显示也就无法添加???



案例2:子表数据的重复检验案例3:用业务规则向某一个目标表单的子表中添加数据


https://h5.dingtalk.com/group-live-share/index.htm?encCid=2836994b1e954d690a81d8954b28820b&liveUuid=889029c0-6e79-4350-a2c6-4ef4af09bd6c 第三讲
https://h5.dingtalk.com/group-live-share/index.htm?encCid=2836994b1e954d690a81d8954b28820b&liveUuid=81a58f33-be23-4f93-bf72-11d5507d8dea 第四讲
https://h5.dingtalk.com/group-live-share/index.htm?encCid=2836994b1e954d690a81d8954b28820b&liveUuid=4153e099-5f3a-458e-a9a4-75cea6299981 第五讲
https://h5.dingtalk.com/group-live-share/index.htm?encCid=2836994b1e954d690a81d8954b28820b&liveUuid=ce085898-985f-41e3-84f8-ede7300c62d2 第六讲










小庆 发表于 2021-6-3 11:55:53

郝勇 发表于 2021-4-10 11:13
向铎老师直播学习历程




分享视频失效了,能在分享下吗?谢谢
页: [1] 2
查看完整版本: 氚云开发者手册学习历程