如何在打印模板里使用自定义字体

by jizw 2016.12.5 10:29

如何解决另存的系统报表访问报错问题

by jizw 2016.6.27 08:59
问题号:201606160142、9201606030082 存在这样一种情况:客户另存一份系统报表模板,希望能在此基础上另外修改出一份模板来发布,有些报表另存后查询报错。 问题解决: 系统报表在WebPart处有明确的处理策略调用: 而自定义报表在OnLoadDefaultTemplate时机通过报表模板上配置的处理策略来反射调用策略处理: 很多系统报表是没有将策略信息配置到模板上的,另存这部分模板发布的自定义报表就会出现报错问题,这时候需要业务开发确认策略信息并补全到系统模板上,再重新另存模板即可。  

报表如何正确控制弹性域字段的属性权限

by jizw 2015.11.16 16:54
报表可以使用数据权限横向控制数据显示,但是要控制纵向的某列,则要使用UBF工具设置字段和实体属性的关联,然后通过关联的属性来设置权限,具体方法参考文档:报表字段权限控制.docx (101.47 kb) 支持问题9201511060026,客户在此设置基础上设置弹性域字段的属性权限,但是并没有起作用,说一下弹性域字段的设置方法: 1. 确定要控制的实体全称,这里以“UFIDA.U9.Lot.LotMaster” 为例。 2. 查询出实体的弹性域属性ID:SELECT T1.ID FROM UBF_MD_Attribute T1INNER JOIN dbo.UBF_MD_Class T2 ON T1.Local_Class_ID=t2.Local_IDWHERE T1.Name='DescFlexSegments' AND T2.FullName='UFIDA.U9.Lot.LotMaster' 结果:7e13b8b3-5bfb-4da5-b2e9-f6d326cd1ecc 3. 使用UBF工具查看LotDescFlex_PrivateDescSeg2字段的“引用属性实体字段标题”{ReferenceEntityAttribute:8ff5f5ae-fb0c-4e6e-b1c1-6a5fa355938a,3e0a4bfc-f921-4c60-b36f-b6f5aa615b5e},将第一个GUID:8ff5f5ae-fb0c-4e6e-b1c1-6a5fa355938a替换为上一步查询出的ID:7e13b8b3-5bfb-4da5-b2e9-f6d326cd1ecc。 最终结果:{ReferenceEntityAttribute:7e13b8b3-5bfb-4da5-b2e9-f6d326cd1ecc,3e0a4bfc-f921-4c60-b36f-b6f5aa615b5e} 进行以上的更改即可正常控制。  

修改列表中的数据后,翻页如何保留已修改的数据?

by RainBirda 2015.7.14 10:30
现在知道的有两种方案: 1、每次翻页时将触发callback事件,将当前页的数据存到缓存中,每次翻页后从缓存中取出修改后的数据赋值到列表中,不过这种实现方式比较复杂,不利于维护; 2、还有一种就是每次修改列表中的数据时触发postback事件,在服务端进行一次数据收集,这种实现方式较简单,不过修改数据后页面有刷新的动作,反应慢一些。 我想应该有其他更好的方式,以上两种都有缺点,还请大家指点一下。 第二种方式实现方法: /// <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;     } }

个性化跨页签移动到grid之后点击该列IE卡死问题

