首页
喃喃低语
Search
1
【023】新增客开参数设置
35 阅读
2
平台领域应用合集 - U9HUB
26 阅读
3
【052】查找DataAccess的DLL路径获取密码
26 阅读
4
【056】使用警告弹窗提示用户信息
22 阅读
5
【050】客开补丁加补丁说明
21 阅读
用友U9
登录
Search
秋驰雪隙
累计撰写
60
篇文章
累计收到
2
条评论
首页
栏目
用友U9
页面
喃喃低语
搜索到
60
篇与
秋驰雪隙
的结果
2025-06-19
【059】应收单交易分录【主营业务收入】
获取应收单行的预设科目=主营业务收入的会计科目查询SQL语句select head.DocNo,arline.LineNum,Act.Segment1 from AR_ARBillLine as arline inner join AR_ARBillHead as head on head.ID=arline.ARBillHead inner join AR_ARBillRCLine as arrcline on arrcline.ARBillLine=arline.ID inner join AAI_TransactionEntry as aai on aai.OriginalEntityType='UFIDA.U9.AR.ARBill.ARBillRCLine' and aai.OriginalEntity=arrcline.ID -- 交易分录 inner join AAI_TransEntryTemplet as aaitemp on aaitemp.ID=aai.EntryTemplet -- 交易分录模板 inner join AAI_PredeterminedAccount_Trl as aaipreaccl on aaipreaccl.ID=aaitemp.PredAcct and aaipreaccl.Name=N'主营业务收入' -- 预设科目 inner join CBO_Account AS Act ON aai.Account = Act.ID -- 会计科目 where head.DocNo='102TH2024110309'结果
2025年06月19日
4 阅读
0 评论
0 点赞
2025-06-19
【058】出货单交易分录【主营业务成本】
获取出货单行的预设科目=主营业务成本的会计科目查询SQL语句select sp.DocNo,spl.DocLineNo,Act.Segment1 from SM_ShipLine as spl inner join SM_Ship as sp on sp.ID=spl.Ship inner join InvTrans_Period as peri on peri.TransDocLine_EntityType='UFIDA.U9.SM.Ship.ShipLine' and peri.TransDocLine_EntityID=spl.ID inner join InvTrans_PeriodCost as cost on cost.Period=peri.ID inner join AAI_TransactionEntry as aai on aai.OriginalEntityType='UFIDA.U9.InvTrans.Trans.PeriodCost' and aai.OriginalEntity=cost.ID inner join AAI_TransEntryTemplet as aaitemp on aaitemp.ID=aai.EntryTemplet -- 交易分录模板 inner join AAI_PredeterminedAccount_Trl as aaipreaccl on aaipreaccl.ID=aaitemp.PredAcct and aaipreaccl.Name=N'主营业务成本' -- 预设科目 inner join CBO_Account AS Act ON aai.Account = Act.ID -- 会计科目 where sp.DocNo='101FHD25012000001'结果
2025年06月19日
10 阅读
0 评论
0 点赞
2025-06-17
【057】实体扩展字段设置只读
有时候扩展了一些私有段需要存储一些计算的值,或者生单的来源单信息,原则上是不允许用户修改只能查看 但是在个性化模板上只能选择扩展到什么地方,没有设置只读的选项 可以在界面权限的动作权限进行限制界面权限设置效果图示
2025年06月17日
12 阅读
0 评论
0 点赞
2025-06-06
【056】使用警告弹窗提示用户信息
某些操作,如果有小部分信息缺失不影响逻辑,但是有些场景又必须要填写 遇到过很多次客户想能不能弹出警告提示一下,再进行一次确认动作 刚好在库存->转总账模块看到生成凭证有弹窗,特此记录如何使用U9系统的ShowMsg函数curPart是UI插件的IPart及其实现类如果不是UI插件,是webPart页面,直接用this即可 /// <summary> /// 弹出提示信息 /// </summary> /// <param name="targetType">触发类型,用于单个页面有多个弹窗的时候判断</param> /// <param name="errorList">提示信息,最好不超过4行</param> private void ShowMsg(string targetType, params string[] errorList) { if (errorList == null || errorList.Length == 0) return; string TaskID = curPart.TaskId.ToString(); if (curPart.CurrentState["ReMakePland"] != null) { curPart.CurrentState["ReMakePland"] = false; } NameValueCollection nameValues = new NameValueCollection(); curPart.CurrentState["ErrorString"] = errorList.ToList(); curPart.CurrentState["TargetType"] = targetType; curPart.ShowModalDialog("4034d041-4190-4eb8-9e0a-16a214370108", "", "600", "152", TaskID, nameValues, true, true); } BeforeRender处理点击确认的信息如果不是UI插件,是webPart页面,那在AfterUIModelBinding中处理 public override void BeforeRender(IPart Part, EventArgs args) { base.BeforeRender(Part, args); // ReMakePland=true就表示用户点击了确认 if (bool.TryParse(Part.CurrentState["ReMakePland"]?.ToString(), out bool reMakePland) && reMakePland) { // 如果插件只有一个弹窗可以不判断TargetType,但是TargetType最后也要=null string targetType = Part.CurrentState["TargetType"]?.ToString(); switch (targetType) { case "操作1": // do操作1的方法 break; case "操作2": // do操作2的方法 break; default: break; } Part.CurrentState["ReMakePland"] = null; Part.CurrentState["TargetType"] = null; } }弹窗效果图示提示信息最好不超过4行
2025年06月06日
22 阅读
1 评论
0 点赞
2025-05-15
【055】UMTracer 效率分析
背景分析性能问题的难点无法直接在客户环境,获得量化的性能数据。本部可能无法重现问题。回传环境过程缓慢,由于客户的安全限制,甚至可能无法回传。受限于环境因素,客户回传的Portal可能仍然无法重现问题。 综上因素,导致性能问题的处理时间,大部分消耗在了问题重现及环境搭建上。因此U9 自己开发的一个效率分析工具,包含对代码执行方法、调用 堆 栈 及 SQL 的 抓 取 及 时 间 统 计 。 UMTracer的能力监听本地发出的Http请求,并可获取请求的如下信息:Http请求信息,包括耗时及请求上下行数据。监控方法的执行情况。监控SQL的执行情况。开发人员,可以调用UMTracer服务端接口,进行自己的代码监控。CodeProfiler.BeginExecute/EndExecuteSQLProfiler.BeginExecute/EndExecuteCode Profiler工具的特点是监控所有方法,分析时可以逐层展开确定最底层开销,UMTracer是更轻量级的核心方法调用监控,所以分析关注点也有所不同,建议关注:关注开销分布,Method/SQL的开销比例。对于SQL较高的案例,分析SQL执行时间及频度,并关注返回结果数。 对于Method较高的案例,关注调用逻辑合理性,以及重点方法的调用频度简单说,UMTracer集成了Fiddler,SqlProfiler和AQTime的核心功能。获取路径在 U9 及 U9CE 安 装 时 会 自 带 , 默 认 路 径 是 yonyou\U9CE\Portal\Tools\UMTracer New.zip。此工具直接在客户端使用,不必非要连接服务器。最新版本工具请前往U9Hub下载:https://u9hub.diwork.com/a/tools/down使用介绍配置及登录由于UMTracer 有过改版因此分为两种配置/登录方式老版本需要在工具-配置打开配置窗体进行配置,将 pt09 替换为服务器 IP,U9 代表的是版本,如果是 U9CE 那么要改为 U9C新版本需要输入 URL,然后通过用户账号进行登录。登录后可以在工具-重新登录启动及监听启动登录后再次点击启动控制台,其中开启详细跟踪是会抓取方法的调用堆栈,开启秒 表是控制台秒表启动,并不是勾选开启秒表才会记录时间。监听打开控制后会悬浮在最上层,此时需要打开 U9找到动作慢的界面,数据准 备不要一次执行太多,由于这个工具在收集四分钟时可能就解析不出来了。再有就 是使用这个工具由于在收集数据因此会导致当前操作慢一些,如客户说更慢了可以 向其说明。监测时先点击开始,等操作完成后点击结束,等待分析即可。)结果导出如要多次监测,那么需要先导出监测结果然后再将监测结果删除然后在工具-重新登录,然后再次启动控制台监测结果分析完成后会出现监测结果,选择耗时最长的查看性能分析,此时可以清楚的看到 SQL 的占比,如果 SQL 占比很高可以去查看是否可以优化 SQL,或添加索引。选中耗时的方法后下方会出现对应的方法调用过程,并且会出现每一步的耗时如图记录了多个插入后事件耗时,此时可以统计这个方法的总体耗时,通过统计可 以得到方法的总耗时,从而确认那个方法最耗时。从上到下查看相同的方法占时是否逐步增加,如果逐步增加那么需要查看方法每次 执行时执行的过程是否一致,如不一致那么要确认是否因为不一致的点导致的耗时 增加。如一致那么需要考虑是否可以减少方法的调用,如通过增加全局变量或线程 缓存。 查看耗时方法中那一步耗时需要再次展开,如图可以看到 Session.Commit 耗时, commit 要走 BE,调用过程为 OnSetDefaultValue-OnValidate-OnInserting/OnUpdating/ OnDeleting知道耗时方法可以通过查看附加信息来在哪里调用的,如图可以看出是 IssueDoc.UpdatePickIssueQtyWhenCreatDoc 方法中调用的 Commit。此时就需要查看 具体的代码查看是进行了什么处理,看是否可以进行优化,如单个提交的是否可以 改为一起提交,订单行上 OnInserted/OnUpdated/OnDeleted 单独提交的是否可以改 要一起讨论!在 SQL 视图中可以查看 SQL,通过对 SQL 排序可以找到耗时最大的 SQL,或找出执 行次数较多的 SQL,通过 SQL 可以找到对应的方法,找到对应的方法查看堆栈信息 然后查看具体代码调用是否可优化
2025年05月15日
7 阅读
0 评论
0 点赞
2025-05-09
【054】推式生单配置的目的单据部分实体无法选择
利用SQL新增推式生单配置的目的单据的实体记录U9C没有内置的话,Base_PushToDocTypeConfig表没有TargetEntity时,目的单据无法选择相对应的单据进行配置 比如想配置一个收货单转资产卡片的单据类型映射配置,但是无法选择资产卡片 在后台新增一条记录到Base_PushToDocTypeConfig的方式经测试有效,特此记录 declare @Application bigint -- 目的单据的所在应用ID declare @ID bigint=3009001001 -- 生单规则配置的ID declare @TargetEntity bigint -- 来源单据实体ID declare @SourceEntity bigint -- 目的单据实体ID declare @AttrExpression1 nvarchar(50) -- 属性表达式1 declare @AttrType1 nvarchar(50) -- 属性类型1 declare @UIParam1 nvarchar(50) -- UI参数1 declare @ParamName1 nvarchar(50) -- 参数名称1 declare @UserAttr1 nvarchar(50) -- 使用条件1 select @Application=ID from [Base_Application_Trl] where Name=N'固定资产' select @SourceEntity=A.[Local_ID] FROM UBF_MD_Class as A inner join [UBF_MD_Class_Trl] as A1 on (A1.SysMlFlag = 'zh-CN') and (A.[Local_ID] = A1.[Local_ID]) where A1.[DisplayName] = N'库存杂发单' select @TargetEntity=A.[Local_ID] FROM UBF_MD_Class as A inner join [UBF_MD_Class_Trl] as A1 on (A1.SysMlFlag = 'zh-CN') and (A.[Local_ID] = A1.[Local_ID]) where A1.[DisplayName] = N'资产卡片' -- 来源单据类型的一些绑定属性 select top 1 @AttrExpression1=AttrExpression1,@AttrType1=AttrType1,@UIParam1=UIParam1,@ParamName1=ParamName1,@UserAttr1=UserAttr1 from Base_PushToDocTypeConfig where SourceEntity=@SourceEntity and AttrExpression1='SrcDocType' and ParamName1='SrcDocType' delete Base_PushToDocTypeConfig where ID=@ID delete Base_PushToDocTypeConfig_Trl where ID=@ID -- UIParam1 来源单据类型的FormID -- TargetDocTypeReference 目的单据类型的FormID insert into Base_PushToDocTypeConfig(ID,CreatedOn,CreatedBy,SysVersion,Application,SourceEntity,TargetEntity,AttrExpression1,AttrType1,UIParam1,TargetDocTypeReference,ParamName1,UserAttr1) values(@ID,GETDATE(),'admin',0,@Application,@SourceEntity,@TargetEntity,@AttrExpression1,@AttrType1,@UIParam1,'354d46a6-cdcf-4624-864c-d5ff9a6a6830',@ParamName1,@UserAttr1) insert into Base_PushToDocTypeConfig_Trl(id,SysMLFlag,AttrName1) values(@ID,'zh-CN',N'来源单据类型')
2025年05月09日
5 阅读
1 评论
0 点赞
2025-05-08
【053】自定义值集与实体值集互换
值集设置好之后,如果有单据引用了就不允许修改了,测试后台进行修改可行,特此记录 以朗圣应收单头的私有段15发票别为例,一开始设置的ST014为自定义值集值旧的值集值新增一个要替换的新的值集(记住值集编码)例如这里我想改成实体值集,编码为ST019数据库执行以下语句n.Code要等于新的值集编码'ST019',old.Code就是要修改的值集编码'ST014' sql语句中的old.xxx=n.xxx左右两边保持一致,这里只是展示了实体值集可能需要用到的字段复制 如果需要复制别的字段值过来,在查询方案的栏目中找到对应字段,然后复制一个赋值的语句(包括前面的,号),把左右两边的字段名更改为你要复制值得字段名即可UPDATE old SET old.ValidateType=n.ValidateType ,old.ValueType=n.ValueType ,old.EntityType=n.EntityType ,old.IDAttribute=n.IDAttribute ,old.CodeAttribute=n.CodeAttribute ,old.NameAttribute=n.NameAttribute ,old.Condition=n.Condition ,old.ConditionDisplayName=n.ConditionDisplayName ,old.OQL=n.OQL ,old.SQL=n.SQL ,old.DependantAttribute=n.DependantAttribute ,old.IsDependant=n.IsDependant ,old.DependantValueSet=n.DependantValueSet ,old.DependantDefaultValue=n.DependantDefaultValue FROM Base_ValueSetDef AS old INNER JOIN Base_ValueSetDef AS n ON n.Code = 'ST019' -- 新的值集,覆盖完之后删除 WHERE old.Code = 'ST014'; -- 要覆盖的值集执行SQL后的ST014检查引用单据能正确选择与保存应收单可以正确弹出选择,并且保存成功删除临时新增的值集值集'ST019'仅仅是为了能够取值覆盖到'ST014',用完检查引用单据无操作异常即可删除
2025年05月08日
8 阅读
0 评论
0 点赞
2025-04-08
【052】查找DataAccess的DLL路径获取密码
查找DataAccess的DLL路径DnSpy直接附加Portal/bin、Portal/ApplicationServer/bin下面的UFSoft.UBF.Util.DataAccess.dll是不行的,调试不会进断点确定U9C应用程序池是否开启32位启用32位程序=False,文件夹名为C:\Windows\Microsoft.NET\Framework64 启用32位程序=True,文件夹名为C:\Windows\Microsoft.NET\Framework查看U9C应用程序池.NET Framework 版本C:\Windows\Microsoft.NET\Framework64\<版本号>\Temporary ASP.NET Files 如下图,版本号为:v4.0.30319,那缓存目录就是 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files进入IIS的u9c缓存目录进入C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\u9c查找UFSoft.UBF.Util.DataAccess.dll在u9c目录下查找UFSoft.UBF.Util.DataAccess.dll 找到后右键->打开文件所在的位置,可定位到dll的具体目录 DnSpy附加的时候,就是附加这个目录下的dll调试获取数据库连接串附加上面找到的UFSoft.UBF.Util.DataAccess.dll断点到DataAccessor.GetConn先找到方法DataAccessor.GetConn,设置断点启动调试附加到进程启动调试登录U9C系统,进入断点登录U9C系统,进入断点后使用F11进入DatabaseManager.GetCurrentConnection方法中 然后F10到下一步,此时conn已赋值展开底部conn,其中ConnectionString即为数据库连接串 可以看到我本地的数据库连接密码为:123456
2025年04月08日
26 阅读
0 评论
0 点赞
2025-04-08
【051】获取U9当前库所有枚举信息视图
获取U9当前库所有枚举信息视图视图View_MEIJU_List/****** Object: View [dbo].[View_MEIJU_List] Script Date: 2022/5/23 9:45:57 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE OR ALTER VIEW [dbo].[View_MEIJU_List] AS SELECT A.EValue AS value, A.Code AS B_DCode, A1.Name AS real_value, B.Code FROM dbo.UBF_Sys_ExtEnumValue AS A WITH (nolock) INNER JOIN dbo.UBF_Sys_ExtEnumType AS B WITH (nolock) ON A.ExtEnumType = B.ID LEFT OUTER JOIN dbo.UBF_Sys_ExtEnumValue_Trl AS A1 WITH (nolock) ON A1.SysMLFlag = 'zh-CN' AND A.ID = A1.ID GO IF NOT EXISTS (SELECT * FROM sys.fn_listextendedproperty(N'MS_DiagramPane1' , N'SCHEMA',N'dbo', N'VIEW',N'View_MEIJU_List', NULL,NULL)) EXEC sys.sp_addextendedproperty @name=N'MS_DiagramPane1', @value=N'[0E232FF0-B466-11cf-A24F-00AA00A3EFFF, 1.00] Begin DesignProperties = Begin PaneConfigurations = Begin PaneConfiguration = 0 NumPanes = 4 Configuration = "(H (1[40] 4[20] 2[20] 3) )" End Begin PaneConfiguration = 1 NumPanes = 3 Configuration = "(H (1 [50] 4 [25] 3))" End Begin PaneConfiguration = 2 NumPanes = 3 Configuration = "(H (1 [50] 2 [25] 3))" End Begin PaneConfiguration = 3 NumPanes = 3 Configuration = "(H (4 [30] 2 [40] 3))" End Begin PaneConfiguration = 4 NumPanes = 2 Configuration = "(H (1 [56] 3))" End Begin PaneConfiguration = 5 NumPanes = 2 Configuration = "(H (2 [66] 3))" End Begin PaneConfiguration = 6 NumPanes = 2 Configuration = "(H (4 [50] 3))" End Begin PaneConfiguration = 7 NumPanes = 1 Configuration = "(V (3))" End Begin PaneConfiguration = 8 NumPanes = 3 Configuration = "(H (1[56] 4[18] 2) )" End Begin PaneConfiguration = 9 NumPanes = 2 Configuration = "(H (1 [75] 4))" End Begin PaneConfiguration = 10 NumPanes = 2 Configuration = "(H (1[66] 2) )" End Begin PaneConfiguration = 11 NumPanes = 2 Configuration = "(H (4 [60] 2))" End Begin PaneConfiguration = 12 NumPanes = 1 Configuration = "(H (1) )" End Begin PaneConfiguration = 13 NumPanes = 1 Configuration = "(V (4))" End Begin PaneConfiguration = 14 NumPanes = 1 Configuration = "(V (2))" End ActivePaneConfig = 0 End Begin DiagramPane = Begin Origin = Top = 0 Left = 0 End Begin Tables = Begin Table = "A" Begin Extent = Top = 12 Left = 76 Bottom = 254 Right = 390 End DisplayFlags = 280 TopColumn = 0 End Begin Table = "B" Begin Extent = Top = 264 Left = 76 Bottom = 506 Right = 329 End DisplayFlags = 280 TopColumn = 0 End Begin Table = "A1" Begin Extent = Top = 516 Left = 76 Bottom = 725 Right = 312 End DisplayFlags = 280 TopColumn = 0 End End End Begin SQLPane = End Begin DataPane = Begin ParameterDefaults = "" End End Begin CriteriaPane = Begin ColumnWidths = 11 Column = 1440 Alias = 900 Table = 1170 Output = 720 Append = 1400 NewValue = 1170 SortType = 1350 SortOrder = 1410 GroupBy = 1350 Filter = 1350 Or = 1350 Or = 1350 Or = 1350 End End End ' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'VIEW',@level1name=N'View_MEIJU_List' ELSE BEGIN EXEC sys.sp_updateextendedproperty @name=N'MS_DiagramPane1', @value=N'[0E232FF0-B466-11cf-A24F-00AA00A3EFFF, 1.00] Begin DesignProperties = Begin PaneConfigurations = Begin PaneConfiguration = 0 NumPanes = 4 Configuration = "(H (1[40] 4[20] 2[20] 3) )" End Begin PaneConfiguration = 1 NumPanes = 3 Configuration = "(H (1 [50] 4 [25] 3))" End Begin PaneConfiguration = 2 NumPanes = 3 Configuration = "(H (1 [50] 2 [25] 3))" End Begin PaneConfiguration = 3 NumPanes = 3 Configuration = "(H (4 [30] 2 [40] 3))" End Begin PaneConfiguration = 4 NumPanes = 2 Configuration = "(H (1 [56] 3))" End Begin PaneConfiguration = 5 NumPanes = 2 Configuration = "(H (2 [66] 3))" End Begin PaneConfiguration = 6 NumPanes = 2 Configuration = "(H (4 [50] 3))" End Begin PaneConfiguration = 7 NumPanes = 1 Configuration = "(V (3))" End Begin PaneConfiguration = 8 NumPanes = 3 Configuration = "(H (1[56] 4[18] 2) )" End Begin PaneConfiguration = 9 NumPanes = 2 Configuration = "(H (1 [75] 4))" End Begin PaneConfiguration = 10 NumPanes = 2 Configuration = "(H (1[66] 2) )" End Begin PaneConfiguration = 11 NumPanes = 2 Configuration = "(H (4 [60] 2))" End Begin PaneConfiguration = 12 NumPanes = 1 Configuration = "(H (1) )" End Begin PaneConfiguration = 13 NumPanes = 1 Configuration = "(V (4))" End Begin PaneConfiguration = 14 NumPanes = 1 Configuration = "(V (2))" End ActivePaneConfig = 0 End Begin DiagramPane = Begin Origin = Top = 0 Left = 0 End Begin Tables = Begin Table = "A" Begin Extent = Top = 12 Left = 76 Bottom = 254 Right = 390 End DisplayFlags = 280 TopColumn = 0 End Begin Table = "B" Begin Extent = Top = 264 Left = 76 Bottom = 506 Right = 329 End DisplayFlags = 280 TopColumn = 0 End Begin Table = "A1" Begin Extent = Top = 516 Left = 76 Bottom = 725 Right = 312 End DisplayFlags = 280 TopColumn = 0 End End End Begin SQLPane = End Begin DataPane = Begin ParameterDefaults = "" End End Begin CriteriaPane = Begin ColumnWidths = 11 Column = 1440 Alias = 900 Table = 1170 Output = 720 Append = 1400 NewValue = 1170 SortType = 1350 SortOrder = 1410 GroupBy = 1350 Filter = 1350 Or = 1350 Or = 1350 Or = 1350 End End End ' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'VIEW',@level1name=N'View_MEIJU_List' END GO IF NOT EXISTS (SELECT * FROM sys.fn_listextendedproperty(N'MS_DiagramPaneCount' , N'SCHEMA',N'dbo', N'VIEW',N'View_MEIJU_List', NULL,NULL)) EXEC sys.sp_addextendedproperty @name=N'MS_DiagramPaneCount', @value=1 , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'VIEW',@level1name=N'View_MEIJU_List' ELSE BEGIN EXEC sys.sp_updateextendedproperty @name=N'MS_DiagramPaneCount', @value=1 , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'VIEW',@level1name=N'View_MEIJU_List' END GO
2025年04月08日
17 阅读
0 评论
0 点赞
2025-04-08
【050】客开补丁加补丁说明
客开补丁加补丁说明xml文件名称为 模块名 加上"补丁说明" 模块名有.的话,用.前面的,比如Cust.SH、Cust.SH.SJJ都用《Cust补丁说明.xml》 U96.0的xml文件名固定为《0补丁说明.xml》补丁文件目录示例补丁描述效果展示xml文件示例Cust补丁说明.xml 注意首行描述前有一个制表符(一下tab) Code只是一个对照的编码,一般是补丁号。相当于描述的标题<?xml version="1.0" encoding="utf-8"?> <module Code="补丁更新内容如下" Version="CE"> <Pack Code="补丁更新内容如下"> 1. U8导入U9数据补录辅助工具全补丁; 2. GSP资质管控功能; 3. 应收单折扣计算与发票折扣还原功能; </Pack> </module>U9获取xml前缀代码sender变量即为补丁名称 text2就是前缀,取值之后会拼接“补丁说明.xml”,再去补丁目录下匹配相同名称的xml文件 所以为什么U96.0固定是《0补丁说明.xml》,因为6.0补丁包的名字都是CD6.0.xxxxxx,截取之后text2就等于0为什么U9CE的补丁包,客开的名称带.只需要第一个点前的字符,因为U9C的补丁包名是CDCE.Cust.xxx.xxxxxx,截取之后那就是Cust
2025年04月08日
21 阅读
0 评论
0 点赞
1
2
...
6