在氚雲中要想實現表單某個功能,第一個方法可以通過平台自己本身就有的“控件屬性”與“表單屬性”,這個方法非常方便簡單高效,但也有它的局限性,較復雜的功能無法實現,適用於對代碼不了解或不熟悉人員。第二個方法可以通過代碼實現,較於前者可以實現復雜的邏輯或功能。第一個方法,可以實現的功能包括有篩選值范圍限定、自動填充其它控件(本身是關聯表單才可填充)、計算公式、表單提交檢驗、業務規則(對其它表單增刪改查等,有些需設置條件)等等。第二個方法,可以實現的功能有打開其它表單並傳入數據、后台定時服務、操作流程運轉、綁定控件變化事件、設置提交表單后事件(當一個表單提交后首先會觸發業務規則,比如新增其它表單,再執行提交后事件,比如修改其他表單數據或狀態)等等。
下面圍繞第二個方法記錄說明一下自己遇到的問題以及解決方法。
一、控件取值、賦值、變更綁定等
二、表單提交檢驗,彈出提示信息
三、打開其它表單並傳數據
四、前端操作子表
五、前端調用后台業務邏輯
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 }
上述代碼是后端代碼,根據前端請求的名稱與參數,自定義返回的值。
至此是對氚雲部分功能的一個簡單介紹,后續會繼續說明其它部分功能所遇到的問題以及解決方法。
如有疏漏錯誤之處,還請不吝賜教!