by lkc 2014.8.15 09:31
注:脚本执行有风险,对于客户正式环境请在研发指导下执行。问题号:201408120122 问题描述:生产线料品日计划界面的行页签里面都没有存储地点或完工地点,需要到“生产”页签里面填,当修改个性化把“完工地点”和“入库存储地点”调出来放到表行里,开单的时候一点到这两项(无论哪一项)就卡死,完全没有办法填写完工地点。 问题重现:生产线料品日计划,个性化,将“基本”页签以外的页签上的字段(任何字段,任何类型)扩展到Grid,点击扩展的字段时系统就会卡死。 问题跟踪:本地重现问题之后挂上VS的异常 在callback回调时候报异常——未能找到回调的目标“u$M$p0$DataGrid8$ctl18”或未实现 ICallbackEventHandler。由于做了跨页签扩展控件到grid,所以个性化会在grid控件上挂一个模拟切换页签的关联控件,开始猜测是否由于什么原因导致个性化的关联控件没有每次都输出导致,所以先跟踪个性化的关联控件的挂接流程 if (colsMoveFromCard.Count > 0) { GridEventProcessor processor = new GridEventProcessor(this._WebPart, grid as IUFDataGrid); CallBackAction.ResisterCallBackEvent(grid as IUFDataGrid, UFDateGridEventName.OnImitateSwitchTabPage, colsMoveFromCard.ToArray(), false , processor.ProcessSimulateTabPageChanged_CallBack); }   public void Add(Control l) { if (l is IUFCanCallBack) { ((IUFCanCallBack)l).CallBackHandler = this; l.Controls.Add(this); } this._arriListSubControls.Add(l); }   跟踪发现: 1、get操作时 个性化添加的关联控件ID为ctl17 2、点击扩展列引发的callback 个性化添加的关联控件ID为ctl16 开始怀疑应用开发的代码中是否有有条件输出的关联控件 并且也是挂在grid控件下的 通过查看开发代码 发现了一处疑似点 private void Page_PostBack() { if (!base.get_Page().IsPostBack) { AssociationControl control = new AssociationControl(); control.get_InitPara().Add("TableRowChanged()"); control.set_SourceServerControl(this.DataGrid8); } } 这个逻辑正好印证了跟踪时get方式和callback方式输出的关联控件个数不一致的猜测 通过反编译跳过判断 保证每次都输出这段关联控件 问题不再出现 小结: 应用开发在写关联控件时 一定要保证一个原则——即必须无条件输出关联控件 以保证控件树在任何情况下都是完整的 如果关联控件是有条件执行的 请在关联控件内部自行判断

列表删除公共方法

by majiea 2014.7.16 08:53
列表通用删除
public static void Delete(IUIView view, BaseAction action) [更多...]

根据已经定义的弹性域段信息自动生成field信息到view中的方法

