根据已经定义的弹性域段信息自动生成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 祁宏伟 2014.2.28 11:25
注:脚本执行有风险,对于客户正式环境请在研发指导下执行。MSDTC事务错误及开启方式: System.Transactions.TransactionAbortedException: 已中止事务。 ---> System.Transactions.TransactionPromotionException: 试图提升事务时失败。 ---> System.Data.SqlClient.SqlException: 服务器 'PT09' 上的 MSDTC 不可用。 这种是服务没有开启,一般不会出现,默认是服务启动的。     System.Transactions.TransactionException: 该伙伴事务管理器已经禁止了它对远程/网络事务的支持。 (异常来自 HRESULT:0x8004D025) ---> System.Runtime.InteropServices.COMException: 该伙伴事务管理器已经禁止了它对远程/网络事务的支持。 (异常来自 HRESULT:0x8004D025)          把该勾的都勾上。 3. 应用服务器和数据库服务器最好关闭防火墙,如果开启,请把DTC加入例外.       其它: --如:虚拟机标识重复。每台服务器重装一下DTC就可以了。    

客开需要UBF及资料的外网地址(UBF Product 客开资料)

by 祁宏伟 2014.2.14 14:02
新的 UBFStudio . [更多...]

Tags:

C大平台

新自适应方案使用说明文档--20131209

