首页
喃喃低语
Search
1
【023】新增客开参数设置
36 阅读
2
平台领域应用合集 - U9HUB
26 阅读
3
【052】查找DataAccess的DLL路径获取密码
26 阅读
4
【056】使用警告弹窗提示用户信息
22 阅读
5
【050】客开补丁加补丁说明
21 阅读
用友U9
登录
Search
秋驰雪隙
累计撰写
60
篇文章
累计收到
2
条评论
首页
栏目
用友U9
页面
喃喃低语
搜索到
60
篇与
用友U9
的结果
2025-04-07
【010】打印_报表自定义字段拉取扩展字段自定义值集的名称
ZDY023 是自定义值集的值集编码select B.Name from UFIDA::U9::Base::FlexField::ValueSet::DefineValue B where B.ValueSetDef.Code='ZDY023' and B.Code in ( ...查询扩展字段Code的语句... )例如:帝欧系统-成品入库单-扩展字段 2(入库部门)select B.Name from UFIDA::U9::Base::FlexField::ValueSet::DefineValue B where B.ValueSetDef.Code='ZDY023' and B.Code in ( select UFIDA::U9::Complete::RCVRpt::RcvRptDocLine.RcvRptDoc.DescFlexField.PrivateDescSeg2 as 实体扩展字段_私有段2 from UFIDA::U9::Complete::RCVRpt::RcvRptDocLine where UFIDA::U9::Complete::RCVRpt::RcvRptDocLine.RcvRptDoc.DocNo='Co-2202094285')成品入库单操作示例.mp4您的浏览器不支持 HTML5 视频,请下载Chrome或者Edge浏览器。
2025年04月07日
8 阅读
0 评论
0 点赞
2025-04-07
【011】获取多语言表对应的扩展字段的显示名称
if(OBJECT_ID('fn_CombineDisplayName') is not null) drop function fn_CombineDisplayName go CREATE FUNCTION fn_CombineDisplayName ( @CombineName nvarchar(max), -- 多语言表的CombineName @Num int -- 第几个扩展字段,私有扩展段+50 ) RETURNS nvarchar(max) AS BEGIN declare @Result nvarchar(max)='' declare @sep varchar(6),@sepLen int,@indexS int set @sep='#@#' set @sepLen=Len(@sep) set @indexS=CHARINDEX(@sep, @CombineName) if(@Num=1) begin set @Result = substring(@CombineName, 1, @indexS - 1) end else begin declare @i int set @i=2 while(@i<@Num) begin set @indexS=CHARINDEX(@sep, @CombineName, @indexS + @sepLen) set @i+=1 end set @indexS = @indexS + @sepLen set @Result = substring(@CombineName, @indexS, CHARINDEX(@sep, @CombineName, @indexS) - @indexS) end return @Result END -- 示例 -- declare @str nvarchar(max)='裁板#@#电建地产-云立方#@#研发类#@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@#1231314#@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@##@#' -- select dbo.fn_CombineDisplayName(@str, 3) GO
2025年04月07日
7 阅读
0 评论
0 点赞
2025-04-07
【004】客开参照多选
将参照设置为多选参照在ConfirmButton_Click_Extend函数中判断并实现多选返回private void ConfirmButton_Click_Extend(object sender, EventArgs e) { //调用模版提供的默认实现.--默认实现可能会调用相应的Action. string script = ""; string returnXml = GetReturnXML(); if (string.IsNullOrEmpty(returnXml)) { script = "<script language=\"javascript\">window.close();</script>"; AtlasHelper.RegisterAtlasStartupScript((Control)TopLevelContainer, this.GetType(), "ReferenceReturn", script, false); return; } string xml = UFIDA.U9.UI.Commands.CommandHelper.EscapeHTML(returnXml); // 编码 script = string.Format("<script language=\"javascript\">window.returnValue=\"{0}\"; window.close(); </script>", xml); AtlasHelper.RegisterAtlasStartupScript((Control)TopLevelContainer, this.GetType(), "ReferenceReturn", script, false); ConfirmButton_Click_DefaultImpl(sender,e); } private string GetReturnXML() { IUIView view = this.Model.cRef; StringBuilder returnXml = new StringBuilder("<ReferenceReturns>"); List<string> ids = new List<string>(); List<string> codes = new List<string>(); List<string> names = new List<string>(); //从缓存中读取选中的记录 IList<IUIRecord> selRecordList = view.Cache.GetSelectRecord(); if (selRecordList != null && selRecordList.Count > 0) { foreach (cRefRecord record in selRecordList) { ids.Add(record["ID"].ToString()); codes.Add(record["Code"].ToString()); names.Add(record["Name"].ToString()); } } else { foreach (cRefRecord record in view.SelectRecords) { ids.Add(record["ID"].ToString()); codes.Add(record["Code"].ToString()); names.Add(record["Name"].ToString()); } } returnXml.Append("<ReferenceReturn>"); returnXml.AppendFormat("<ReturnField name=\"ID\" value=\"{0}\"/>", string.Join(",", ids));// returnXml.AppendFormat("<ReturnField name=\"Code\" value=\"{0}\"/>", string.Join(",", codes));//Code集合 returnXml.AppendFormat("<ReturnField name=\"Name\" value=\"{0}\"/>", string.Join(",", names));//name集合 //G类档案,多组织ID转换======= returnXml.AppendFormat("<ReturnField name=\"{0}\" value=\"Code\"/>", UFIDA.U9.UI.PDHelper.Commands.ReferenceMultiOrgInitComplete.MultiRefIDFlag); //=======end=========== returnXml.Append("</ReferenceReturn>"); returnXml.Append("</ReferenceReturns>"); return returnXml.ToString(); }启用U9系统参照的多选【017】启用U9系统参照的多选
2025年04月07日
4 阅读
0 评论
0 点赞
2025-04-07
【005】报表参数-枚举ID查询
报表参数,为枚举类型即下拉选择:根据枚举全名(数据字段查找实体下枚举全名)查找出枚举ID,在报表参数中,选择参照类型为Enumerator,枚举ID输入以下查询出的枚举ID,输入UBF中的枚举ID输入框中,点击加载即可declare @FN varchar(550), @ClsID bigint, @UID varchar(50) select @FN='UFIDA.U9.CBO.Enums.DemandCodeEnum' -- 此处只需填入需要查询的枚举FullName,示例为标准产品的需求分类枚举 select @ClsID=Local_ID,@UID=ID from UBF_MD_Class where FullName=@FN and ClassType=3 select @UID
2025年04月07日
10 阅读
0 评论
0 点赞
2025-04-07
【006】报表与策略关系绑定
查询报表模板IDselect ID as '策略中使用的ID',* from dbo.UBF_MD_ASRPT_Category where cname like '%管理库龄分析报表%'--报表模板容器名称模板与策略绑定ReportID:报表容器ID。Type:策略类。Assembly:策略所在DLL<UserReportStrategy ReportID="238BE065-8197-49AB-ABD6-DBEB3B9009B1" Type="UFIDA.U9.UserDefine.CA.RptProcessStrategy.ManuPlanStrategy" Assembly="UFIDA.U9.UserDefine.CA.RptProcessStrategy" />策略文件部署策略文件位置把策略文件部署到文件夹:U9\Portal\UILib找到配置文件U9\Portal\UserReportStrategyConfig.xml若没有则新建 格式为: <UserReportStrategyConfig> …配置节… </UserReportStrategyConfig>添加配置节ReportID:报表容器ID。Type:策略类。Assembly:策略所在DLL<UserReportStrategy ReportID="4652225b-8b46-4bd4-a347-d5751c05acc7" Type="UFIDA.U9.UserDefine.CA.RptProcessStrategy.ManuPlanStrategy" Assembly="UFIDA.U9.UserDefine.CA.RptProcessStrategy" />报表属性模板描述:在Portal导航栏显示的名称策略类型全称:报表策略类命名空间+类名策略程序集:策略类所在的程序集dll名称,不需要写程序集后缀.dll
2025年04月07日
9 阅读
0 评论
0 点赞
2025-04-07
【007】补丁工具需要的存储过程
/****** Object: StoredProcedure [dbo].[AllocBuildSerials] Script Date: 2021/11/1 10:13:43 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE OR ALTER PROCEDURE [dbo].[AllocBuildSerials] @AllocCount INT OUTPUT, @StartSN BIGINT OUTPUT AS BEGIN DECLARE @ReturnValue INT; DECLARE @InstanceName NVARCHAR(256); DECLARE @DatabaseName NVARCHAR(256); SET @InstanceName=CONVERT(NVARCHAR(256), SERVERPROPERTY('servername')); SET @DatabaseName=DB_NAME(); EXEC [dbo].[CLR_AllocSerials] @AllocCount,@InstanceName,@DatabaseName,@StartSN OUTPUT,@ReturnValue OUTPUT RETURN @ReturnValue END GO
2025年04月07日
9 阅读
0 评论
0 点赞
2025-04-07
【003】U9状态按钮水印效果
private void SetWaterMark() { RtnProfitOrderRecord headRecord = this.Model.RtnProfitOrder.FocusedRecord; if (headRecord == null) return; if (headRecord.DocStatus == 0L) { UFWaterMark mark_Opened = new UFWaterMark(); mark_Opened.TargetControl = this.DocStatus139; mark_Opened.WaterMarkType = enuMarkType.Open; } if (headRecord.DocStatus == 1L) { UFWaterMark mark_Approving = new UFWaterMark(); mark_Approving.TargetControl = this.DocStatus139; mark_Approving.WaterMarkType = enuMarkType.Approving; } if (headRecord.DocStatus == 2L) { UFWaterMark mark_Approved = new UFWaterMark(); mark_Approved.TargetControl = this.DocStatus139; mark_Approved.WaterMarkType = enuMarkType.Approved; } if (headRecord.DocStatus == 3L) { UFWaterMark mark_Approved = new UFWaterMark(); mark_Approved.TargetControl = this.DocStatus139; mark_Approved.WaterMarkType = enuMarkType.Colse; } }
2025年04月07日
7 阅读
0 评论
0 点赞
2025-04-07
【001】U9问题集
1. 自定义的视图,没有FocusedRecord(需要在OnLoadData_Extend中新增)private void OnLoadData_Extend(object sender) { if (this.Model.MainView.FocusedRecord == null) { this.Model.MainView.FocusedRecord = this.Model.MainView.AddNewUIRecord(); } OnLoadData_DefaultImpl(sender); }2. 单据列表中拉取的扩展字段未能显示值,但是在单据中是正常的如果是带放大镜的文本(实体or值集or枚举类型),需要同步刷新表的的多语言表 【038】U9私有扩展字段枚举的多语言表的SQL更新 【039】U9私有字段自定义值集的多语言表的SQL更新3. 在本地的界面正常,但是打到测试服务器界面错乱(有很多字段未显示)检查是否有个性化模板,如果有并且无法删除,通过URL强制删除个性化模板进行清除4. UBF报表开发无法登录(密码是正确的,可以登录U9)2023年7月21号的一个补丁更新的加密方式,需要升级UBF到最新版5. SQLServer Report 2017安装之后无法在U9安装工具中连接2017版本的报表更新了代码连接方式,需要先下载同步最新补丁才能连接6. 调度程序读取到的配置不如预期谨慎使用全局静态变量,特别是配置类型的,因为不同企业组织都会引用同一个DLL进行调度7. 菜单发布包表UBF_Assemble_AppComponents8. 获取企业编码string entcode = ContextManager.Context["EnterpriseID"].ToString(); string entCode = PlatformContext.Current.EnterpriseID;9. 子行的明细行里面的弹性域名称需要自定义,不然会取默认的"DescFlexField",会报错找不到列public void AfterCreateChildControls() { //弹性域设置 FlexFieldHelper.SetDescFlexField(new DescFlexFieldParameter[] { new DescFlexFieldParameter(this.FlexFieldPicker0, this.Model.CheckOrderHead) }); FlexFieldHelper.SetDescFlexField(new DescFlexFieldParameter[] { new DescFlexFieldParameter(this.FlexFieldPicker5, this.Model.CheckOrderHead_CheckWorkItemDetailLine_CheckWorkAppearanceLine, "DescFlexFields") }); FlexFieldHelper.SetDescFlexField(new DescFlexFieldParameter[] { new DescFlexFieldParameter(this.FlexFieldPicker3, this.Model.CheckOrderHead_CheckWorkItemDetailLine_CheckWorkCommentLine, "DescFlexFields") }); FlexFieldHelper.SetDescFlexField(this.DataGrid7, this.DataGrid7.Columns.Count - 1, "DescFlexFields"); FlexFieldHelper.SetDescFlexField(this.DataGrid8, this.DataGrid8.Columns.Count - 1, "DescFlexFields"); FlexFieldHelper.SetDescFlexField(this.DataGrid10, this.DataGrid10.Columns.Count - 1, "DescFlexFields"); }10. 写了开启个性化的代码,但是个性化失效(无法保存)开启个性化的代码必须写在AfterCreateChildControls里面11. 打印模板在开发的服务器正常使用,但是发布到别的服务器之后报空指针引用如果是从Model里面生成的第一份模板,是超级管理员创建的,发布应用的时候会发布到开发配置的数据库去,所以其他服务器找不到这个模板,部署到其他服务器时,需要另存为一份(可以看到另存为的后面有用户自定义的字样),然后再导出导入12. UBF上配置了模型代码生成路径为\Code\QXQ,但是生成的代码还是到\Code里面~\yonyou\UBFV60\U9.VOB.Product.UBF\UBFStudio\UFSoft.UBF.Business.ModelBuilder.Console.exe ModelBuilder.BuildProject中会对targetPath重新赋值// fullProjectFile是Model所在的目录 int num = fullProjectFile.IndexOf("Model"); targetPath = fullProjectFile.Substring(0, num + 5).Replace("Model", "Code");可以在UFSoft.UBF.CodeGenerator.TemplateTransConfig.xml的SourceCodeConfig中配置Code的下级生成目录,Items节点的子节点为命名空间按照.分割的下标为2的字符串(例如UFIDA.U9.QXQ.XXX就是QXQ),节点内容为要拼接的下级节点(要带后\);DefaultSet为如果找不到Items子节点的默认文件夹名(例如这里配置了Main,然后有一个UFIDA.U9.Cust.XXX没有找到Items->Cust的节点就将生成路径拼接Main)13. 菜单发布工具发布报错,ConnectionString属性尚未初始化注释ubfenginehosting.dll.config里面值带有DBConnection的节点<!-- <Provider type="UFIDA.U9.BS.DBConnection.EnterpriseProvider,UFIDA.U9.BS.DBConnection"></Provider> -->14. 将报错信息提示到行// lineRecord就是行的Record,第二个参数为触发提示的行字段 Model.ErrorMessage.SetErrorMessage(ref lineRecord, "ReplaceItem", "原料跟可替代料不能为空");15. 列表的精度绑定16. U9C右上角提示弹出代码Part.ShowWindowStatus("提示信息", true); // 第二个参数为true则显示在右上角,自动关闭由于系统加载会覆盖ShowWindowStatus,建议将提示信息存入CurrentSessionState,在AfterRender后弹出 示例提示信息存入CurrentSessionState[“DiscountCalcMsg”]中public override void AfterRender(IPart Part, EventArgs args) { base.AfterRender(Part, args); curPart = Part as ARMainUIFormWebPart; if (curPart != null && curPart.CurrentSessionState.ContainsKey("DiscountCalcMsg")) { string msg = ""; if (curPart.CurrentSessionState["DiscountCalcMsg"] != null) { msg = curPart.CurrentSessionState["DiscountCalcMsg"]?.ToString(); } curPart.CurrentSessionState["DiscountCalcMsg"] = null; if (!string.IsNullOrEmpty(msg)) { var headRecord = curPart.Model.ARBillHead.FocusedRecord; if (headRecord.ID > 0) { msg = $"单号:{headRecord.DocNo},{msg}"; } curPart.ShowWindowStatus(msg, true); } } }17. 设置页签上的小箭头 //TabControl1_SelectedIndexChanged... private void TabControl1_SelectedIndexChanged_Extend(object sender, EventArgs e) { //调用模版提供的默认实现.--默认实现可能会调用相应的Action. TabControl1_SelectedIndexChanged_DefaultImpl(sender, e); } public void AfterEventBind() { this.TabControl1.NavButtonClickEvent += TabControl1_NavButtonClickEvent; } private void TabControl1_NavButtonClickEvent(object sender, NavButtonClickEventArgs e) { try { this.OnDataCollect(this); NavButtonHelper.NavigateTabPage(sender, e, this.Model.SOQuotation_SOQuotationLine); //UFIDA.U9.UI.PDHelper.NavButtonHelper.NavigateGrid(this, this.DataGrid8); } catch (Exception exception) { if (ExceptionHelper.IsUnknownException(exception, true)) { throw; } IUIModel model = this.Model; this.Model.ErrorMessage.SetErrorMessage(ref model, exception); } } public void AfterUIModelBinding() { // 设置页签上的小箭头 SetJT(); } private void SetJT() { TabPage15.ShowNavButton = true; NavButtonHelper.SetNavButtonEnableStatus(TabPage15, Model.SOQuotation_SOQuotationLine);//方向箭头自动置灰处理,第二个参数需要绑定需要切换的Model }18. 标准报表的参照修改数据库里面修改报表模板“ 标准”改成“自定义”即可修改select a.* from UBF_MD_ASRPT_Category A left join UBF_MD_ASRPT_ReportTemplate b on a.id=b.uReportID where a.cName like '%库存数量%' -- 找到库存数量报表的ID update UBF_MD_ASRPT_Category set iUserDefine =1 where ID='1D39E0BA-6D0C-4CD5-AA0C-0D2E2D3B7175' -- 更新iUserDefine=1,表示自定义
2025年04月07日
20 阅读
0 评论
0 点赞
2025-04-07
【002】把客开的可扩展的枚举下拉前面的Code显示去掉
UBF上正常设置可扩展=True数据库使用SQL把可扩展更改为False做完这一步界面上的下拉框就不包含Code了,但是自定义代码那边无法编辑-- Code为枚举全称 update UBF_Sys_ExtEnumType set [IsExtend]=0 where Code in ('UFIDA.U9.XX.XXX1Enum','UFIDA.U9.XX.XXX2Enum','UFIDA.U9.XX.XXX3Enum')开发UI插件新建UDCUUIPlugIn.cs需要引入自定义代码的DLL:~/Portal/UILib/UFIDA.U9.Base.UDCUI.WebPart.dllusing System; using UFIDA.U9.Base.UDC.UDCUI; using UFSoft.UBF.UI.ControlModel; using UFSoft.UBF.UI.IView; namespace UFIDA.U9.SH.UIPlugIn { // UFIDA.U9.Base.UDC.UDCUI.UDCUIWebPart public class UDCUUIPlugIn : UFSoft.UBF.UI.Custom.ExtendedPartBase { private readonly string[] canEditCodes = new string[] { "UFIDA.U9.XX.XXX1Enum","UFIDA.U9.XX.XXX2Enum","UFIDA.U9.XX.XXX3Enum" }; public override void BeforeDataBinding(IPart Part, out bool executeDefault) { base.BeforeDataBinding(Part, out executeDefault); if (Part is UDCUIWebPart) { // Code486中存储的就是选择的实体的全称 IUFFldTextBox code = Part.GetUFControlByName(Part.TopLevelContainer, "Code486") as IUFFldTextBox; if (code == null || Array.IndexOf(canEditCodes, code.Text) == -1) return; IUFDataGrid dataGrid = Part.GetUFControlByName(Part.TopLevelContainer, "DataGrid1") as IUFDataGrid; if (dataGrid == null || dataGrid.EditStatus == EditStatus.Edit) return; dataGrid.EditStatus = EditStatus.Edit; } } } }UI配置文件参考不在WebPartExtend.config中追加新建UI插件配置文件名称:WebPartExtend_UDCUIPlugin.config可直接单独部署到Portal目录下,重启IIS即可,配置内容如下<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="WebPartExtend" type="UFSoft.UBF.UI.Custom.ExtendedPartSection, UFSoft.UBF.UI.FormProcess" /> </configSections> <WebPartExtend> <!--自定义代码插件--> <ExtendedPart parentPartFullName="UFIDA.U9.Base.UDC.UDCUI.UDCUIWebPart" extendedPartFullName="UFIDA.U9.SH.UIPlugIn.UDCUUIPlugIn" extendedPartAssemblyName="UFIDA.U9.SH.UIPlugIn.dll" /> </WebPartExtend> </configuration>
2025年04月07日
7 阅读
0 评论
0 点赞
2023-10-28
平台领域应用合集 - U9HUB
需要先登录 https://u9hub.diwork.com 才能查看相对应资料平台领域应用合集安装部署:参见张金亮老师的培训文档,参见https://pan.baidu.com/s/1nr3JrlxBExpPZhJq8_DvHA 密码:4649工作流设置及典型场景:https://u9hub.diwork.com/a/p/01ed0b30b5c5592ced67527ffec75f4c工作流培训:https://u9hub.diwork.com/a/p/01ed13ad3dc5bc67e9544e5b60b29ab8考虑到有很多是刚接触工作流的朋友。也附上了工作流初级篇。权限管理初级篇培训参见: https://u9hub.diwork.com/a/p/01ed2992173113d4d75d4e5b60b29ab8权限管理高级篇参见 [https://u9hub.diwork.com/a/p/01ed4949b6c4159c98d0e2aa13dc85a8]弹性域培训:https://u9hub.diwork.com/a/p/01ed0c237f3499a497f6527ffec75f4cOBA安装与使用:https://u9hub.diwork.com/a/p/01eccf8c970170e4fca47e3b47117ef2函数说明与使用场景:https://u9hub.diwork.com/a/p/01eceb28dd55c087b1746ee05897c3c5 (包含函数介绍以及适用场景,不适用场景,举例),个别函数不熟悉,感谢资深客开研发陈建华老师的补充,参见https://u9hub.diwork.com/a/p/01ecf55cd65b87f00ddd6ee05897c3c5UBF环境设置:https://u9hub.diwork.com/a/p/01ed09c906b50f2e051e527ffec75f4c 移动审批设置文档--参见吴高飞老师编写的文档:https://u9hub.diwork.com/a/p/01ec697261e4952c2ed33e9fb36e8145移动审批配置文档包含 V66版本和U9C版本的参见链接:https://u9hub.diwork.com/a/p/01ed4868aa2c5a5502ebe2aa13dc85a8邮件审批培训:见 https://pan.baidu.com/s/1zTMNnRftP5J3vjMCo1vLmw提取码:9mre个性化参见组件化:https://u9hub.diwork.com/a/p/66fac4678a44196318d650642aa8a0e35中的个性化部分。各种日志位置—参见黄枢总写的文章:https://u9hub.diwork.com/a/p/602cbe37969d52a55735db6e7cefa860附件在线预览:https://u9hub.diwork.com/a/p/7d10367453f3510d8873d035ef7b26a5/预警消息:参见https://u9hub.diwork.com/a/p/01ea0cef7abd1f109c12250c11204fbf环境支持发邮件相关配置:参见https://u9hub.diwork.com/a/p/01ebd9a3bf9417c0b128093fd4f94b35数据字典搭建:参见陈建华老师的文章https://u9hub.diwork.com/a/p/01e9550261be19a08fd213a530cf1cb6这种方式会显示数据库登录密码,介意的可以使用https://u9hub.diwork.com/a/entity/searchUBF打印模板制作:参见郭智超老师的打印宝典https://u9hub.diwork.com/a/p/01ea21740d031780aa2425945827765a打印模板培训:参见https://u9hub.diwork.com/a/p/01ed02497569f7d073dd4242aabba409客开资料大全: https://u9hub.diwork.com/a/p/01ebf5e55c3b11608b0215eeaab6bd02敏感日志设置/操作日志:https://u9hub.diwork.com/a/p/bd4005c8629c8425beef50b831a1c87e料品/客户/供应商审核后不让改,用数据权限控制,参见https://u9hub.diwork.com/a/p/01e9c9864c0916f0b28f4748d1d218b6附件无法下载的,请云盘下载:https://pan.baidu.com/s/1zTMNnRftP5J3vjMCo1vLmw提取码:9mre
2023年10月28日
26 阅读
0 评论
0 点赞
1
...
5
6