zoukankan      html  css  js  c++  java
  • 基于氚云平台的应用开发学习(二)

    在氚云中要想实现表单某个功能,第一个方法可以通过平台自己本身就有的“控件属性”与“表单属性”,这个方法非常方便简单高效,但也有它的局限性,较复杂的功能无法实现,适用于对代码不了解或不熟悉人员。第二个方法可以通过代码实现,较于前者可以实现复杂的逻辑或功能。第一个方法,可以实现的功能包括有筛选值范围限定、自动填充其它控件(本身是关联表单才可填充)、计算公式、表单提交检验、业务规则(对其它表单增删改查等,有些需设置条件)等等。第二个方法,可以实现的功能有打开其它表单并传入数据、后台定时服务、操作流程运转、绑定控件变化事件、设置提交表单后事件(当一个表单提交后首先会触发业务规则,比如新增其它表单,再执行提交后事件,比如修改其他表单数据或状态)等等。

    下面围绕第二个方法记录说明一下自己遇到的问题以及解决方法。

    一、控件取值、赋值、变更绑定等

    二、表单提交检验,弹出提示信息

    三、打开其它表单并传数据

    四、前端操作子表

    五、前端调用后台业务逻辑

    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 }

    上述代码是后端代码,根据前端请求的名称与参数,自定义返回的值。

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

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

     

     
     
     
     
    
    
     
     
     
  • 相关阅读:
    Java设计模式—状态模式
    Java设计模式—备忘录模式
    android AsyncTask介绍
    Android UI线程和非UI线程
    Java设计模式—代理模式
    Java设计模式—命令模式
    <Android 应用 之路> MPAndroidChart~PieChart
    FPGA的EPCS 配置的2种方法 FPGA下载程序的方法(EPCS)
    如何将.sof转换成.jic
    quartus ii工程文件的分析
  • 原文地址:https://www.cnblogs.com/yijialong/p/9578619.html
Copyright © 2011-2022 走看看