基于氚云平台的应用开发学习(二)
在氚云中要想实现表单某个功能,第一个方法可以通过平台自己本身就有的“控件属性”与“表单属性”,这个方法非常方便简单高效,但也有它的局限性,较复杂的功能无法实现,适用于对代码不了解或不熟悉人员。第二个方法可以通过代码实现,较于前者可以实现复杂的逻辑或功能。第一个方法,可以实现的功能包括有筛选值范围限定、自动填充其它控件(本身是关联表单才可填充)、计算公式、表单提交检验、业务规则(对其它表单增删改查等,有些需设置条件)等等。第二个方法,可以实现的功能有打开其它表单并传入数据、后台定时服务、操作流程运转、绑定控件变化事件、设置提交表单后事件(当一个表单提交后首先会触发业务规则,比如新增其它表单,再执行提交后事件,比如修改其他表单数据或状态)等等。
下面围绕第二个方法记录说明一下自己遇到的问题以及解决方法。
一、控件取值、赋值、变更绑定等
二、表单提交检验,弹出提示信息
三、打开其它表单并传数据
四、前端操作子表
五、前端调用后台业务逻辑
var enviroment = $.SmartForm.ResponseContext; //获取当前对象环境变量
enviroment.FormMode; //表单模式,值为1表示生效状态,值为0表示编辑状态
enviroment.ActivityCode; //流程环节,值是流程设计中流程对应的节点编码
enviroment.BizObjectId; //当前表单ID,可用于在后端sql中查询数据
详细了解可访问:氚云社区
一、控件取值、赋值、变更绑定等
this.BuyApply.GetValue();
//取值,这里BuyApply是图形设计中对应控件的编码(下同)
this.BuyApply.SetValue();
//赋值
this.BuyApply.BindChange( "Test", function( data ) {
//执行xxx事件
});
//变更绑定
this.BuyApply.SetVisible( false );
//隐藏,显示反之参数为true
this.BuyApply.SetReadonly( true );
//只读
var detailsList = this.D000399RhyjRuleDetails01.GetValue();
for( var i = 0;i < detailsList.length;i++ ) {
var cell1 = this.D000399RhyjRuleDetails01.GetCellManager( detailsList[ i ].ObjectId, "D000399RhyjRuleDetails01.FormName" );
cell1.SetReadonly( true );
}
//子表控件设置只读
二、表单提交检验,弹出提示信息
1 // 提交校验 2 OnValidate: function( actionControl ) { 3 var _this = this; 4 var flag = true; 5 6 //校验订单编号 7 var value = _this.No.GetValue(); 8 if( value.length > 12 ) { 9 $.IShowWarn( "提示:订单编号长度不得多于12位" ); 10 flag = false; 11 } else if( value.length < 6 ) { 12 $.IShowWarn( "提示:订单编号长度不得低于6位!" ); 13 flag = false; 14 } else { 15 var lastSix = value.substr( value.length - 6 ); 16 if( isNaN( lastSix ) ) { 17 $.IShowWarn( "提示:订单编号后6位不是数字!" ); 18 flag = false; 19 } 20 } 21 return flag; 22 },
弹出信息成功、提示、错误、警告方法分别对应:$.IShowSuccess(); $.IShowTip(); $.IShowError(); $.IShowWarn();
三、打开其它表单并传数据
1 var params = { BuyApply: $.SmartForm.ResponseContext.BizObjectId, ApplyDetail: outData.ReturnData }; 2 $.IShowForm( "D000399SgPurchaseOrder", null, params );
这里params是传递的参数,里面是键值对,$.SmartForm.ResponseContext.BizObjectId是当前表单的ID,outData.ReturnData是通过ajax请求后端并查询数据库得到的返回值,可以根据自己需求定义传递的参数。D000399SgPurchaseOrder是打开表单的编码,下面是这个表单怎么接收参数并填入对应控件中。
1 //接受采购申请数据 2 if( $.IGetParams( "BuyApply" ) != null ) { 3 _this.BuyApply.SetValue( $.IGetParams( "BuyApply" ) ); 4 _this.BuyApply.SetReadonly( true ); 5 _this.State.SetReadonly( true ); 6 var controlManager = _this.D000399SgOrderDetails; 7 //接受采购申请子表列表传递的参数 8 if( $.IGetParams( "ApplyDetail" ).length != 0 ) { 9 console.log( $.IGetParams( "ApplyDetail" ) ); 10 var length1 = Object.keys( $.IGetParams( "ApplyDetail" ).dicts1 ).length; 11 var i = 0; 12 if( length1 > 0 ) { 13 controlManager.ClearRows(); 14 } 15 for( var key in $.IGetParams( "ApplyDetail" ).dicts1 ) { 16 if( ++i > length1 ) { 17 break; 18 } 19 var subObjectId = $.IGuid(); 20 var subObject = $.IGetParams( "ApplyDetail" ).dicts1[ key ]; 21 controlManager.AddRow( subObjectId, { 22 "D000399SgOrderDetails.ControlCatalogue": subObject.ControlCatalogue, 23 "D000399SgOrderDetails.No": subObject.No, 24 "D000399SgOrderDetails.MaterialName": subObject.MaterialName, 25 "D000399SgOrderDetails.Type": subObject.Type, 26 "D000399SgOrderDetails.Unit1": subObject.Unit1, 27 "D000399SgOrderDetails.Num1": subObject.Num3, 28 "D000399SgOrderDetails.Node": subObject.Node1 29 }); 30 } 31 } 32 }
var controlManager = _this.D000399SgOrderDetails; //获取当前表单中子表对象
controlManager.ClearRows(); //清空子表行
var subObjectId = $.IGuid(); //子表每一行数据都有一个唯一的ID,这里是随机生成一个ID
var subObject = $.IGetParams( "ApplyDetail" ).dicts1[ key ]; //获取参数ApplyDetail中的所有键
controlManager.AddRow( subObjectId, { //根据上方生成的ID,添加子表行
});
"D000399SgOrderDetails.ControlCatalogue": subObject.ControlCatalogue; //根据键取值,并赋值给子表对应控件
上述是在表单中打开另一个表单,下面是在列表中打开另一个表单,代码是在列表设计中。
1 var objects = $.ListView.GetSelected(); 2 if( objects == null || objects == undefined || objects == "" ) { 3 $.IShowWarn( "提示:请选择!" ); 4 return; 5 } 6 if( objects.length > 1 ) { 7 $.IShowWarn( "提示:只能选择一条记录!" ); 8 return; 9 } 10 if( objects[ 0 ].Status != 1 ) { 11 $.IShowWarn( "提示:当前开票通知流程未结束!" ); 12 return; 13 } 14 15 16 if( actionCode == "ToD000399SgContractInvoice" ) { 17 var params = { ObjectId: objects[ 0 ].ObjectId }; 18 $.IShowForm( "D000399SgContractInvoice", null, params ); 19 }
var objects = $.ListView.GetSelected(); //获取选中行
actionCode == "ToD000399SgContractInvoice" //列表中自定义的按钮
objects[ 0 ].ObjectId; //选中第一条行的ID
四、前端操作子表
常见的有子表绑定添加行、绑定某一列变化事件、数据写入子表、更新子表、清空子表等。
1 var _this = this; 2 //采购订单明细子表绑定添加行事件 3 this.D000399SgOrderDetails.BindChange( "JudgeLine", function( changeRow ) { 4 if( changeRow[ 1 ] == "add" ) { 5 //若对应采购申请不为空,则检查子表行数 6 if( _this.BuyApply.GetValue() != "" ) { 7 var LineNum; 8 var dataParas = { BuyApply: _this.BuyApply.GetValue() }; 9 $.SmartForm.PostForm( 10 "GetLine", 11 dataParas, 12 function( outData ) { 13 LineNum = parseInt( outData.Message ); 14 }, 15 function( outData ) { 16 $.IShowWarn( outData ); 17 }, false ) 18 19 var detailsList = _this.D000399SgOrderDetails.GetValue(); 20 if( detailsList.length > LineNum ) { 21 $.IShowWarn( "提示:当前明细数量不得多于采购申请明细数量!" ); 22 } 23 } 24 } 25 });
上述代码是绑定添加行,当点击添加子表按钮时,会根据主表控件中对应的采购申请,去后端查询它明细的条数,当采购订单明细条数多于采购申请的明细条数,弹窗警告。
1 var _this = this; 2 //判断仓库物料目录是否存在 3 this.D000399SgOrderDetails.BindChange( "SonTable1", function( data ) { 4 var responseData = data[ 0 ]; 5 var currentRowId = data[ 0 ].ObjectId; //获取行ID 6 if( responseData != null && responseData.DataField == "D000399SgOrderDetails.ControlCatalogue" ) //触发变更的列 7 { 8 if( responseData.GetValue() != "" && _this.BuyApply.GetValue() != "" ) { 9 var dataParas = { ControlCatalogue: responseData.GetValue(), BuyApply: _this.BuyApply.GetValue() }; //传递的参数 10 $.SmartForm.PostForm( 11 "JudgeExit", 12 dataParas, 13 function( outData ) { 14 if( outData.Message != "" ) { 15 $.IShowWarn( "提示:对应采购申请不存在该仓库物料目录!" ); 16 _this.D000399SgOrderDetails.UpdateRow( currentRowId, { 17 "D000399SgOrderDetails.ControlCatalogue": "" 18 }); 19 } 20 }, 21 function( outData ) { 22 $.IShowWarn( outData ); 23 }, false ) 24 } 25 } 26 });
上述代码是绑定某一列变化事件,当写入仓库物料目录后,会根据主表控件中对应的采购申请,去后端查询它明细中是否存在该仓库物料目录,若没有则清空已填入的数据,并弹窗警告。其中responseData.GetValue();就是当前写入的仓库物料目录值,这里也涉及到了更新子表操作。
数据写入子表、更新子表、清空子表等功能,均在上面代码中能找到,总之先需要生成或获得每一条行数据的ID,然后再根据ID去填写数据或更新数据,这里不赘述。
五、前端调用后台业务逻辑
调用后端代码,还是通过常见的ajax请求的方式,后续这种方法可能会移除。这里通过一个简单的功能说明一下。
1 var _this = this; 2 var dataParas = {}; 3 $.SmartForm.PostForm( 4 "ReadMax", 5 dataParas, 6 function( outData ) { 7 _this.No.SetValue( outData.Message ); 8 }, 9 function( outData ) { 10 $.IShowWarn( outData ); 11 }, false )
上述代码,前端首先定义请求的名称,以及传入的参数,并将返回的数据填入对应控件。
1 public class D000399SgArMarginContract: H3.SmartForm.SmartFormController 2 { 3 public D000399SgArMarginContract(H3.SmartForm.SmartFormRequest request): base(request) 4 { 5 6 } 7 8 protected override void OnLoad(H3.SmartForm.LoadSmartFormResponse response) 9 { 10 base.OnLoad(response); 11 } 12 13 14 protected string ReadMax() { 15 return "000001"; //这里也可以查询数据库,根据上一条记录编号,来自定义返回的编号 16 } 17 18 protected override void OnSubmit(string actionName, H3.SmartForm.SmartFormPostValue postValue, H3.SmartForm.SubmitSmartFormResponse response) 19 { 20 if(actionName == "ReadMax") 21 { 22 string newString = ReadMax(); 23 response.Message = newString; 24 } 25 base.OnSubmit(actionName, postValue, response); 26 } 27 }
上述代码是后端代码,根据前端请求的名称与参数,自定义返回的值。
至此是对氚云部分功能的一个简单介绍,后续会继续说明其它部分功能所遇到的问题以及解决方法。
如有疏漏错误之处,还请不吝赐教!