常用经验总结-开发篇(珍藏版)

by RainBirda 2016.2.24 16:29
注:脚本执行有风险,对于客户正式环境请在研发指导下执行。在U9一年多的业务开发中,遇到了不少问题,在小伙伴的帮助下,解决了这些问题,本文总结记录了部分问题的解决方案代码,平时都是珍藏的,良心实在不安,所以分享如下,以供参考,都是一些简单的代码,大神见笑。 命名规范 1、开发活动命名规范: 规则:模块_域用户名_问题号_说明。 例如:模块_u9baixf_20080801_转总账打印   2、代码注释命名规范 规则:日期 域用户名 问题号 说明。 例如:2014-11-18 hd 20080801 转总账打印     目录:   2、注册查找及删除按钮事件   3、前台删除子行数据   4、实体KEY赋值   5、打开模态窗体   6、取消按钮,父窗体不刷新   7、保存修改UIModel数据,并刷新页面   8、刷新数据   9、获取类的显示名称   10、列表显示本组织数据   11、单据复制后修改状态   12、在UI中手动删除数据   13、根据条件动态修改grid中指定行的某列的参照.   14、获取来源单据   15、判断当前是否是美瑞专版 取系统参数 CBO_Ver_MEIRUI   16、在IE状态栏显示提示信息   17、从数据库中查询枚举   18、获取全选数据,支持跨页选取   20、解决“参照列Org的(IDField)属性必须设置...”的问题   21、设置参照自定义过滤条件   22、获取基础设置参数值   23、获取属性的Value值注意事项   24、抛出异常定位某一行   25、回写单据时添加服务更新标志   26、保存列宽按钮无保存方案时灰化处理   27、获取实体字段和枚举对应的名称   28、Grid中参照列绑定组织列   29、列表中查询方案的查询条件赋默认值   30、修改列表中的数据后,翻页保留修改的数据   31、删除确认对话框   32、DTO查询跨页获取选中记录   33、列表双击导航到画面   34、根据控件名获取控件对象     2、注册查找及删除按钮事件   在AfterCreateChildControls()添加如下代码:   //注册删除 PDFormMessage.ShowDelConfirmDialog(this.Page, PDResource.GetDeleteConfirmInfo(), "", this.BtnDelete);   //注册查找 string formID = "be394e62-1497-4343-98e0-dfa3e24ed327"; PDFormMessage.ShowConfirmDialog(this.Page, formID, "580", "408", Title, wpFindID.ClientID, this.BtnFind);   3、前台删除子行数据 IUIRecord[] rules =  pack.GetChildRecords(this.CurrentModel.PackageSchema_PackSchemas_PackCodingRules); for (int i = rules.Length - 1; i >= 0; i--) { (rules[i] as PackageSchema_PackSchemas_PackCodingRulesRecord).Delete(); }   4、实体KEY赋值 packKitInfoDTO.Kit = kit.Key;   5、打开模态窗体 this.CurrentPart.ShowAtlasModalDialog(NoFreshButton, "UFIDA.U9.SCM.SD.IndividualDistributeUIModel.IndividualDistributeMainUIFormWebPart",ShipUIModelRes.IndividualDistribute, "890", "446", null, null, true, true, false);   //this.TaskId.ToString() 建立窗体的父子关系 string webPartID = "288a4409-ec6e-4c67-a69d-8ab741e8b325"; this.ShowModalDialog(webPartID, "窗体名称", "750", "350", this.TaskId.ToString(), null);   6、取消按钮,父窗体不刷新 this.BtnClose.IsClientClose = true;   this.CurrentPart.CloseDialog(false);   7、保存修改UIModel数据,并刷新页面 CommonAction.Save(model);   8、刷新画面数据 //重新加载单据画面 Action代码中调用 NavigateAction.MovePageAt(null, 单据ID);   //从数据库中重新加载当前索引位置的数据(必须绑定实体才行,若是DTO查询没有绑定实体则是不行) this.NavigateAction.Refresh(null);   //刷新DTO查询列表 this.Action.QueryAdjust();//该方法会回到第一页,如果只刷新当前页的数据可以使用下面方法:   /// <summary> /// 跳转到当前页 /// </summary> /// <param name="currentPageIndex"></param> private void GotoCurrentPage() {     IUFDataGrid dataGrid1 = (IUFDataGrid)this.CurrentPart.GetUFControlByName(this.CurrentPart.TopLevelContainer, "DataGrid1");       //获取当前页的索引     int currentPageIndex = dataGrid1.UIView.PageStrategy.CurrentPageIndex;       UFSoft.UBF.UI.WebControlAdapter.UFWebDataGridAdapter adapter = (UFSoft.UBF.UI.WebControlAdapter.UFWebDataGridAdapter)dataGrid1;       adapter.GridMakePage(new GridMakePageEventArgs(0, -1, enumPageAction.GotoPage, currentPageIndex)); }     9、获取单据类别的显示名称 /// <summary> /// 获取单据类别名称 /// </summary> /// <param name="docCategory">类名</param> /// <returns>单据类别名称</returns> private string GetDocCategoryName(string fullName) {     if (string.IsNullOrEmpty(fullName))     {         return string.Empty;      }      GetEntityDisplayNameProxy dispName = new GetEntityDisplayNameProxy();      dispName.EntityFullName = fullName;      string docCategoryName = dispName.Do();      return docCategoryName; }   10、列表显示本组织数据 在*ModelActionExtend.cs中CustomFilterOpath_Extend添加如下代码:   private string CustomFilterOpath_Extend(string filterOpath) {       //按组织过滤       filterOpath += "and Org = " + PDContext.Current.OrgID;       return filterOpath; }   11、单据复制后修改状态 在*UIModelActionExtend.cs文件的CopyClick_Extend实现复制的功能后进行二次赋值 示例代码如下: //复制 private void CopyClick_Extend(object sender, UIActionEventArgs e) {     //调用模版定义的默认实现方法.如需扩展,请直接在此编程.                             this.CopyClick_DefaultImpl(sender, e);       PackageSchemaRecord record = this.CurrentModel.PackageSchema.FocusedRecord;     if (record != null)     {         record.Status = (int)PackageSchemaStatusEnumData.Opened;     } }   12、在UI中手动删除数据 在*UIModelActionExtend.cs文件中的SaveClick_Extend方法中 将该记录标记为Delete状态,这样在保存时就会删除了,示例代码如下:   IUIRecord[] rules =                      pack.GetChildRecords(this.CurrentModel.PackageSchema_PackSchemas_PackCodingRules); for (int i = rules.Length - 1; i >= 0; i--) {      (rules[i] as PackageSchema_PackSchemas_PackCodingRulesRecord).Delete(); }   13、根据条件动态修改grid中指定行的某列的参照. 代码示例如下(利用callback): /// <summary> /// 动态改变物料参照 /// </summary> private void ItemOnCellFocusEnterCallBackEvents() { AssociationControl assoCGrid = new AssociationControl(); assoCGrid.SourceServerControl = this.DataGrid8; assoCGrid.SourceControl.EventName = "OnCellFocusEnter"; ((UFWebClientGridAdapter)assoCGrid.SourceControl).FireEventCols.Add("ItemInfo_ItemID");   ClientCallBackFrm ItemcallBackFrm = new ClientCallBackFrm(); ItemcallBackFrm.DoCustomerAction += new ClientCallBackFrm.ActionCustomer(ItemOnCellFocusEntercallBackFrm_DoCustomerAction); ItemcallBackFrm.ParameterControls.Add(this.DataGrid8); ItemcallBackFrm.Add(assoCGrid);   this.Controls.Add(ItemcallBackFrm); }   /// <summary> /// 动态改变物料参照 /// </summary> /// <param name="args"></param> /// <returns></returns> object ItemOnCellFocusEntercallBackFrm_DoCustomerAction(CustomerActionEventArgs args) { ArrayList list = (ArrayList)args.ArgsHash[UFWebClientGridAdapter.ALL_GRIDDATA_SelectedRows]; if (list.Count == 0) return args; int curIndex = int.Parse(list[0].ToString()); Hashtable hashT = (Hashtable)((ArrayList)args.ArgsHash[this.DataGrid8.ClientID])[curIndex]; UFWebClientGridAdapter grid = new UFWebClientGridAdapter(this.DataGrid8);   int transferFormType = Convert.ToInt32(hashT["TransferFormType"]); if (transferFormType == (int)UFIDA.U9.InvDoc.TransferForm.TransferFormTypeEnumData.PreTrans) { grid.ResetColumnEditorAttribute("ItemInfo_ItemID", UFWebClientRefControlAdapter.Attributes_RefType, "ed3b53e2-a25c-4c45-893b-8a0f8aaaabe0"); } else { grid.ResetColumnEditorAttribute("ItemInfo_ItemID", UFWebClientRefControlAdapter.Attributes_RefType, "82be9f01-b4b4-4766-b2c8-f1b079ef0c89"); } grid.Reset(); args.UpdateControls.Add(grid); //args.ArgsResult.Add("debugger;"+grid.ClientInstanceWithReSetRefType); return args; }   14、获取来源单据 1、在OnLoadData_Extend中获取来源单据的类型 int srcdoctype = Convert.ToInt16(this.CurrentPart.NameValues["SrcDocType"]); package.FieldSrcDocType.DefaultValue = srcdoctype;   2、在AfterUIModelBinding中 this.Model.DocPackage.FocusedRecord..SrcDocType 获取后台的来源单据类型   15、判断当前是否是美瑞专版 取系统参数 CBO_Ver_MEIRUI UFIDA.U9.Base.Profile.Profile.IsForMeirui();   select *  from  UBF_Assemble_AppComponents where component = 'UFIDA.U9.MFG.NEWSFC.SFCEquimentBListUI.WebPart.dll'   16、在IE状态栏显示提示信息 //查找的提示 PDResource 公共提示资源 this.ShowWindowStatus(PDResource.FindSucessInfo);   17、从数据库中查询枚举 select   x.EValue,               y.Name      from     UBF_Sys_ExtEnumValue x               inner join UBF_Sys_ExtEnumValue_Trl y on x.ID = y.ID      where    ExtEnumType in (               select  ID               from    UBF_Sys_ExtEnumType               where   Code = 'UFIDA.U9.PPR.RFQ.RFQStatusEnum')     18、获取全选数据,支持跨页选取 IList<IUIRecord> recs = this.CurrentModel.DSOLine.Cache.GetSelectRecord();   20、解决“参照列Org的(IDField)属性必须设置...”的问题 解决方案:给该列选择参照信息,代码列绑定,名称列绑定   21、设置参照自定义过滤条件 string strFilter = "OQL语句"; this.PayCarryFeeOrg289.CustomInParams = BaseAction.Symbol_AddCustomFilter + "=" + strFilter;   22、获取基础设置参数值      /// <summary>      /// 获取可用量占用的库存是否允许预留的参数值      /// </summary>      /// <returns></returns>      private bool IsAllowWhqohReserve()      {         UFIDA.U9.Base.Profile.Proxy.GetProfileValueProxy gpvp =             new UFIDA.U9.Base.Profile.Proxy.GetProfileValueProxy();         gpvp.ProfileCode = "INV_WhqohAllowReserve";//该参数对应的code         //gpvp.ProfileOrg = Convert.ToInt64(UFIDA.U9.Base.Context.LoginOrg.ID);         PVDTOData data = gpvp.Do();         if (data == null)             return false;         else             return Convert.ToBoolean(data.ProfileValue);       }   23、获取属性的Value值注意事项 使用GetValueOrDefault()避免报空引用错误。   24、异常定位到某一行 前台异常指定到某一行 IUIRecord CustomerLineRecord = cusline; //cusline是Record string fieldcusName = this.Model.QuickInputCustomer.FieldCustomerName.Name;//列名 this.Model.QuickInputCustomer.ErrorMessage.SetErrorMessage(ref CustomerLineRecord,fieldcusName, "客户和客户分类不能都为空,请录入。");   后台BE异常定位到某一行 //this指某行 throw new ApplicationExceptionBase("行号:" + this.DocLineNo + " 料号:" + this.ItemInfo.ItemCode + " 已进行版本数量控制,料品版本不能为空,请录入!");   25、回写单据时添加服务更新标志 soShipline.ActionSrc = UFIDA.U9.SM.Enums.SMActivityEnum.SOSRVUpd; soShipline.SOLine.ActionSrc = UFIDA.U9.SM.Enums.SMActivityEnum.SOSRVUpd; soShipline.SOLine.SO.ActionSrc = UFIDA.U9.SM.Enums.SMActivityEnum.SOSRVUpd;   26、保存列宽按钮无保存方案时灰化处理 设置保存列宽按钮的名字:btnSaveCurrentQueryCase   27、获取实体字段和枚举对应的名称 //UFIDA.U9.InvDoc.TransferOut.TransOutLine 为实体名 //TransOutOrg 、PurchaseOrder.EntityRes.BE_Name 为字段名 UFIDA.U9.InvDoc.TransferOut.TransOutLine.EntityRes.GetResource("TransOutOrg") PurchaseOrder.EntityRes.GetResource(PurchaseOrder.EntityRes.BE_Name); TransferTypeEnum.EnumRes.GetResource(this.TransOutLine.TransferOut.TransOutDocType.TransferType.Name)   28、Grid中参照列绑定组织列 (this.DataGrid1.Columns["TransOutWh"] as IUFFldReferenceColumn).IsMultiOrg = true; (this.DataGrid1.Columns["TransInWh"] as IUFFldReferenceColumn).IsMultiOrg = true;   UFIDA.U9.UI.PDHelper.ControlUtility.MultiOrgControlHelper.BindingToOrgForGrid("TransOutOrg", this.DataGrid1, "TransOutWh");   UFIDA.U9.UI.PDHelper.ControlUtility.MultiOrgControlHelper.BindingToOrgForGrid("TransInOrg", this.DataGrid1, "TransInWh");   29、列表中查询方案的查询条件赋默认值 在AfterGetQueryModel_Extend()方法中添加 QryService.CreateFilterValue(caseModel, "Org", PlatformContext.Current.OrgName, PlatformContext.Current.OrgCode, PlatformContext.Current.OrgID);   30、修改列表中的数据后,翻页保留修改的数据 /// <summary> /// 在AfterCreateChildControls中注册转订单数量及存储地点改变时postback事件 /// </summary> private void OnToTransOutQtyChanged_PostBack() {     AssociationControl assoCtrl = new AssociationControl();     assoCtrl.SourceServerControl = this.DataGrid1;     assoCtrl.SourceControl.EventName = "OnCellDataChanged";     IUFClientAssoGrid assGrid = (IUFClientAssoGrid)assoCtrl.SourceControl;     assGrid.FireEventCols.Add("ToTransOutQtyTU");     assGrid.FireEventCols.Add("ToTransOutQtyTBU");     assGrid.FireEventCols.Add("TransOutWh");     assGrid.FireEventCols.Add("TransInWh");     assGrid.FireEventCols.Add("TransOutBusDate");       CodeBlock cb = new CodeBlock();     UFWebClientGridAdapter gridAdapter = new UFWebClientGridAdapter(this.DataGrid1);     gridAdapter.IsPostBack = true;     gridAdapter.PostBackTag = this.DataGrid1.ID + "_" + assoCtrl.SourceControl.EventName;     cb.TargetControls.addControl(gridAdapter);     assoCtrl.addBlock(cb);       UFGrid gird = this.DataGrid1 as UFGrid;     GridCustomerPostBackDelegate actionDelegate =         new GridCustomerPostBackDelegate(ToTransOutQtyChanged_CustomerPostBackAction);     gird.GridCustomerPostBackEvent += actionDelegate; }   /// <summary> ///  触发转订单数量及存储地点改变时触发postback方法 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ToTransOutQtyChanged_CustomerPostBackAction(object sender, GridCustomerPostBackEventArgs e) {     if (e.PostTag.ToString().EndsWith("OnCellDataChanged"))     {         this.OnDataCollect(this); //当前事件先执行数据收集         this.IsDataBinding = true; //当前事件执行后会进行数据绑定         this.IsConsuming = false;     } }   31、删除确认对话框     public void AfterCreateChildControls()     { //添加删除确认对话框            PDFormMessage.ShowDelConfirmDialog(this.Page, "确认删除选择的记录?", "", this.BtnDelete);     }   32、DTO查询跨页获取选中记录 long[] recs = this.CurrentModel.QueryView.GetSelectedRecordIDs();   33、列表双击导航到画面 /// <summary> /// 列表双击 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OnGridRowDbClick_Extend(object sender, UIActionEventArgs e) {     //调用模版定义的默认实现方法.如需扩展,请直接在此编程.                             this.OnGridRowDbClick_DefaultImpl(sender, e);       string dataID = string.Empty;     if (this.CurrentModel.RequestForQuotation.FocusedRecord != null)     {         dataID = this.CurrentModel.RequestForQuotation.FocusedRecord["MainID"].ToString();     }       string pageURI = "UFIDA.U9.SCM.VP.RequestForQuotationUI";       OnNavigatCard("Browse", dataID, pageURI); }   /// <summary> /// 导航到画面 /// </summary> /// <param name="type"></param> /// <param name="dataID"></param> /// <param name="formID"></param> private void OnNavigatCard(string type, string dataID, string pageURI) {     if (dataID == String.Empty && type == "Browse")     {         OnNew_Extend(this, new UIActionEventArgs());     }     else     {         System.Collections.Specialized.NameValueCollection nameValCol = new System.Collections.Specialized.NameValueCollection();         nameValCol.Add("PDPageStatus", type);         nameValCol.Add("ID", dataID);         this.CommonAction.CurrentPart.NavigatePage(pageURI, nameValCol);     } }   34、根据控件名获取控件对象(Action中) IUFDataGrid dataGrid1 = (IUFDataGrid)this.CurrentPart.GetUFControlByName(this.CurrentPart.TopLevelContainer, "DataGrid1");  