by 张刚 2013.12.10 09:30
注:脚本执行有风险,对于客户正式环境请在研发指导下执行。 问题:    旧版自适应方案,在大显示器显示情况下,在表头和表体之间,有大量的空白。页面效率显示差。依据<<Form布局中高度/宽度自适应设计要点>>(参考:http://u9blog/u9blog/post/2012/11/27/JMF_AutoAdjustHeight.aspx)对页面采用新版自适应方案改造后,表头只能显示4列字段。导致个性化添加的字体无法显示。近期对Portal页面的新自适应方案及个性化模块进行了代码改造,后续会发出相关UBF补丁(U9V25.UBF.1001312090000005.u9pack)。后续研发通过UBF对页面调整构造后,即可解决以上问题。         方案说明:          研发在使用新自适应方案时,应该注意的问题做如下说明。以下以标准销售单调整的过程进行演示,其中关键位置会给与截图说明。 需要设置Form的IsAutoSize属性为True     在UBFStudio中设定需要自适应的卡片所在的所有父容器行(追溯到顶级容器)为非固定行,并保证其他行为固定行。在本例中,主容器布局共包含3行(下图),其中Row0为Toolbar区, Row1为内容编辑区,Row3为功能按钮区,我们需要让Row1自适应,以保证命令按钮区始终在页面底部,这时只需要设定Row1为非固定行即可。需要注意的是Row1包含的Card2由于布局中不需要有自适应行存在,所以应保持各行为固定行。     本例是依具第2步相同思路。如果想让【行grid】的宽度自适应,则其父窗口Card3中的两列,设置如下:         4.通过拖拽,使得Card3由之前占StandardSOMainUIForm的1列,改为占用两列。(此页面是最外层容器StandardSOMainUIForm是两列布局,部分页面是1列布局,在设置是不用考虑这一步)。         5. 由于表头的高度不需要变动,因此将表头占用的Card3中的第一行的【是否固定列】设置为True。              同理,由于要实现Grid的高度自适应,因此它所在的行,【是否固定列】设置为False。              Card3的第3行,设置【是否固定列】为True。     6.(这一步暂时不用了.zhanggangb:20150618) 在TabpageLine中,设置列0的【是否固定列】为False。同时让TabPageLine这个Gaid占Card3布局中的两列。     7. 在TabpageLine中,设置列1的【是否固定列】为False。     8. 设置TabControl0的【是否固定高度】设置为False。     9. TabPageBase的最后一列,设置【是否固定列】为False。前面17列,由于表头元素大小不用变动,所以【是否固定列】设置为True。     在TabPageBase中,如果列宽度设置为0,会导致显示有问题,因此TabPageBase中,对于做分隔使用的列宽度不能设置为0,建议设置为5。     10. 构造、测试。         附件: <<Form布局中高度/宽度自适应设计要点>> Form布局中高度/宽度自适应设计要点 by 李国强 2012.11.27 11:10 很多情况下,我们需要在浏览器窗体缩放时保证功能按钮始终保持在页面底部,或者让Grid跟随窗体的变化而自动缩放,这时候可以通过设计行高(宽)自适应来解决。 因为宽度自适应在很久以前就可以解决, 所以这里只说高度自适应,以下方法适用于JMF和V2.5。 以[基础设置/国家/地区]为例,如下图,如果要设置"相关功能"按钮始终在页面底部,需要如下步骤设置。      0. (2012.12.27添加) 要应用行高宽自适应,需要设置Form的IsAutoSize属性为True。(JMF中因为默认宽度是100%的,基于兼容考虑所以此属性对宽度无效) 1 . 如果UBF是旧版本,需要先更新LTP文件,从下面附件解压后覆盖UBFStudio的同名文件夹,或者从vm97更新UBFStudio。 Tpls.rar (11.63 kb) 附件已过时 2. 如果是JMF项目,需要设定项目类型为JMF,如下图。 3. 在UBFStudio中设定需要自适应的卡片所在的所有父容器行(追溯到顶级容器)为非固定行,并保证其他行为固定行。在本例中,主容器布局共包含3行(下图),其中Row0为Toolbar区, Row1为内容编辑区,Row3为功能按钮区,我们需要让Row1自适应,以保证命令按钮区始终在页面底部,这时只需要设定Row1为非固定行即可。需要注意的是Row1包含的Card2由于布局中不需要有自适应行存在,所以应保持各行为固定行。     4. 重新构造后, 测试。     附件: 1. V2.5示例项目,国家地区主页面CountryUIForm.ubfform: CountryUIForm.ubfform (29.14 kb) 2. JMF示例项目,料品主页面ItemMainUIForm.ubfform: ItemMainUIForm.ubfform (1.02 mb)     备注: 1. Q:在JMF版页面中,有些控件高度/宽度被拉伸, 或者显示不全? A:所在的容器有不需要自适应的行被设置为自适应,需要设置正缺后重新构造。 2. 目前一个页面只支持一个自适应链。就是说只能指定一个最底层容器为自适应。 3. Q:参照中的表格缩成一团... A:参考条目1     ---------------------------------- 姓 名: 张刚 部门:U9平台技术部    

2.8环境一参照就报AppliactionIntent关键字问题

by lifengb 2013.10.15 13:48
注:脚本执行有风险,对于客户正式环境请在研发指导下执行。2.8环境一参照就报AppliactionIntent关键字问题,是由于部署SQL 2012导致的,解决方案如下:   1.应用服务器需要打.NET 4.0.2HotFix:DotNet402-NDP40-KB2544514-x86-x64.exe。 另:.net 2.0HotFix:NDP20SP2-KB2654347-x86.exe。路径:\\u9lifengb2003\share\U9工具\SQL2012HotFix 解决问题:.Net 4.0 AppliactionIntent关键字支持,U9查找、参照依赖这个补丁。 (主要打这个就行,其它为解决其它问题) 2.应用服务器需要打 KB2533523 补丁  解决问题:并行计算数据库连接泄露  3.报表服务器需要打KB2654347补丁,Windows2008安装6.0补丁,windows 2008R2安装6.1补丁。  解决问题:报表支持SQL 2012 AlwaysOn。    

如何干净卸载OBA后重新安装

by yangxu 2013.8.30 14:42
注:脚本执行有风险,对于客户正式环境请在研发指导下执行。很多用户在使用OBA过程中遇到问题的第一反应就是——卸载OBA,再重装。但是实际情况是卸载之后重装,问题可能更多了,其原因可能是OBA程序本身有不完善的地方,也可能是安全软件作怪。该问题作为环境问题的首要问题。   卸载OBA后作如下检查,确认OBA卸载干净。 步骤一:卸载后文件系统是否还存在 一般OBA的安装路径是C:\Program Files\UFIDA\U9OBA,64位系统Program File路径有所不同。如果没有删除干净,手工删除一下。 步骤二:卸载后注册表可能的垃圾数据 检查如下注册表项是否存在,如存在手工删除 HKEY_CURRENT_USER\Software\Microsoft\Office\Excel\Addins\UFIDA.U9.OBA.ExcelAddInLoader HKEY_CURRENT_USER\Software\Microsoft\Office\Outlook\Addins\UFIDA.U9.CS.Office.LookupDataClient.Outlook HKEY_CURRENT_USER\Software\Microsoft\Office\Word\Addins\UFIDA.U9.OBA.WordAddInLoader Office2007检查如下注册表项是否存在,如存在手工删除 HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\User Settings\U9OBA HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\User Settings\U9OBA Office2010检查如下注册表项是否存在,如存在手工删除 HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\User Settings\U9OBA HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\User Settings\U9OBA 64位机Office2010检查如下注册表项是否存在,如存在手工删除 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\User Settings 64位机Office2007检查如下注册表项是否存在,如存在手工删除 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\12.0\User Settings (正常情况,卸载后在注册表中搜索关键字”U9OBA”,搜出的项应该都是没有意义的。) 步骤三:安装前,确认权限足够 对于win7版本以上,winserver2008版本以上的操作系统,请设置”用户账户控制设置”为最低,即”从不通知”,有可能需要重启电脑。 确认当前用户有管理员权限。 步骤四:安装过程 OBA工具一般目录结构如下,为确保所需程序都安装了,在运行setup之前,将红框两个目录的安装程序都安装一下,即使弹出框为修复,也安装一下。  

JMF框架客户端如何从服务器端获取数据

by chenzhic 2013.8.28 11:13
注:脚本执行有风险,对于客户正式环境请在研发指导下执行。JMF框架客户端如何从服务器端获取数据          该文主要介绍的是基于U9新平台框架JMF,如何在客户端获取服务器端的数据。客户端要获取的服务器端的数据主要是通过PMCallback方法来获取。          获取服务器端的数据主要包括有两种: 【1】       调BP获取相关数据:通过PMCallback方法能够调用BP获取界面需要展示的数据,通过Dictionary<string, object> result回传给客户端的Dictionary<string, object> result。 【2】       获取当前View上的数据:通过PMCallback除了能调用BP之外,还能通过UFSoft.UBF.UI.JModel.JModelManager.GetUIView()接口直接获取View上的数据。 例子如下: MO_MOOperationsView opRcd = UFSoft.UBF.UI.JModel.JModelManager.GetUIView(context.PageMethodContext, "SimpleMOUI", "MO_MOOperations") as MO_MOOperationsView; 该代码就是为了获取MO_MOOperationView上的数据,通过该方法就能在需要的时候直接获取View上的数据。 具体的案例见:U9UICode\U9.VOB.PD.MFG.V2.5\MO\Code\SimpleMOUI\WebPart\SimpleMOMainUIWebPartCodeBehindForMOOperationExtend.cs

下拉列表枚举异常问题

by lifengb 2013.8.28 09:11
注:脚本执行有风险,对于客户正式环境请在研发指导下执行。最近客户提一个问题,比较特殊,指在外协采购订单选完供应商后保存按钮置灰了。 后来经过各种方法发现来源单据类别的枚举有问题,平常应该是一进入单据来源单据类别应该为手工才对,客户现场尽然是空,后来不管选择什么类别都是空,后来问过平台,平台答复说最近有修改枚举的缓存排序方式。 根据这一点按照这个枚举的赋值方式来找,终于找到了问题所在,由于代码中有一段如下代码:sourceDocTypeControl.SelectedIndex = pO.SourceDocType.GetValueOrDefault(); 注意红色标识这,以前平台没有修改代码时,枚举的SelectedIndex 属性0肯定是手工,但是平台修改代码后枚举SelectedIndex 属性0就变了,变成其它的了,这个时候在这么赋值就肯定得不到想要结果,后面一系列判断就会出现问题,比如外协采购订单就会根据来源单据类别来判断保存是否置灰。 所以正确做法应该为:sourceDocTypeControl.SelectedValue = pO.SourceDocType.GetValueOrDefault().ToString(); 这样就不会有问题了。

在JMF新UI框架的Client工程中访问数学函数

by 尹明君 2013.5.14 14:04
注:脚本执行有风险,对于客户正式环境请在研发指导下执行。在client工程中访问ScriptSharp提供的System.Math类,里面有做基本数学运算需要的基础函数。 基本定义如下:     public static class Math{ //数学常数public static double E;public static double LN10;public static double LN2;public static double LOG10E;public static double LOG2E;public static double PI;public static double SQRT1_2;public static double SQRT2;// 数学函数public static Number Abs(Number n);public static Number Acos(Number n);public static Number Asin(Number n);public static Number Atan(Number n);public static Number Atan2(Number x, Number y);public static Number Ceil(Number n);public static Number Cos(Number n);public static Number Exp(Number n);public static Number Floor(Number n);public static Number Log(Number n);public static Number Max(params Number[] numbers);public static Number Min(params Number[] numbers);public static Number Pow(Number baseNumber, Number exponent);public static Number Random();public static Number Round(Number n);public static Number Sin(Number n);public static Number Sqrt(Number n);public static Number Tan(Number n);public static int Truncate(double n);public static int Truncate(Number n);public static int Truncate(float n);}

遇到新JMF框架下参照返回值不触发chang事件的情况,如何解决?

by 尹明君 2013.3.29 17:02
JMF下参照控件的chang事件不会被触发,如何解决? [更多...]

如何将U9会话状态管理恢复到原有超时管理的方式?

by 尹明君 2013.3.12 14:49
会话超时管理 [更多...]

如何诊断U9登录页面出现的脚本错

by 尹明君 2013.2.22 16:14
注:脚本执行有风险,对于客户正式环境请在研发指导下执行。如果发现是“ 'WebForm_CallbackComplete' 未定义”的错误,可以判断是没有加载ASP.NET的脚本文件导致。 一般,导致资源文件没有加载,有以下几个可能: 1、修改了web服务器的时间 因为微软在加载资源文件的时候设置了相应的检查策略,如果修改后的时间比资源所在的DLL的时间还往前,就会出现异常,导致资源加载失败。 2、修改了User-Agent头信息 某些(高端)路由器可以自定义User-Agent信息,某些(低端)路由器直接替换User-Agent。如果ASP.NET没有检测出正确的浏览器版本,也会进入同步模式,涉及到异步更新的脚本都不会加载(AJAX框架是属于异步更新的部分,U9对它有依赖)。 检查User-Agent信息是否被修改,可以访问www.useragentstring.com来查看。 3、未将U9加入到信任站点 不会出现前面描述的错误,但是会导致一些脚本文件的加载出现javascript的运行期错误。 应该将U9加入到信任站点,并将信任站点的安全基本设置到“默认-中低”  

开发JMF版本的UI的插件

by 尹明君 2013.1.8 11:19
JMF Form UI插件 [更多...]

如何排查多个工作流引擎连接同一数据库的情况

by 吕洪雨 2012.12.14 10:21
工作流 同一数据库 [更多...]

自定义资源类详细说明

by 吕洪雨 2012.12.11 09:24
注:脚本执行有风险,对于客户正式环境请在研发指导下执行。在开发过程中经常需要添加自定义资源类,在构造的时候构造系统会对构造后的程序集进行反射处理抽取自定义资源类中的资源形成脚本文件以供发布使用,现就如何编写自定义资源类进行详细说明,对于抽取时出现的问题可以对照异常说明和原理进行排查 一、UBFAssemblyInfo.cs文件using System;using System.Collections.Generic;using System.Text;using UFSoft.UBF.Sys.ResourceBP.Proxy;using UFSoft.UBF.MD;using UFSoft.UBF.Sys.Resource.Runtime;[assembly: UBFComponent("c4d9d648-6bb1-43e1-abe3-7fc43b4ed918", "UFIDA.U9.CS.Workflow.WorkflowBP", "WorkflowBP")] [assembly: UBFComponent("c4d9d648-6bb1-43e1-abe3-7fc43b4ed918", "UFIDA.U9.CS.Workflow.Event", "WorkflowBP")] [assembly: UBFComponent("c4d9d648-6bb1-43e1-abe3-7fc43b4ed918", "UFIDA.U9.CS.Workflow.DesignerBP", "WorkflowBP")] [assembly: UBFComponent("c4d9d648-6bb1-43e1-abe3-7fc43b4ed918", "UFIDA.U9.CS.Workflow.ExpressionBP", "WorkflowBP")] 1、系统在构造时会自成UBFAssemblyInfo.cs文件,其中最主要的是程序集级别的UBFComponent标记,三个参数分别对应了组件的标识,命名空间和类型名。在自定义资源类中将通过“命名空间.类型名”来标识资源类中包含的资源项的组件标识。2、也可以自己添加一个类型用于添加UBFComponent标记,以便在自定义资源类中使用。3、也可以在资源类文件中添加UBFComponent标记 二、自定义资源类文件//除了这两个程序集之外不要引用其它程序集using UFSoft.UBF.MD;using UFSoft.UBF.Sys.Resource.Runtime; //1、对每个资源类都必须添加该程序集级别的标记,说明该程序集中有自定义资源类//2、其属性为自定义资源类的全名,即资源类的“命名空间+类名”[assembly: HasCustomResourceAttribute("UFIDA.U9.CS.Workflow.WorkflowBP.Res")]namespace UFIDA.U9.CS.Workflow.WorkflowBP{    //1、对每个资源类都必须添加该类型级别的标记,说明该资源类中的资源所属的分类    //2、抽取时将根据该定义查找对应的UBFComponent标记标记来获取组件标识,对应UBF_Res_ResourceValue表中的ComponentId列    //3、获取组件标识的规则是将参数值“UFIDA.U9.CS.Workflow.WorkflowBP.WorkflowBP”以最后一个'.'为分隔符分解为"UFIDA.U9.CS.Workflow.WorkflowBP"和"WorkflowBP"两段,查找与之对应的UBFComponent标记,取相应的资源组件标识    [CustomerResourceCategory("UFIDA.U9.CS.Workflow.WorkflowBP.WorkflowBP")]    public class Res : CustomerResourBase    {        //声明一个静态变量        protected static CustomerResourBase Instance = new Res();         /// <summary>        /// 错误的节点信息,不是分支节点。        /// </summary>        //必须对属性添加这个标记,在抽取时会抽取该值作为资源        [CustomerResource("错误的节点信息,不是分支节点。")]        public static string Code1        {            get            {                //参数值必须为属性名                return Instance.GetResource("Code1");            }        }}

主子关系批量加载子实体

by 周运禄 2012.11.23 14:42
应用代码中批量加载子实体,以大幅减少后台查询语句 [更多...]

关于补丁中不必重复执行脚本、脚本片段的优化--杨历

by 祁宏伟 2012.11.23 13:47
补丁 升级脚本 优化 重复执行 System_FeatureUpdateRecord表 [更多...]

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

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

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

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

ISV-第三方调用U9服务上下文处理概述--待补充

by 祁宏伟 2012.5.21 10:27
注:脚本执行有风险,对于客户正式环境请在研发指导下执行。问题:      第三方调用杂发单API,已对上下文ThreadContext进行赋值,指定了UserID为当前U9登录用户。但生成的杂发单中创建人却只是指定为应用服务器电脑名。 解答:     平台处理的机制上就是获取上下文中 UserName 来写入到CreatedBy中,如果当前上下文中没有UserName,则取机器名。UFIDA.U9.ISV.MiscShipISV.CommonCreateMiscShip 这个API使用了ContextFrom(ContextDTO类型)的特殊属性来传递上下文,如果使用了这个属性来赋上下文,则不需要使用ThreadContext.直接给ContextFrom.UserCode 赋值就可以自动赋上UserID,UserName.如果这个属性赋值为null,才用ThreadContext来赋上下文。此时需要自己赋上UserID,UserCode,UserName.  

Tags:

C大平台 | UBF

RecentComments

评论 RSS

Statistics

989 篇文章
0 个单页
652775 条评论
11 次评分
243634 次访问
访问统计开始于 2019年12月15日
平均日访问 5414 次
当前 41 人在线