首页
喃喃低语
Search
1
【023】新增客开参数设置
36 阅读
2
平台领域应用合集 - U9HUB
26 阅读
3
【052】查找DataAccess的DLL路径获取密码
26 阅读
4
【056】使用警告弹窗提示用户信息
22 阅读
5
【050】客开补丁加补丁说明
21 阅读
用友U9
登录
Search
秋驰雪隙
累计撰写
60
篇文章
累计收到
2
条评论
首页
栏目
用友U9
页面
喃喃低语
搜索到
60
篇与
秋驰雪隙
的结果
2025-04-08
【019】U9报表反编译记录
报表页面在\yonyou\U9V60\Portal\UILib\UFIDA.U9.Report.IndividualRptUI.WebPart.dll,是所有报表的通用界面 不知道能不能写UI插件报表策略在\yonyou\UBFV60\U9.VOB.Product.UBF\UBFStudio\Runtime\UFIDA.UBF.Report.App.UI.dll中的UFIDA.UBF.Report.App.UI.ProcessStrategy是策略基类,UFIDA.UBF.Report.App.UI下的大多数是帮助类自定义报表策略继承的就是这个类,重写里面的VerifyParameters方法可以定义自己的行分组列分组最大限制public override string VerifyParameters(Case usercase, CaseDefine caseDefine) { //return base.VerifyParameters(usercase, caseDefine); // 不调用父类的检验规则 string text = this.ValidateFixedColumnCount(usercase); // 父类的 if (text.Length > 0) return text; text = base.VerifyBaseInfo(usercase, caseDefine); // 父类的 if (text.Length > 0) return text; //text = base.VerifyGroupNumbers(usercase); // 父类的矩阵行分组12个,列分组6个的检验,干掉 //if (text.Length > 0) return text; // 使用自己的行分组检验规则,也可以不写自己的行分组检验规则,那就是无限制(不推荐) text = this.VerifyGroupNumbers(usercase); if (text.Length > 0) return text; return null; } private new string VerifyGroupNumbers(Case usercase) { int num = 0; int num2 = 0; foreach (Group item in usercase.Groups) { if (item.Type == GroupType.Column) num2++; else if (item.Type == GroupType.Row) num++; } // 这里的限制可以自由发挥,做成可配置项,U9定义的是50,6,12 if (num > 100) return "表行分组不能超过100个!"; if (num2 > 12) return "矩阵列分组不能超过12个!"; if (num2 > 0 && num > 24) return "矩阵行分组不能超过24个!"; return string.Empty; } /// <summary> /// 校验固定列数条件(copy的父类,因为父类是私有方法无法调用,骚气的你也可以不copy。反射去调用父类的私有方法) /// </summary> /// <returns></returns> private string ValidateFixedColumnCount(Case usercase) { string empty = string.Empty; FilterValue val = usercase.FilterValues.GetObjectByName("Para_TableColumnsFixedCount"); if (val != null) { empty = val.GetValue(); if (!int.TryParse(empty, out int num)) { return ReportApplicationUIRes.FixedColumnCountMustBeNumber; } if (num < 0) { return ReportApplicationUIRes.FixedColumnCountLessThanZero; } CommonFormatProcess commonFormatProcess = new CommonFormatProcess(); int groupCountNotHead = commonFormatProcess.GetGroupCountNotHead(usercase.Groups); int num2 = 0; if (usercase.Columns != null) { num2 = usercase.Columns.Count + groupCountNotHead; } if (num > num2) { return ReportApplicationUIRes.FixedColumnCountGreatThanTotalColunms; } } return string.Empty; }查询方案在\yonyou\U9V60\Portal\UILib\UFIDA.U9.Report.ReportCaseUI.WebPart.dll的UFIDA.U9.Report.ReportCaseUIModel的ReportCaseMainUIFormWebPart是查询方案页面不知道能不能写UI插件(能写,但是没什么用,只能注入一下JS而且还只能通过定时器的方式运行)报表数据加载在\yonyou\UBFV60\U9.VOB.Product.UBF\UBFStudio\Runtime\Microsoft.ReportViewer.WebForms.dll的Microsoft.Reporting.WebForms.ReportViewer类RenderReport方法最后生成了一个URLhttp://desktop-egvqeh7/ReportServer?&rs:SessionID=tq1miizeyg4xvwzfo4ml5455&rs:command=Render&rs:Format=RPL&rc:StartPage=1&rc:EndPage=1&rc:ToggleItems=False&rc:MeasureItems=False&rc:SecondaryStreams=Server&rc:StreamNames=True&rc:StreamRoot=%2FU9%2FReserved.ReportViewerWebControl.axd%3FReportSession%3Dtq1miizeyg4xvwzfo4ml5455%26Culture%3D2052%26CultureOverrides%3DTrue%26UICulture%3D2052%26UICultureOverrides%3DTrue%26ReportStack%3D1%26ControlID%3D54ef74293e7c4759838a0dbeda2c188f%26OpType%3DReportImage%26IterationId%3Dd89432aae9be42c994f5dfe4e9f5fa2f%26StreamID%3D&rc:RPLVersion=10.6&rc:ImageConsolidation=True&rc:Toolbar=false&rs:ErrorResponseAsXml=true&rs:AllowNewSessions=false&rs%3APageCountMode=Actual使用this.ServerUrlRequest方法跳转
2025年04月08日
10 阅读
0 评论
0 点赞
2025-04-08
【018】清除U9本地补丁安装历史记录
1.1 清理数据库的补丁历史记录数据库补丁历史记录在system_InstalledAppModulePack表中-- 大家的补丁都是CD的,如果有更改,那这里条件记得更改。反正就是在数据库清除自己的客开补丁记录 delete from system_InstalledAppModulePack where DomainCode='CD'1.2 清理本地应用服务器的补丁历史记录应用服务器的补丁历史记录在~\Portal\SysManageServer\PatchConfig下面,所有配置文件全部删除,会自动生成1.3 清理报表服务器的补丁历史记录报表服务器的补丁历史记录在C:\Program Files\Microsoft SQL Server Reporting Services\SSRS\ReportServer\bin\PatchConfig下面,所有配置文件全部删除,会自动生成(如果数据库不是安装在C盘,就去相对应的盘找)1.4 重启U9所有服务2 临时使用远程数据库进行调试不想打补丁,只想调试一下,可以更改配置,不检查补丁同步修改\Portal\SysManageServer\bin文件夹下的UFIDA.UBF.SystemManage.MainControl.xml文件的CheckPatchState="false"重启U9相关服务
2025年04月08日
5 阅读
0 评论
0 点赞
2025-04-08
【017】启用U9系统参照的多选
每次要使用到料品、客户这些已经有的U9系统参照的多选的时候,都需要再次客开一个参照重新拉实体开启多选并在客开的参照代码里面组装多选ReferenceReturns返回。特此记录可以通过代码的手段改变系统参照变为多选。在AfterEventBind注册ContentChanged事件public void AfterEventBind() { this.ItemMaster99.ContentChanged += ItemMaster99_TextChanged_Extend; this.ItemMaster99.AutoPostBack = true; }在AfterCreateChildControls中传递开启参照多选的参数值public void AfterCreateChildControls() { this.ItemMaster99.AddTypeParams("IsMultiRefTag", true); }在注册的ContentChanged事件中绑定多选返回的DataTable值 private void ItemMaster99_TextChanged_Extend(object sender, EventArgs e) { this.DataCollect(); this.DataBinding(); var item = (sender as UFSoft.UBF.UI.WebControlAdapter.UFWebReferenceAdapter); DataTable dt = item.GetReturnValuesTable(item); if (dt != null && dt.Rows.Count > 0) { List<string> ids = new List<string>(); List<string> codes = new List<string>(); List<string> names = new List<string>(); foreach (DataRow dr in dt.Rows) { ids.Add(dr["ID"].ToString()); codes.Add(dr["Code"].ToString()); names.Add(dr["Name"].ToString()); } // Record为当前Model的View的FocusedRecord // 等于-1的话在点击确定触发DataCollect的时候会把ItemMaster99.Key还原成-1。建议用Record.ItemMaster_Code进行条件筛选操作 // 不等于-1的话,再次选择的多选记录,如果第一个记录的跟这次的ID一致则不会触发ContentChanged事件; // Record.ItemMaster = -1; // this.ItemMaster99.Key = string.Join(",", ids); // 后续获取FocusedRecord的ItemMaster的ID串的时候,使用this.ItemMaster99.Key Record.ItemMaster_Code = string.Join(",", codes); Record.ItemMaster_Name = string.Join(",", names); this.ItemMaster99.Value = Record.ItemMaster_Code; this.ItemMaster99.Text = Record.ItemMaster_Name; } }客开参照多选【004】客开参照多选
2025年04月08日
9 阅读
0 评论
0 点赞
2025-04-08
【016】枚举查询sql
枚举查询sqlSELECT e.Code -- 枚举编码 ,el.Name -- 枚举显示名称 ,e.EValue -- 枚举值 FROM UBF_Sys_ExtenumValue e LEFT JOIN UBF_Sys_ExtEnumValue_Trl el ON e.ID=el.ID LEFT JOIN UBF_Sys_ExtenumType ee ON ee.ID=e.ExtEnumType where ee.Code='UFIDA.U9.CBO.SCM.Item.ItemTypeAttributeEnum' -- 枚举全名通过值集的编码获取另一个枚举的值(名称匹配)通过值集发料方式编码A02获取同名称的系统发料方式枚举的枚举值SELECT e.EValue FROM UBF_Sys_ExtenumValue e LEFT JOIN UBF_Sys_ExtEnumValue_Trl el ON e.ID=el.ID LEFT JOIN UBF_Sys_ExtenumType ee ON ee.ID=e.ExtEnumType where ee.Code='UFIDA.U9.CBO.MFG.Enums.IssueStyleEnum' and el.Name=( SELECT A1.[Name] as [Name] FROM UBF_Sys_ExtEnumValue as A left join [UBF_Sys_ExtEnumValue_Trl] as A1 on (A1.SysMlFlag = 'zh-CN') and (A.[ID] = A1.[ID]) WHERE A.[Code]='A02' and A.[ExtEnumType] = (select ID from UBF_Sys_ExtEnumType where Code='UFIDA.U9.Paterson.BlueFuturePlan.FrontOrderBE.CopyOfEnumItemWay') );
2025年04月08日
8 阅读
0 评论
0 点赞
2025-04-07
【015】禁用扩展字段弹窗(禁用生产订单扩展字段示例)
配置文件<ExtendedPart parentPartFullName="UFIDA.U9.Base.FlexField.DescFlexFieldCtrlUIModel.DescFlexFieldCtrlUIFormWebPart" extendedPartFullName="UFIDA.U9.DW.UIPlugIn.DescFlexFieldCtrlUIPlugIn" extendedPartAssemblyName="UFIDA.U9.DW.UIPlugIn.dll" />DescFlexFieldCtrlUIPlugIn.csusing System; using UFIDA.U9.Base.FlexField.DescFlexFieldCtrlUIModel; using UFSoft.UBF.UI.ControlModel; using UFSoft.UBF.UI.IView; using UFSoft.UBF.UI.MD.Runtime; namespace UFIDA.U9.DW.UIPlugIn { public class DescFlexFieldCtrlUIPlugIn : UFSoft.UBF.UI.Custom.ExtendedPartBase { protected DescFlexFieldCtrlUIFormWebPart Part; public override void AfterRender(IPart part, EventArgs args) { Part = part as DescFlexFieldCtrlUIFormWebPart; if (Part == null) { base.AfterInit(Part, args); return; } IUFTabControl ctrl10 = Part.GetUFControlByName(Part.TopLevelContainer, "TabControl0") as IUFTabControl; if (ctrl10 == null) { base.AfterInit(Part, args); return; } if (!Part.ParameterValues.ContainsKey("EntityFullName")) { base.AfterInit(Part, args); return; } switch (Part.ParameterValues["EntityFullName"]) { case "UFIDA.U9.MO.MO.MO": // 生产订单 var moRecord = GetParentFocusedRecord<MFG.MO.DiscreteMOUIModel.MORecord>(); if (moRecord != null) { // (0开立 4核准中)启用,其它状态禁用 ctrl10.Enabled = moRecord.DocState == 0 || moRecord.DocState == 4; } break; default: break; } base.AfterInit(Part, args); } private U GetParentFocusedRecord<U>() where U : class { DescFlexFieldCtrlRecord focusedRecord = Part.Model.DescFlexFieldCtrl.FocusedRecord; if (focusedRecord != null && !string.IsNullOrEmpty(focusedRecord.descViewName)) { IUIModel iuimodel = (IUIModel)Part.CurrentState[Part.ParentTaskID]; if (iuimodel != null) { IUIView iuiview = iuimodel.Views.Contains(focusedRecord.descViewName) ? iuimodel.Views[focusedRecord.descViewName] : null; if (iuiview != null && iuiview.FocusedRecord != null) { return iuiview.FocusedRecord as U; } } } return null; } } }
2025年04月07日
15 阅读
0 评论
0 点赞
2025-04-07
【014】客开打印(标准代码并追加根据不同模板生成不同的文件名)
打印/输出按钮添加代码// 输出 private void OutputClick_Extend(object sender, UIActionEventArgs e) { if (Print(sender, e)) { //调用模版定义的默认实现方法.如需扩展,请直接在此编程. this.OutputClick_DefaultImpl(sender, e); } } // 打印 private void PrintClick_Extend(object sender, UIActionEventArgs e) { if (Print(sender, e)) { //调用模版定义的默认实现方法.如需扩展,请直接在此编程. this.PrintClick_DefaultImpl(sender, e); } } // 打印设置 private IExportSettings settings = null; private bool Print(object sender, UIActionEventArgs e) { this.CurrentModel.ClearErrorMessage(); POFeeCheckHeadRecord focusedRecord = this.CurrentModel.POFeeCheckHead.FocusedRecord; if (focusedRecord == null || focusedRecord.ID <= 0) return false; settings = ExportServiceFactory.GetInstance().CreateExportSettingsObject(); settings.PrintTemplateCatalogType = "Cust.POFeeCheckHead"; //打印模板类型 实体识别ID settings.UserDataCallBack = new DataCallBackHandle(GetPrintData); settings.AfterLoadPrintTemplate = new PrintTemplateLoadedHandle(AfterLoadPrintTemplate); e.Tag = settings; return true; } // 打印输出更改文件名 private void AfterLoadPrintTemplate(object sender, PrintTemplateLoadedArgs args) { if (settings == null) return; POFeeCheckHeadRecord focusedRecord = this.CurrentModel.POFeeCheckHead.FocusedRecord; if (focusedRecord == null || focusedRecord.ID <= 0) return; DataParamList dataParams = new DataParamList { DataParamFactory.CreateInput("ID", focusedRecord.ID, System.Data.DbType.Int64), DataParamFactory.CreateInput("PrintTemplateID", args.PrintTemplateID), DataParamFactory.CreateInput("PrintTemplateCatalogType", settings.PrintTemplateCatalogType) }; DataAccessor.RunSP(DataAccessor.GetConn(), "Proc_Cust_GetPrintFileName", dataParams, out object fileName); if (fileName != null) settings.FileName = fileName.ToString(); } // 获取打印数据 private void GetPrintData(object sender, DataCallBackEventArgs args) { POFeeCheckHeadRecord focusedRecord = this.CurrentModel.POFeeCheckHead.FocusedRecord; if (focusedRecord == null || focusedRecord.ID <= 0) return; DataParamList dpl = new DataParamList { DataParamFactory.CreateInput("ID", focusedRecord.ID, System.Data.DbType.Int64), DataParamFactory.CreateInput("PrintTemplateID", args.PrintTemplateID) }; // 调用自己的获取打印数据的存储过程 DataAccessor.RunSP("Proc_Cust_PrintData", dpl, out System.Data.DataSet retDS); args.ReturnData = retDS; } Proc_Cust_GetPrintFileName存储过程SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: qxq -- Create date: 2023年7月3日 -- Description: 打印输出获取文件名称Proc_Cust_GetPrintFileName -- ============================================= CREATE OR ALTER PROCEDURE dbo.Proc_Cust_GetPrintFileName ( @ID bigint -- ID ,@PrintTemplateID nvarchar(50)=NULL -- 打印模板ID ,@PrintTemplateCatalogType nvarchar(50)=NULL ) AS BEGIN SET NOCOUNT ON; -- 采购对账单 if(@PrintTemplateCatalogType='Cust.POFeeCheckHead') begin declare @TemplateName nvarchar(500) select @TemplateName=TemplateName from UBF_Print_Templates where TemplateID=@PrintTemplateID and CatalogType=@PrintTemplateCatalogType declare @Prefix nvarchar(500) select @Prefix=CONCAT(supl.[Name],N' ',FORMAT(head.BusinessDate,'M月')) from dbo.Cust_POFeeCheckHead as head join dbo.CBO_Supplier_Trl as supl on supl.ID=head.Supplier and supl.SysMLFlag='zh-CN' where head.ID=@ID return concat(@Prefix,@TemplateName) end END GO输出DataGridprivate void OutputClick_Extend(object sender, UIActionEventArgs e) { IExportSettings settings = ExportServiceFactory.GetInstance().CreateExportSettingsObject(); settings.UIDataGridName = "DataGrid1"; e.Tag = settings; }
2025年04月07日
9 阅读
0 评论
0 点赞
2025-04-07
【013】获取用户权限ID
查询用户“admin”,所属组织机构编码“101”的所有角色权限IDDECLARE @OrgID BIGINT,@UserID BIGINT SELECT @OrgID=ID FROM dbo.Base_Organization WHERE Code='101' SELECT @UserID=ID FROM dbo.Base_User WHERE Code='admin' SELECT r.ID FROM dbo.Base_Role r LEFT JOIN dbo.Base_UserOrgRole uor ON uor.[Role]=r.ID LEFT JOIN dbo.Base_UserOrg uo ON uo.ID=uor.UserOrg WHERE uo.[User]=@UserID AND uo.Org=@OrgID -- 一般赋值当前登录的UserID与OrgID
2025年04月07日
12 阅读
0 评论
0 点赞
2025-04-07
【012】根据实体显示名称反查实体放置在哪个二级菜单下
-- A1.Name为最终查询出来的二级菜单名称 -- D1.DisplayName为实体显示名称(可在ClassView中查到) -- D.Name为实体名称(显示名称一致,实体名称不一致的时候加上此条件) -- D.FullName为实体全名(一般为命名空间.Replace("::", "."),前面两个都一致的时候可以加上这个条件,或者直接使用这个条件) SELECT A1.ID,A1.Name,D.Name,D1.DisplayName FROM [dbo].[Base_Application] A LEFT JOIN [dbo].[Base_Application_Trl] A1 ON A1.SysMLFlag='zh-cn' AND A1.ID=A.ID LEFT JOIN dbo.UBF_Assemble_AppComponents C ON A1.ID=C.[Application] LEFT JOIN dbo.UBF_MD_Component B ON C.ComponentID=B.MD_Module_ID LEFT JOIN dbo.UBF_MD_Class D ON D.MD_Component_ID=B.ID LEFT JOIN dbo.UBF_MD_Class_Trl D1 ON D1.Local_ID=D.Local_ID WHERE D1.DisplayName='收货单'-- 直接使用实体全名查询 SELECT A1.ID,A1.Name,D.Name,D1.DisplayName FROM [dbo].[Base_Application] A LEFT JOIN [dbo].[Base_Application_Trl] A1 ON A1.SysMLFlag='zh-cn' AND A1.ID=A.ID LEFT JOIN dbo.UBF_Assemble_AppComponents C ON A1.ID=C.[Application] LEFT JOIN dbo.UBF_MD_Component B ON C.ComponentID=B.MD_Module_ID LEFT JOIN dbo.UBF_MD_Class D ON D.MD_Component_ID=B.ID LEFT JOIN dbo.UBF_MD_Class_Trl D1 ON D1.Local_ID=D.Local_ID WHERE D.[FullName]='UFIDA.U9.PM.Rcv.Receivement'
2025年04月07日
9 阅读
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
【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 点赞
1
...
4
5
6