by lkc 2014.5.23 13:49
注:脚本执行有风险,对于客户正式环境请在研发指导下执行。1、实现一个BP用来返回一个Entity已经定义的所有弹性域的信息(可以使用马杰已经提供的API 示例中的写法是自己从数据库加载的) 关键代码如下:   public override object Do(object obj)  {         GetDFFDef bpObj = (GetDFFDef)obj;                        //通过实体的EntityFullName获取档案有效的描述性弹性域定义信息            StringBuilder sb = new StringBuilder();            sb.Append(" select ");            //0,1,2,3,4,5            sb.Append(" A.EntityType,A.IsContextSensitive,A.IsContextOverride,A.ContextSegNum,A.DefaultContextCode,A.DefaultContextName, ");            //6,7,8,9,10,11            sb.Append(" A.ReferProperty,A.Separator,A.IsFrozen,A.Appllication, B.ContextValue,C.Number, ");            //12,13,14,15,16,17            sb.Append(" C.Name,C.Description,C.DefaultValue,D.ID,D.Code,D.Name, ");            //18,19,20,21,22,23            sb.Append(" D.ValidateType,D.ValueType,D.MaxValue,D.MinValue,D.Length,D.Pricision, ");            //24,25,26,27,28,29, 30            sb.Append(" D.IsTree,D.TreeRule,D.EntityType,D.IDAttribute,D.CodeAttribute,D.NameAttribute, A.EntityType.FullName ");            sb.Append( " from UFIDA::U9::Base::FlexField::DescFlexField::DescFlexFieldDef as A " );            sb.Append(" inner join UFIDA::U9::Base::FlexField::DescFlexField::DescFlexContext as B on A.ID = B.DescFlexFieldDef ");            sb.Append(" and B.Effective.IsEffective=1 and @d1 between B.Effective.EffectiveDate and B.Effective.DisableDate and B.ContextValue in('Public','Global',@OrgCode) ");            sb.Append(" inner join UFIDA::U9::Base::FlexField::DescFlexField::DescFlexSegment as C on B.ID = C.DescFlexContext ");            sb.Append(" and C.Effective.IsEffective=1 and @d2 between C.Effective.EffectiveDate and C.Effective.DisableDate ");            sb.Append(" left join UFIDA::U9::Base::FlexField::ValueSet::ValueSetDef as D on D.ID = C.ValueSetDef ");            sb.Append(" where A.Effective.IsEffective=1 and @d3 between A.Effective.EffectiveDate and A.Effective.DisableDate and A.IsFrozen = 0 and A.EntityType.FullName=@EntityType");             OqlParamList parms = new OqlParamList();                        parms.Add(new OqlParam(PlatformContext.Current.LoginDateTime));            parms.Add(new OqlParam(Base.Context.LoginOrg.Code));            parms.Add(new OqlParam(PlatformContext.Current.LoginDateTime));            parms.Add(new OqlParam(PlatformContext.Current.LoginDateTime));            parms.Add(new OqlParam(bpObj.EntityFullName));             EntityViewQuery viewQry = new EntityViewQuery();            ObjectQuery oq = viewQry.CreateQuery(sb.ToString());            DFFDefDTO dto = new DFFDefDTO();             using (IDataReader dr = viewQry.ExecuteReader(oq, parms.ToArray()))            {                int i = 0;                while (dr.Read())                {                    if (i == 0)                    {                        dto.EntityFullName = dr.GetString(30); //实体全名                        dto.EntityId = dr.GetInt64(0);   //实体ID                        dto.IsContextSensitive = dr.GetBoolean(1); //是否上下文相关                        dto.IsContextOverride = dr.GetBoolean(2); //是否上下文可改                        dto.ContextSegNum = dr.GetInt32(3); //上下文相关段数                        dto.DefaultContextCode = dr[4] == DBNull.Value ? String.Empty : dr.GetString(4); //缺省上下文编码                        dto.DefaultContextName = dr[5] == DBNull.Value ? String.Empty : dr.GetString(5);  //缺省上下文名称                        dto.ReferProperty = dr[6] == DBNull.Value ? String.Empty : dr.GetString(6); //参考字段                        dto.Separator = dr[7] == DBNull.Value ? String.Empty : dr.GetString(7); //分隔符                        dto.IsFrozen = dr.GetBoolean(8); //是否冻结                        dto.Appllication = dr[9] == DBNull.Value ? -1 : dr.GetInt64(9); //应用                         dto.DFFSegments = new List<DFFSegmentDTO>();                    }                     DFFSegmentDTO segDTO = new DFFSegmentDTO();                    segDTO.ContextValue = dr[10] == DBNull.Value ? String.Empty : dr.GetString(10); //上下文值                    segDTO.Number = dr.GetInt32(11); //段号                    segDTO.Name = dr[12] == DBNull.Value ? String.Empty : dr.GetString(12);    //段名称                    segDTO.Description = dr[13] == DBNull.Value ? String.Empty : dr.GetString(13); //描述                    segDTO.DefaultValue = dr[14] == DBNull.Value ? String.Empty : dr.GetString(14); //缺省值                                        ValueSetDTO vsDTO = new ValueSetDTO();                    vsDTO.ID = dr[15] == DBNull.Value ? -1 : dr.GetInt64(15); //值集ID                    vsDTO.Code = dr[16] == DBNull.Value ? String.Empty : dr.GetString(16); //编码                    vsDTO.Name = dr[17] == DBNull.Value ? String.Empty : dr.GetString(17); //名称                    vsDTO.SrcType = dr[18] == DBNull.Value ? ValidateTypeEnum.GetFromValue(0) : ValidateTypeEnum.GetFromValue(dr.GetInt32(18)); //校验类型                    vsDTO.ValueType = dr[19] == DBNull.Value ? ValueTypeEnum.GetFromValue(0) : ValueTypeEnum.GetFromValue(dr.GetInt32(19)); //值类型                    vsDTO.MaxValue = dr[20] == DBNull.Value ? String.Empty : dr.GetString(20); //最大值                    vsDTO.MinValue = dr[21] == DBNull.Value ? String.Empty : dr.GetString(21); //最小值                    vsDTO.MaxLength = dr[22] == DBNull.Value ? 0 : dr.GetInt32(22); //最大长度                    vsDTO.Scale = dr[23] == DBNull.Value ? 0 : dr.GetInt32(23); //精度                    vsDTO.IsTree = dr[24] == DBNull.Value ? false : dr.GetBoolean(24); //是否树型结构                    vsDTO.CodeRule = dr[25] == DBNull.Value ? String.Empty : dr.GetString(25); //树型结构编码规则                    vsDTO.SrcEntity = dr[26] == DBNull.Value ? -1 : dr.GetInt64(26); //实体                     vsDTO.IdAttribute = dr[27] == DBNull.Value ? -1 : dr.GetInt64(27); //ID列对应的localID                    vsDTO.CodeAttribute = dr[28] == DBNull.Value ? -1 : dr.GetInt64(28); //Code列对应的localID                    vsDTO.NameAttribute = dr[29] == DBNull.Value ? -1 : dr.GetInt64(29); //Name列对应的localID                     segDTO.ValueSetDef = vsDTO;                    dto.DFFSegments.Add(segDTO);                     i++;                }            }             return dto;     }   2、实现一个公共助手类 辅助添加字段 关键代码如下:         /// <summary>        /// View追加描述性弹性域字段        /// </summary>        /// <param name="view">视图</param>        public static void AppendDescFlexFields(IUIView view, bool isBuildFieldIndexs)        {            //如果已经包含扩展字段,则不添加            if (view.Fields.Contains(Constant.DFF_PublicSegmentPrefix + "1")) return;             //添加公共段字段            for (int i = 1; i < 51; i++)            {                String fieldName = Constant.DFF_PublicSegmentPrefix + i.ToString();                String attrName = Constant.DFF_PublicAttrNamePrefix + i.ToString();                AddStringField(view, fieldName, attrName, fieldName, fieldName, UIFieldType.DirectField, true);                 fieldName = Constant.DFF_PublicSegmentPrefix + i.ToString() + Constant.DFF_NameFiledPostfix;                AddStringField(view, fieldName, "", fieldName, fieldName, UIFieldType.DirectField, false);            }             //添加私有段字段            for (int i = 1; i < 31; i++)            {                String fieldName = Constant.DFF_PrivateSegmentPrefix + i.ToString();                String attrName = Constant.DFF_PrivateAttrNamePrefix + i.ToString();                AddStringField(view, fieldName, attrName, fieldName, fieldName, UIFieldType.DirectField, true);                 fieldName = Constant.DFF_PrivateSegmentPrefix + i.ToString() + Constant.DFF_NameFiledPostfix;                AddStringField(view, fieldName, "", fieldName, fieldName, UIFieldType.DirectField, false);            }             //添加上下文列            AppendContextValueField(view);             //添加组合名称列            AppendCombineNameField(view);             //重建索引            if( isBuildFieldIndexs )                view.BuildFieldIndexes();        }         /// <summary>        /// 追加ContextValue列        /// </summary>        /// <param name="view">视图</param>        private static void AppendContextValueField(IUIView view)        {            if (!view.Fields.Contains(Constant.DFF_ContextValueSegment))            {                //追加CombineName列                AddStringField(view, Constant.DFF_ContextValueSegment, Constant.DFF_ContextValueAttr, Constant.DFF_ContextValueSegment,                    Constant.DFF_ContextValueSegment, UIFieldType.DirectField, false);            }        }         /// <summary>        /// 追加CombineName列        /// </summary>        /// <param name="view">视图</param>        private static void AppendCombineNameField(IUIView view)        {            if (!view.Fields.Contains(Constant.DFF_CombineNameSegment))            {                //追加CombineName列                AddMultiLangField(view, Constant.DFF_CombineNameSegment, Constant.DFF_CombineNameAttr, Constant.DFF_CombineNameSegment,                    Constant.DFF_CombineNameSegment, UIFieldType.DirectField, false);            }        }         /// <summary>        /// 增加字符列        /// </summary>        /// <param name="view">视图</param>        /// <param name="fieldName">字段名</param>        /// <param name="attrName">属性名</param>        /// <param name="displayName">显示名</param>        /// <param name="description">描述</param>        /// <param name="dataType"></param>        /// <param name="fieldType">字段类型</param>        /// <param name="isDirectField">是否直接属性</param>        internal static IUIField AddStringField(IUIView view, String fieldName, String attrName, String displayName,            string description, UIFieldType fieldType, bool isDirectField)        {            IUIField newfield = new UIField(view, fieldName, typeof(String), true, "", "System.String", attrName, true, true, false, "", false);                        newfield.FieldType = fieldType;            newfield.FieldTypeID = "3d174255-fd12-47f7-8844-3b5e4fae9e8c";             view.Fields.Add(newfield);             return newfield;        }         internal static IUIField AddMultiLangField(IUIView view, String fieldName, String attrName, String displayName,            string description, UIFieldType fieldType, bool isDirectField)        {            IUIField newfield = new UIField(view, fieldName, typeof(String), true, "", "System.String", attrName, true, true, false, "", true);             newfield.FieldType = fieldType;            newfield.FieldTypeID = "3d174255-fd12-47f7-8844-3b5e4fae9e8c";             view.Fields.Add(newfield);             return newfield;        } 3、在适当的时机(一般都是AfterCreateChildControl时)调用助手类完成字段的添加 关键代码如下:             List<string> entityFullNames = new List<string>();            foreach (KeyValuePair<IUFControl, IUIView> dataArea in _dataArea)            {                entityFullNames.Add(dataArea.Value.EntityFullName);            }             GetDFFDefsProxy proxy = new GetDFFDefsProxy();            proxy.EntityFullNames = entityFullNames;            List<DFFDefDTOData> lst = proxy.Do();            foreach (DFFDefDTOData o in lst)            {                _flexDefs.Add(o.EntityFullName.ToLower(), o);            }             foreach (KeyValuePair<IUFControl, IUIView> dataArea in _dataArea)            {                DFFDefDTOData flexDef = (DFFDefDTOData)_flexDefs[dataArea.Value.EntityFullName.ToLower()];                if (flexDef == null) continue;                     if (!_currPart.Page.IsPostBack && dataArea.Value.RecordCount == 0)                    {                        //增加字段                        AppendDescFlexFields(dataArea.Value);                    }             }

客开直接指定加载特定的个性化模板的方法

by lkc 2014.5.12 15:17
注:脚本执行有风险,对于客户正式环境请在研发指导下执行。一、问题邮件          原来在pmp平台提过一个问题,即如何为单据档案加载指定的个性化模板,当时你提供的解决方案是:          客开可以指定 主页面的SpecialTemplateID属性 设置客开加载的某个固定的个性化模板 代码类似: ((WebPartBase)part).SpecialTemplateID = "XXXXXXXX"; 其中的part是弹出的SO 等号右边是一个guid的个性化模板ID 查看个性化模板ID的方法: 从菜单进入销售订单(如果存在多个个性化模板 需要操作界面的触发控件 使得界面加载到某个特定的模板——即个性化模板管控功能) 修改地址栏中的erp\display为errors\pdisplay 点击查看模型 在个性化模型的最下方找到当前编辑的个性化模板ID 类似于<EditTemplateID>c560c257-2e32-48d7-9637-188893161307       现在的问题是SpecialTemplateID属性为只读属性,无法赋值。是否还能通过其他方式进行传递?要在插件中的哪个事件进行指定呢? 二、解决方案  给UFSoft.UBF.UI.Portal.WebControls.WebParts.WebPartBase中的属性FirstTemplateID赋值需要加载的个性化模板ID即可 三、源代码         public string FirstTemplateID        {            set            {                if (!string.IsNullOrEmpty(value))                    this._specialTemplateID = value;            }        }         public string SpecialTemplateID        {            //校验ID是否有效:是否存在于当前模板里。            get            {                //简单缓存                if (this._specialTemplateID.Length == 0)                {                    string tmp = this.Page.Request.Params[SpecialTemplateID_KEY];                    if (!string.IsNullOrEmpty(tmp))                    {                        if ((AllVersionAdjustModel != null) && (AllVersionAdjustModel.ContainersModel.ContainsKey(tmp)))                        {                            this._specialTemplateID = tmp;                        }                        else                        {                            //抛异常,告知客开指定的ID无效。                            string msg = "[个性化]-优先加载模板ID[" + tmp + "]无效,或者调用时机不正确!";                            this.logger.Error(msg);                        }                    }                }                 return this._specialTemplateID;            }            //通过FirstTemplateID来做set操作        }         public AdjustContainerModel AdjustModel        {            get            {                if (this.AllVersionAdjustModel!=null)                {                    string key = string.Empty;                    if (this.IsEditPartState)                    {                        //V2.1增加客开指定模板ID接口                        //by wangxiaoliang                        //V2SP2支持问题:201007080258                        //--begin--                        if (this.SpecialTemplateID.Length > 0)                        {                            this.AllVersionAdjustModel.EditTemplateID = this.SpecialTemplateID;                        }                        //--end--                         key = this.AllVersionAdjustModel.EditTemplateID;                         if (AllVersionAdjustModel.ContainersModel.ContainsKey(key))                        {                            adjustModelByVersion = AllVersionAdjustModel.ContainersModel[key];                        }                    }                    else                    {                        if (string.IsNullOrEmpty(this.PersonalizationDataVersionKey))                        {                            key = this.AllVersionAdjustModel.DefaultTemplateID;                             //V2.1增加客开指定模板ID接口                            //by wangxiaoliang                            //V2SP2支持问题:201007080258                            //--begin--                            if (this.SpecialTemplateID.Length > 0)                            {                                key = this.SpecialTemplateID;                            }                            //--end--                             if (AllVersionAdjustModel.ContainersModel.ContainsKey(key))                            {                                adjustModelByVersion = AllVersionAdjustModel.ContainersModel[key];                            }                        }                        else                        {                             string[] triggerKeyValue = this.PersonalizationDataVersionKey.Split(                                new string[] { UFSoft.UBF.UI.UIFormPersonalization.Defines.KeyValueSplit }, StringSplitOptions.None);                             string pivotalTriggerID = triggerKeyValue[0];                            string pivotalTriggerValue = triggerKeyValue[1];                             string xmlCTMM = this.AllVersionAdjustModel.CtrlTemplateMapping;                            CtrlTemplateMappingModel ctmm = null;                             if (xmlCTMM.Length > 0)                            {                                ctmm = CtrlTemplateMappingSerializeHelper.Xml2CtrlTemplateMappingModel(xmlCTMM);                            }                            if (ctmm != null)                            {                                string tplID = string.Empty;                                 foreach (CtrlTemplateMappingItem ctmItem in ctmm.CtrlTemplateMappingItems)                                {                                    if (this.IsMappingValue(ctmItem.CtlValue, pivotalTriggerValue))                                    {                                        tplID = ctmItem.TemplateID.ToString();                                         break;                                    }                                }                                 if (tplID.Length == 0)                                {                                    tplID = this.AllAdjustModelOnRunTime.DefaultTemplateID;                                }                                 if (this.AllVersionAdjustModel.ContainersModel.ContainsKey(tplID))                                {                                    adjustModelByVersion = this.AllVersionAdjustModel.ContainersModel[tplID];                                    this.AllVersionAdjustModel.EditTemplateID = tplID;                                }                            }                        }                    }                    return adjustModelByVersion;                }                else                {                    return null;                }            }        }  

答复: 协同自定义单据打印制作打印模板总结--20140120

by 张刚 2014.1.21 09:44
注:脚本执行有风险,对于客户正式环境请在研发指导下执行。 对于新建自定义单据打印模板的过程及注意事项总结一下,以便后续有同样问题时可以快速解决。 将上面dll拷贝到x:\ Portal\UBFLib下。(pdb和cs是调试文件,暂时不用管) 创建打印模板时,选择【用户自定义数据源打印模板】。 自定义单据的数据来源SQL取得方法。 方法一:协同自定义表单打印模板:用开发给出的方法(url最后面加上&OutputSampleSQL=true),然后执行输出或者打印报错。并给出相关SQL。在ubfstudio工具,在数据页签,执行对应出错select….执行预览,就出现对应字段,把字段加出来,然后在打印模板中选上即可。 方法二:直接通过sql profiloer工具直接跟踪出来对应的动态实体表是什么。如:exec sp_executesql N'select  A.* from  [CS_Extend_ExtendBE5] as A where  (A.[ID] = @ID)',N'@ID bigint',@ID=1001209067895424 设置过滤条件为ID。(注意ID必须全部为大写,如果不是大写会导致过滤失败,每次打印时,总是打印第一条数据) 报表属性设置中,设置策略类型全称及策略程序集如下: 如何取得审核流的信息,方法见如下截图:     ---------------------------------- 姓 名: 张刚 部门:U9平台技术部

报表导出需求9201209170034

by zhuanglb 2013.6.27 09:27
报表导出 客开 报表引擎 [更多...]

慎用UFIDA.UBF.Query.CommonService.BindEnum方法 可能影响个性化功能设置

by lkc 2013.4.7 11:16
注:脚本执行有风险,对于客户正式环境请在研发指导下执行。有些应用开发在可编辑的Grid界面支持定义查询方案的功能 可能是代码之间互相拷贝会在AfterUIModelBinding这个时机调用UFIDA.UBF.Query.CommonService.BindEnum方法用来绑定查询方案的枚举值 但是调用完这个方法之后发现个性化功能不能使用了 原因是该函数内部设置了不允许个性化——设计原则是报表查询界面都不支持个性化 代码如下: public static void BindEnum(String DropDownListName, IPart webPart, string QryModelID) { BindPartEnum(DropDownListName, webPart, QryModelID); //yinzx add 2007-08-25 ResetDeleteBtnAfterUIModelBinding(webPart); //对DTO查询进行Grid上的总条数设置 ResetGridTotalRowsCount(webPart); //修改化设置开头 ((UFSoft.UBF.UI.Portal.WebControls.WebParts.WebPartBase)webPart).AllowPersonalization = false; //默认值设置开关 王晓亮 2009-01-04 ((BaseWebForm)webPart).DialogNoSetDefaultValue = true; } 解决方案:不要随便调用这个方法 如果一定要使用请先和平台相关人员评估方案合理性Ps:是不是评估一下这个方法是否应该为public? 应用开发不调用这个方法是否真的不能完成在普通grid界面支持查询方案的需求吗?

个性化从卡片跨页签移动到Grid时模拟切换页签逻辑分析

by lkc 2013.3.21 16:44
注:脚本执行有风险,对于客户正式环境请在研发指导下执行。使用个性化功能创建从卡片移动到Grid的列后会涉及如何同步列状态与控件本身状态的问题,目前使用的逻辑是这样的 1、在服务器端创建列时,直接设置该列是可用的 代码 2、在客户端输出一段逻辑,当焦点进入个性化列时调用callback逻辑模拟切换页签并返回控制逻辑的JS脚本 代码   IsNeedSwitchTabPage : function(colIndex,rowIndex) { if(typeof(colIndex)=="undefined" || colIndex==null || colIndex=="" || colIndex<0) { colIndex = this.m_currentColumnIndex; } if(typeof(rowIndex)=="undefined" || rowIndex==null || rowIndex=="" || rowIndex<0) { rowIndex = this.m_currentRowIndex; } var hasCol = (colIndex>=0 && colIndex<this.MainCols.length); var ctrl = (hasCol ? this.MainCols[colIndex].ColEditCtrlClientID4P : null); var isVisible = (hasCol ? this.MainCols[colIndex].style.display!="none" : false); return (ctrl != null) && isVisible && ((this.m_currentRowIndex4PCol != this.m_currentRowIndex) || this.GetClientRowDataDirtyTag(rowIndex)); }

U9查询--交接PPT

by 祁宏伟 2013.3.8 11:18
注:脚本执行有风险,对于客户正式环境请在研发指导下执行。U9查询.ppt (1.77 mb)

U9查询源代码路径

by 勾成图 2013.2.25 14:20
U9查询源代码路径 [更多...]

个性化关联设计导致扩展到Gird上的参照列注册CallBack事件为onchange时取不到新值的问题

by lipingc 2012.12.7 09:23
注:脚本执行有风险,对于客户正式环境请在研发指导下执行。支持问题9201211200016:销售订单保存后修改供应组织改不过去。 下面是解决过程: 由于SO的货主组织控件注册了CallBack事件,事件名称近期因为其他支持问题被修改为onchange(onchange会被级联触发,之前是ContentChanged不会被级联触发),导致通过个性化在Grid的扩展列货主组织上设置关联事件后,则会出现支持问题中货主组织无法修改的情况。   我尝试性的做了三种修改: 1、  将onchange 改回ContentChanged则可以,但这样则会导致不能级联触发。 2、  同时注册onchange和ContentChanged则可以,但这样同样的逻辑会执行两次,也不合适。 3、  替换掉关联控件的触发源,触发条件,响应控件(由Grid扩展列替换为交货页签控件,当然两者绑定的是同一个UIField)则可以,这样不用修改代码,挺好。   不过还是没搞清楚为何设置为onchange后callback中取的控件值是旧的,当然也不能就说是平台的一个bug,暂时还是采用第3种方法解决吧。  

查询方案中条件树和栏目树中找不到对应的实体属性

by 勾成图 2012.10.9 15:11
查询方案中条件树和栏目树中找不到对应的实体属性 [更多...]

报表打印输出Excel跨列的问题的解决方法

by kxl 2012.7.6 10:41
注:脚本执行有风险,对于客户正式环境请在研发指导下执行。报表,打印输出Excel跨多列的问题:                上面的截图中有表头,多个表格。 导致Excel跨列是由于 上面的文本框的开始位置结束位置和第一个表格的某列没对齐。表格也没对齐。 解决方法: 把文本框的开始位置和第一个表格的某一列对齐,结束位置和某一列对齐。 把下面的表格的列和第一个表格的列也要全部对齐,导出Excel后就不会出现跨列的问题了。

查询开发中自定义字段显示与排序

by 勾成图 2012.6.26 10:30
查询开发中自定义字段显示与排序 [更多...]

使用查询方案出现参数计数不匹配错误的原因和处理方法

by 勾成图 2012.6.8 10:22
使用查询方案出现参数计数不匹配错误的原因和处理方法 参数计数不匹配 [更多...]

Grid上使用callback返回时产生的一些问题

by lkc 2012.5.22 10:15
注:脚本执行有风险,对于客户正式环境请在研发指导下执行。问题现象:杂发单个性化——通过关联计算,弹性域字段z001*库存数量=成本数量,可正常算出成本数量,但手工修改成本数量保存后,成本数量又恢复到个性化计算出的数量。 经过跟踪发现,修改成本数量时会引发引用开发的callback,这个逻辑返回的js如下 "var ThisGrid = $find('u_M_p0_DataGrid8');ThisGrid.SetReferenceCellValue(0,ThisGrid.GetColumnIndex('SUToCURate'),'2.3333333','2.3333333','2.3333333');;var ThisGrid = $find('u_M_p0_DataGrid8');ThisGrid.SetReferenceCellValue(0,ThisGrid.GetColumnIndex('SUToCURate'),'2.3333333','2.3333333','2.3333333');var ThisGrid = $find('u_M_p0_DataGrid8');ThisGrid.SetReferenceCellValue(0,ThisGrid.GetColumnIndex('CostMny'),'0.000000000','0.000000000','0.000000000');;var ThisGrid = $find('u_M_p0_DataGrid8');ThisGrid.SetReferenceCellValue(0,ThisGrid.GetColumnIndex('SUToCURate'),'2.3333333','2.3333333','2.3333333');var ThisGrid = $find('u_M_p0_DataGrid8');ThisGrid.SetReferenceCellValue(0,ThisGrid.GetColumnIndex('CostMny'),'0.000000000','0.000000000','0.000000000');var ThisGrid = $find('u_M_p0_DataGrid8');ThisGrid.SetReferenceCellValue(0,ThisGrid.GetColumnIndex('StoreUOMQty'),'6','6','6');;;;"  平台的固有逻辑认为只要是调用参照赋值逻辑,能赋值就一定应该触发事件 代码如下     SetReferenceCellValue : function(rowIndex,columnIndex,value,code,text,isSynchUpdateValue4P)     {         if(this.m_gridFaciesManager!=null)         {   //设置参照单元值             //this.get_element().NotEndEdit = true;             //this.m_gridBodyEventsHandler.CanEndEdit(false);             //this.get_element().NotEndEdit = false;               this.m_gridFaciesManager.SetReferenceCellValue(rowIndex,columnIndex,value,code,text,isSynchUpdateValue4P);             /*     delete status change                 var row =this.D_Body.rows[rowIndex];                             if(row.Status==RowStatus.Empty)             {   //设置行位被修改状态                            row.Status=RowStatus.Added;             }else if(row.Status==RowStatus.UnChanged)             {   //设置行位被修改状态                            row.Status=RowStatus.Modified;             }                    */             var cellData = new CellDataContent("",value);              this.OnCellDataValueChanged(cellData,rowIndex,columnIndex);         }        }   而本例中列StoreUOMQty实际上是一个数字列 也就是在赋值时应该使用SetCellValue 在该方法中会比较新旧值以判断是否触发事件   if(valueString!=oldV){                       var cellData = new CellDataContent("",valueString);                        this._owner.OnCellDataValueChanged(cellData,rowIndex,columnIndex);             } 小结:如果使用SetReferenceCellValue方法赋值,则每次赋值都会触发值改变事件,不论新旧值是否相等;使用SetCellValue方法赋值,则会比较新旧值,不等时才会触发值改变事件 所以这是应用开发使用方法不当而在个性化中暴露出来的问题 反思:callback的时候可能会修改很多列 也可能产生庞大的脚本来更新界面上grid控件上的值 但是在服务器端多判断一下这个值是不是需要回写(也许现在前端值和model值就是一样 的呢)根据判断结果去掉多余的脚本会不会也有一定的性能优化呢?    留个小疑问:怎么判断产生的js是调用参照赋值还是普通赋值呢?      

RecentComments

评论 RSS

Statistics

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