推式生单配置

by RainBirda 2015.7.14 09:45
 注:脚本执行有风险,对于客户正式环境请在研发指导下执行。 下面的示例是销售订单转调出单的SQL脚本,可按自己的需求进行修改,将脚本放到相应模块下的PostSQL文件夹中即可。   效果图    --定义变量 DECLARE @SourceEntity BIGINT --来源单据实体 DECLARE @TargetEntity BIGINT --目标单据实体 DECLARE @StartSN BIGINT DECLARE @RefType VARCHAR(50) --单据类型参照UID(Container) --ID写死,按照文档说明顺序递增 SET @StartSN=3015011001 --调出单参照UID SET @RefType = 'f96ec85b-120d-4fdb-a43c-f5097809a2df' --目的单据 调出单 SELECT @TargetEntity = Local_ID FROM UBF_MD_Class WHERE FullName = 'UFIDA.U9.InvDoc.TransferOut.TransferOut' --来源单据 销售订单 SELECT @SourceEntity = Local_ID FROM UBF_MD_Class WHERE FullName = 'UFIDA.U9.SM.SO.SO' --先删除 @SourceEntity @TargetEntity 为主键 DELETE FROM Base_PushToDocTypeConfig_Trl WHERE ID IN (SELECT ID FROM Base_PushToDocTypeConfig WHERE SourceEntity = @SourceEntity AND TargetEntity = @TargetEntity) DELETE FROM Base_PushToDocTypeConfig WHERE SourceEntity = @SourceEntity AND TargetEntity = @TargetEntity DELETE FROM Base_PushToDocTypeConfig_Trl WHERE ID = @StartSN DELETE FROM Base_PushToDocTypeConfig WHERE ID = @StartSN --新增 INSERT INTO Base_PushToDocTypeConfig (ID, CreatedOn, ModifiedOn, CreatedBy, ModifiedBy, Application, SourceEntity, TargetEntity, TargetDocTypeReference, --[来源单据类型], [AttrExpression1],--属性表达式1 [AttrType1],--属性类型 [UIParam1],--UI参数 [UserAttr1],--使用条件 [ParamName1],--参数名称 --[业务类型], [AttrExpression2], [AttrType2], [UIParam2], [UserAttr2], [ParamName2], --[调拨类型], [AttrExpression3], [AttrType3], [UIParam3], [UserAttr3], [ParamName3]) VALUES ( @StartSN, Getdate(), Getdate(), 'admin', 'admin', 3015, @SourceEntity, @TargetEntity, @RefType, --[来源单据类型(参照类型)], 'SrcDocType', 'UFIDA.U9.SM.SO.SODocType', '26242049-2e2a-4797-96c3-3429b9a9463b',--当条件为参照时预置参照的ID,否则取这个类型参照的第一个 'AttrName1', 'SrcDocType', --[业务类型], 'BusinessType', 'UFIDA.U9.Base.Doc.BusinessTypeEnum', '', 'AttrName2', 'BusinessType', --[调拨类型], 'TransferType', 'UFIDA.U9.InvDoc.Enums.TransferTypeEnum', '1,2',--当条件为枚举时预置枚举的值的范围,用逗号隔开,如果不预置则取枚举的全部 'AttrName3', 'TransferType' ) INSERT INTO Base_PushToDocTypeConfig_trl (ID, SysMLFlag, AttrName1, AttrName2, AttrName3) VALUES (@StartSN, 'zh-CN', '来源单据类型', '业务类型', '调拨类型')   注意:目的单据类型可根据调拨类型或业务类型自动过滤,但是当它们为空时,目的单据类型显示所有的。    

SELECT语句中常量列引发的数据截取问题(0不等于0.0)

by ldf 2012.6.21 10:09

RecentComments

评论 RSS

Statistics

989 篇文章
0 个单页
589447 条评论
11 次评分
558249 次访问
访问统计开始于 2019年9月14日
平均日访问 8332 次
当前 138 人在线