首页
喃喃低语
Search
1
【038】U9私有扩展字段枚举的多语言表的SQL更新
100 阅读
2
平台领域应用合集 - U9HUB
91 阅读
3
【061】U9系统报表输出
81 阅读
4
【062】为指定用户和报表批量设置默认的查询方案
73 阅读
5
【023】新增客开参数设置
70 阅读
用友U9
登录
Search
竹秋廿九
累计撰写
71
篇文章
累计收到
1
条评论
首页
栏目
用友U9
页面
喃喃低语
搜索到
71
篇与
用友U9
的结果
2025-08-15
【060】客开UI插件示例(转)
原文地址:客开UI插件案例客开UI插件注意事项开发UI插件时确保不要开启热插件,即..\Portal\bin\environment.xml中属性uipluging必须设置为false(设置为true页面开发的dll拷贝不需要重启IIS)如何客开UI插件:PluginTool工具做UI插件时很多页面找不到webpart,特别是弹窗找不到webpart,做插件最后的方式是用如下方法做插件,不用这个工具,因为这个工具能做的东西非常有限先找webpart:先打开U9要做UI插件的页面,找到页面的uri或者formid,如下图所示:可以从如下界面找到URI(单点登录是也要获取这个URI)如果是弹窗页面,需要找FormID,如下图:找到URI或者FormID后,就可以在classview(数据字典)中找到webpart,如下图:写配置文件UI插件的.config配置文件必须以WebPartExtend_命名(建议从如下解决方案中用解决方案中的那个配置文件),节点一般是: extendedPartAssemblyName="UFIDA.U9.Cust.U9Demo.PlugUI.dll" />其中parentPartFullName是上一步我们找出的webpart,名字必须要完全对,extendedPartFullName是自己VS客开的这个类库的命名空间+自己的这个类名,如图:extendedPartAssemblyName为自己VS客开的这个解决方案的程序集名称,如图:参考客开解决方案(建议用这个解决方案改类库的程序集名称、命名空间、配置文件,改成自己项目的,建议改成UFIDA.U9.Cust.项目简称.模块简称PlugIn:链接:https://pan.baidu.com/s/1IpRiHFTlHPePJAQ9rNl7aQ?pwd=1234提取码:1234一、按钮操作1、业务场景(增加按钮)UI插件开发最常用的场景之一,对标准产品页面需要增加按钮来实现不同业务需要,先对U9标准页面增加按钮的三种方法分别举例说明(UI插件增加的按钮无法设置权限:一般情况下可以变通方案处理,处理思路:参数设置里面加个参数,录入用户编码或者角色编码(逗号隔开),代码里面取这个值判断UI插件增加的按钮可用或不可用)案例1:Toolbar上增加按钮(页面最顶层区域)// (1)、实例化按钮 IUFButton btnPRToPM = new UFWebButtonAdapter(); //(2)、加入功能栏Card中 IUFToolbar toolbar = (IUFToolDescFlexFieldbar)part.GetUFControlByName(part.TopLevelContainer, "Toolbar1");//可以使用F12在页面上找,一般情况下名字就叫Toolbar1 if (toolbar != null) { string guid = "047FC9F5-46C0-449A-83C2-2822BCF24012";// 在数据库生成下GUID,或者修改下这里的值。SELECT NEWID() btnPRToPM = UIControlBuilder.BuilderToolbarButton(toolbar, "True", "btnPRToPM", "True", "True", 70, 28, "7", "", true, false,guid, guid, guid); UIControlBuilder.SetButtonAccessKey(btnPRToPM); btnPRToPM.Text = "拉单销售订单"; btnPRToPM.ID = "btnPRToPM"; btnPRToPM.AutoPostBack = true; btnPRToPM.UIModel = part.Model.ElementID; ((UFWebToolbarAdapter)toolbar).Items.Add(btnPRToPM as System.Web.UI.WebControls.WebControl); btnPRToPM.Click += new EventHandler(btnPRToPM_Click);//自己的点击事件 } 案例2:页面最下方按钮区域增加按钮(页面最底层区域) IUFCard card = (IUFCard)part.GetUFControlByName(part.TopLevelContainer, "Card0");//一般情况下名称为Card0,具体请使用F12查看 IUFButton btnPRToPM2 = new UFWebButtonAdapter(); btnPRToPM2.Text = "拉单销售订单"; btnPRToPM2.ID = "btnPRToPM2"; btnPRToPM2.AutoPostBack = true; card.Controls.Add(btnPRToPM2); btnPRToPM2.Click += new EventHandler(BtnPRToPM2_Click); CommonFunction.Layout(card, btnPRToPM2, 16, 0); //一般为从左往右按钮个数乘以2 CommonFunction类代码如下:public class CommonFunction { public static void Layout(IContainer container, IUFControl ctrl, uint x, uint y) { Layout(container, ctrl, x, y, 1, 1, Unit.Pixel(0), Unit.Pixel(0), true); } public static void Layout(IContainer container, IUFControl ctrl, uint x, uint y, int width, int height) { Layout(container, ctrl, x, y, 1, 1, Unit.Pixel(width), Unit.Pixel(height), false); } public static void Layout(IContainer container, IUFControl ctrl, uint x, uint y, int xspan, int yspan,Unit width, Unit height, bool isAutoSize) { IGridLayout gl = container.Layout as IGridLayout; if (gl == null) return; GridLayoutInfo glInfo = new GridLayoutInfo((uint)x, (uint)y, (uint)xspan, (uint)yspan, width, height); glInfo.AutoSize = isAutoSize; gl.Controls.Add((Control)ctrl, glInfo); } public static IUFControl FindControl(IPart part, string parentControl, string control) { IUFCard card = (IUFCard)part.GetUFControlByName(part.TopLevelContainer, parentControl); if (card == null) return null; foreach (IUFControl ctrl in card.Controls) { if (ctrl.ID.Equals(control, StringComparison.OrdinalIgnoreCase)) { return ctrl; } } return null; } }案例3:页面最下方下拉按钮中增加按钮IUFMenu btnPRToPM1 = new UFWebMenuAdapter(); btnPRToPM1.Text = "拉单销售订单"; btnPRToPM1.ID = "BtnQurySaleOrder2"; btnPRToPM1.AutoPostBack = true; IUFDropDownButton menuButtion = (IUFDropDownButton)CommonFunction.FindControl(part, "Card0", "DDBtnOperation");//Card0为操作按钮区域名称,可在浏览器开发工具或F12看到,DDBtnOperation为下拉按钮的名称,使用F12一样可以看到 if (menuButtion != null) { //btnPRToPM1.ItemClick += BtnPRToPM1_ItemClick;//注意这里注册的是//ItemClick事件 menuButtion.MenuItems.Add(btnPRToPM1); }2、业务场景:点击页面上按钮后写判断逻辑点击按钮后执行产品按钮事件前和执行产品按钮事件后都可以做插件,可分别使用BeforeEventProcess和AfterEventProcess事件,可重写这两个事件。业务场景:用户点击提交后弹窗给用户提示是否提交或取消。方案:U9内部没有方法可实现弹窗点击确定后执行一个操作,点击取消后执行另一个操作,需要UBF开发一个自定义视图页面做弹窗(两个按钮,一个字段作为提示即可),以下是代码示例public override void BeforeEventProcess(UFSoft.UBF.UI.IView.IPart Part, string eventName, object sender, EventArgs args, out bool executeDefault) { UFSoft.UBF.UI.WebControlAdapter.UFWebButton4ToolbarAdapter webButton = sender as UFSoft.UBF.UI.WebControlAdapter.UFWebButton4ToolbarAdapter; //按钮不同区域这个类型可能不一样,调试状态下可以看出sender参数的对象类型 //审核按钮 if (webButton != null && (webButton.Action == "SubmitClick" || webButton.Action == "AppvoveClick")) { if ("需要弹窗") { part.ShowAtlasModalDialog(btnPRToPM2, "e37cea28-9138-43a4-bbe7-e747977e3db5", "已转成功请购单", "992", "504", "", null, true, false, false); //btnPRToPM2按钮是自己增加的自定义按钮,用于回调(弹窗关闭后执行的代码实现) //BtnCreatPR1为自定义按钮,默认隐藏,弹窗回调使用 //弹窗后需要将指令(点击了确定还是取消)写入到part.CurrentState["XXX"]中 executeDefault = false; //这里不执行审核后事件动作了 return; } } base.BeforeEventProcess(Part, eventName, sender, args, out executeDefault); } void BtnPRToPM2_Click(object sender, EventArgs e) { this.part.Model.ClearErrorMessage(); if ("点击了确定继续执行") //part.CurrentState["XXX"]中获取标识 _part.BtnApprove_Click(sender, e); else return; } private UFIDA.U9.SCM.SM.SOUIModel.StandardSOMainUIFormWebPart part; IUFDataGrid DataGrid4; IUFButton btnPRToPM2; public override void AfterInit(UFSoft.UBF.UI.IView.IPart Part, EventArgs args) { //首先调用原来的事件 base.AfterInit(Part, args); part = Part as UFIDA.U9.SCM.SM.SOUIModel.StandardSOMainUIFormWebPart; if (part == null) return; DataGrid4 = (IUFDataGrid)part.GetUFControlByName(part.TopLevelContainer, "DataGrid4"); //2.Card里面增加按钮 //设置按钮在容器中的位置 #region 2.Card里面增加按钮 IUFCard card = (IUFCard)part.GetUFControlByName(part.TopLevelContainer, "Card0"); btnPRToPM2 = new UFWebButtonAdapter(); btnPRToPM2.Text = "拉单销售订单"; btnPRToPM2.ID = "BtnQurySaleOrder1"; btnPRToPM2.AutoPostBack = true; card.Controls.Add(btnPRToPM2); btnPRToPM2.Click += new EventHandler(BtnPRToPM2_Click); CommonFunction.Layout(card, btnPRToPM2, 16, 0); //一般为从左往右按钮个数乘以2 #endregion }业务场景:标准查询列表客开如何干预查询结果 public override void BeforeDataBinding(IPart Part, out bool executeDefault) { base.BeforeDataBinding(Part, out executeDefault); if (_strongPart == null || this._strongPart.Model.PlanOrder == null) return; _strongPart.Model.PlanOrder.CurrentFilter.OPath += " and DocNo >='051025070200613'"; _strongPart.Action.NavigateAction.Refresh(null, true); }二、界面行数据(DataGridView)操作针对行的数据操作,经常有业务场景,需要根据行的数量、单价计算金额等其他复杂的计算,这种情况无论插件还是单据都需要借助Callback或PostBack进行计算。Callback和Postback的区别:Callback:页面赋值后只局部刷新,页面只刷新需要修改的值,修改的值实时反映到页面控件上,不联动修改其他字段,不引起其他任何字段的联动。PostBack:页面赋值后页面全局刷新,需要进行数据收集和绑定才会反映到控件上,会引起其他控件的联动。两种方式都可以实现页面简单计算、对行字段赋值。如果需要对字段联动或者新增行之类的操作比较多的字段可以选用PostBack实现。(具体可在实际使用过程中视情况来定,两种方法切换也较为方便)具体案例类型有:数量、单价计算金额等类似;DataGridView可注册事件: 可从..\Portal\js\DataGrid.js文件中查询到 DataGridEvent.OnRowClick = "OnRowClick"; DataGridEvent. " "OnSortData"; DataGridEvent. " DataGridEvent. "OnBeforeOpenDialog"; DataGridEvent.OnAfterOpenDialog = "OnAfterOpenDialog"; DataGridEvent.OnBeforeCustomerPostBack = "OnBeforeCustomerPostBack"; DataGridEvent.OnAfterRowAdded = "OnAfterRowAdded"; DataGridEvent.OnCellDataChanged = "OnCellDataChanged"; DataGridEvent.OnCellDataValueChanged = "OnCellDataValueChanged"; DataGridEvent.OnBeforeRowAdd = "OnBeforeRowAdd"; DataGridEvent. " "OnControlValueChange"; DataGridEvent.OnCustomFilter = "OnCustomFilter"; //响应过滤菜单事件. DataGridEvent. " "CustomerPostBack"; //服务器端自定义事件 DataGridEvent.OnBatchModify = "OnBatchModify"; //批量修改事件//region 自定义用户事件 function DataGridEvent() { } DataGridEvent.OnBodyRowSelectedChange = "OnBodyRowSelectedChange"; DataGridEvent.OnBodyRowSelectedValueChange = "OnBodyRowSelectedValueChange"; DataGridEvent.OnBodyRowSelected = "OnBodyRowSelected";DataGrid行checkbox的触发事件 DataGridEvent.OnBeforeRowInsert = "OnBeforeRowInsert"; DataGridEvent.OnBeforeRowDelete = "OnBeforeRowDelete"; DataGridEvent.OnAfterRowInserted = "OnAfterRowInserted"; DataGridEvent.OnAfterRowDeleted = "OnAfterRowDeleted"; DataGridEvent.OnCellFocusEnter = "OnCellFocusEnter"; DataGridEvent.OnCellFocusOut = "OnCellFocusOut"; DataGridEvent.OnBeforeCellFocusEnter = "OnBeforeCellFocusEnter"; //行 copy 功能 DataGridEvent.OnAfterRowCopyed = "OnAfterRowCopyed"; DataGridEvent.OnBeforeRowCopy = "OnBeforeRowCopy"; DataGridEvent.OnRowCopy = "OnRowCopy"; DataGridEvent.OnGridHeadClick = "OnGridHeadClick"; DataGridEvent.OnCellClick = "OnCellClick"; DataGridEvent.OnCellDBClick = "OnCellDbClick"; DataGridEvent.OnRowChanged = "OnRowChanged";获取行DatagridView控件//DataGrid4为页面DataGridView控件名称,可使用F12找到DataGridView控件名称。 IUFDataGrid dataGrid = (IUFDataGrid)part.GetUFControlByName(part.TopLevelContainer, "DataGrid4");业务场景:单元格数量改变callback使用callback举例,开发人员可使用postback实现一次。所有callback实现的多种场景案例大部分代码都类似。如果是插件的开发,需要先获取到行DataGridView控件,插件里面把下方的this改成插件的part即可public void AfterCreateChildControls() //插件注册到AfterInit() { //注册callback事件,调BP获取料品单价 RegisterGridCellDataChangedCallBack(); } #region 回调注册\处理专区 /// <summary> /// 注册表格单元格内容改变的回调事件 /// </summary> private void RegisterGridCellDataChangedCallBack() { AssociationControl gridCellDataChangedASC = new AssociationControl(); //基本固定代码 gridCellDataChangedASC.SourceServerControl = this.DataGrid8; gridCellDataChangedASC.SourceControl.EventName = "OnCellDataChanged"; //注册行的单元格改变事件 //CallBack处理方案 ((IUFClientAssoGrid)gridCellDataChangedASC.SourceControl).FireEventCols.Add("Item"); //触发源,Item为触发控件名称 ClientCallBackFrm gridCellDataChangedCBF = new ClientCallBackFrm(); gridCellDataChangedCBF.ParameterControls.Add(this.DataGrid8); gridCellDataChangedCBF.DoCustomerAction += new ClientCallBackFrm.ActionCustomer(gridCellDataChangedCBF_DoCustomerActionOfSubvillage); gridCellDataChangedCBF.Add(gridCellDataChangedASC); this.Controls.Add(gridCellDataChangedCBF); } /// <summary> /// 表格的CallBack处理方式 /// </summary> /// <param name="args"></param> /// <returns></returns> private object gridCellDataChangedCBF_DoCustomerActionOfSubvillage(CustomerActionEventArgs args) { UFWebClientGridAdapter grid = new UFWebClientGridAdapter(this.DataGrid8); //行的DataGrid控件 //取表格数据(当前行) ArrayList list = (ArrayList)args.ArgsHash[UFWebClientGridAdapter.ALL_GRIDDATA_SelectedRows]; //基本固定代码 int curIndex = int.Parse(list[0].ToString()); Hashtable table = (Hashtable)((ArrayList)args.ArgsHash[this.DataGrid8.ClientID])[curIndex]; long ItemID = long.Parse(table["Item"].ToString()); //获取触发源字段值 if (ItemID > 0) { // .......(略)写自己的业务逻辑 //单价 grid.CellValue.Add(new object[] { curIndex, "UnitPrice", new string[] { "XXX", "YYY", "ZZZ" } }); //UnitPrice为要更新的字段名称,如果要更新多个字段值,需要些多个Add。后面三个参数,如果为参照的话分别对应ID,Code,Name args.ArgsResult.Add(grid.ClientInstanceWithValue); // ..........(略) } return args; } #endregion 业务场景:行数值计算postbackprivate void Register_DataGrid_Qty_PoskBack() { AssociationControl assocControl = new AssociationControl(); assocControl.SourceServerControl = this.DataGrid0; assocControl.SourceControl.EventName = "OnCellDataValueChanged"; //注册单元格改变事件 ((IUFClientAssoGrid)assocControl.SourceControl).FireEventCols.Add("ApsQty"); //触发列 CodeBlock cb = new CodeBlock(); UFWebClientGridAdapter gridAdapter = new UFWebClientGridAdapter(this.DataGrid0); gridAdapter.IsPostBack = true; gridAdapter.PostBackTag = "OnCellDataValueChanged"; //同上 cb.TargetControls.addControl(gridAdapter); assocControl.addBlock(cb); UFGrid itemGrid = this.DataGrid0 as UFGrid; itemGrid.GridCustomerPostBackEvent += new GridCustomerPostBackDelegate(_Qty_GridCustomerPostBackEvent); } void _Qty_GridCustomerPostBackEvent(object sender, GridCustomerPostBackEventArgs e) { if (e.SrcColumnName != "ApsQty") //触发源字段=ApsQty时才执行下面的逻辑 return; string oldProductCode = this.Model.PlanOrderAPS.FocusedRecord.ProductionLine_Code; if (oldProductCode == "") return; this.OnDataCollect(this); this.IsDataBinding = true; //当前事件执行后会进行数据绑定 this.IsConsuming = false; this.DataGrid0.CollectData(); this.DataGrid0.BindData(); PlanOrderAPSRecord record = this.Model.PlanOrderAPS.FocusedRecord; record.XXX = YYY; //赋值 }业务场景:选择数据新增行(多选实现)postback选择料品后,可以根据料品信息新增单据行,并带出其他信息public void AfterCreateChildControls() { //注册callback事件,调BP获取料品单价 RegisterGridCellDataChangedPostBack(); } /// <summary> /// 注册表格单元格内容改变的回调事件 /// </summary> private void RegisterGridCellDataChangedPostBack() { AssociationControl assocControl = new AssociationControl(); assocControl.SourceServerControl = this.DataGrid5; assocControl.SourceControl.EventName = "OnCellDataValueChanged"; ((IUFClientAssoGrid)assocControl.SourceControl).FireEventCols.Add("Gift"); CodeBlock cb = new CodeBlock(); UFWebClientGridAdapter gridAdapter = new UFWebClientGridAdapter(this.DataGrid5); gridAdapter.IsPostBack = true; gridAdapter.PostBackTag = "OnCellDataValueChanged"; cb.TargetControls.addControl(gridAdapter); assocControl.addBlock(cb); UFGrid itemGrid = this.DataGrid5 as UFGrid; itemGrid.GridCustomerPostBackEvent += new GridCustomerPostBackDelegate(GridCell_GridCustomerPostBackEvent); } private void GridCell_GridCustomerPostBackEvent(object sender, GridCustomerPostBackEventArgs e) { if (e.PostBackTag == "OnCellDataValueChanged") { DataTable dt = this.CurrentState["CustItem_Table"] as DataTable; if (dt == null) { this.DataGrid5.CollectData(); this.DataGrid5.BindData(); return; } CurrentState.Remove("CustItem_Table"); //校验DT是否为空 if (dt.Rows.Count < 1) { this.DataGrid5.CollectData(); this.DataGrid5.BindData(); return; } //获取最后的行号 int rowNo = 10; int recordsCount = this.Model.GiftShip_GiftShipLine.RecordCount; if (recordsCount != 0) { rowNo = Convert.ToInt32(this.Model.GiftShip_GiftShipLine.Records[recordsCount - 1]["RowNO"]); } //若只返回一条,做数据收集即可 if (dt.Rows.Count == 1) { DataGrid5.CollectData(); DataGrid5.BindData(); } //循环传回来的表体,//当多选参照界面点击确定返回时,Model默认添加了第一条记录,故不做处理 for (int i = 1; i < dt.Rows.Count; i++) { GiftShip_GiftShipLineRecord rd = this.Model.GiftShip_GiftShipLine.AddNewUIRecord(); rd.Gift = !string.IsNullOrEmpty(Convert.ToString(dt.Rows[i]["ItemID"])) ? long.Parse(Convert.ToString(dt.Rows[i]["ItemID"])) : 0; rd.Gift_Code = Convert.ToString(dt.Rows[i]["ItemCode"]); rd.Gift_Name = Convert.ToString(dt.Rows[i]["ItemName"]); //..........(略) } this.DataCollect(); this.DataBind(); // rd.SetParentRecord(this.Model.GiftShip.FocusedRecord); // Note: 'rd' is out of scope here. DataGrid5.CollectData(); DataGrid5.BindData(); } } //弹窗页面点击确定后执行如下方法将选择的数据放到table缓存到session里面: private void ReturnSelectedValue() { DataTable dt = new DataTable(); dt.Columns.Add("ID", typeof(long)); dt.Columns.Add("Code", typeof(string)); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("PurchaseUOM_ID", typeof(long)); dt.Columns.Add("PurchaseUOM_Code", typeof(string)); dt.Columns.Add("PurchaseUOM_Name", typeof(string)); foreach (IUIRecord _frd in this.Model.cRef.SelectRecords) { DataRow dr = dt.NewRow(); dr["ID"] = _frd["ID"]; dr["Code"] = _frd["Code"]; dr["Name"] = _frd["Name"]; dr["PurchaseUOM_ID"] = _frd["PurchaseUOM_ID"]; dr["PurchaseUOM_Code"] = _frd["PurchaseUOM_Code"]; dr["PurchaseUOM_Name"] = _frd["PurchaseUOM_Name"]; dt.Rows.Add(dr); } this.CurrentState["CustItem_Table"] = dt; }业务场景:行参照根据其他字段过滤private void GridFilterCallBackEvents() { IUFDataGrid uFControlByName = this.DataGrid5; AssociationControl control = new AssociationControl(); control.SourceServerControl = uFControlByName; control.SourceControl.EventName = "OnBeforeCellFocusEnter"; ((UFWebClientGridAdapter)control.SourceControl).FireEventCols.Add("CurrentBin"); ClientCallBackFrm child = new ClientCallBackFrm(); child.DoCustomerAction += assoCGrid_DoBeforePackAction; child.ParameterControls.Add(uFControlByName); child.Add(control); this.Controls.Add(child); } private object assoCGrid_DoBeforePackAction(CustomerActionEventArgs args) { string str2 = string.Empty; IUFDataGrid uFControlByName = this.DataGrid5; int num = Convert.ToInt32(args.ArgsHash[UFWebClientGridAdapter.FocusRow]); if (num >= 0) { ArrayList list = (ArrayList)args.ArgsHash[uFControlByName.ClientID]; Hashtable hashtable = (Hashtable)list[num]; if (args.ArgsHash["ALL_GRIDDATA_FocusColumnName"].ToString() == "CurrentBin") { UFWebClientGridAdapter adapter; try { if (hashtable["CurrentWH"] != null && hashtable["CurrentWH"].ToString() != "" && hashtable["CurrentWH"].ToString() != "-1") { str2 = " Warehouse =" + hashtable["CurrentWH"].ToString() + ""; adapter = new UFWebClientGridAdapter(uFControlByName); adapter.ResetColumnEditorAttribute("CurrentBin", UFWebClientRefControlAdapter.Attributes_AddParam, new string[] { "UBF_CustomFilter", str2 }); args.ArgsResult.Add(adapter.ClientInstanceWithRefAddParam); return args; } } catch (Exception) { adapter = new UFWebClientGridAdapter(uFControlByName); adapter.ResetColumnEditorAttribute("CurrentBin", UFWebClientRefControlAdapter.Attributes_AddParam, new string[] { "UBF_CustomFilter", "ID=-1" }); args.ArgsResult.Add(adapter.ClientInstanceWithRefAddParam); return args; } } } return args; } 根据行上某个字段判断,让另外一个显示不同的参照参照的案例是材料出库行“来源单据类型和”来源单据“列。 事件注册在AfterCreateChildControls,插件注册在AfterInit中,示例如下: 核心思路就是,UBF的Model中要增加多个自定义字段,绑定不同的实体; 在UBF UIForm中绑定好各自的参照,隐藏掉;代码里面把显示的列参照根据条件替换成隐藏列的参照private void CallBack_SrcDoc() { AssociationControl assoCGrid = new AssociationControl(); assoCGrid.SourceServerControl = this.DataGrid8; assoCGrid.SourceControl.EventName = "OnBeforeCellFocusEnter"; ((IUFClientAssoGrid)assoCGrid.SourceControl).FireEventCols.Add("SourceDocNo"); UFWebClientGridAdapter grid = new UFWebClientGridAdapter(this.DataGrid8); CodeBlock codeBlock = new CodeBlock(); string sourceDocType = grid.getSelectedValueText("SourceDocType"); string expression = string.Empty; expression += "if( "; expression += new UFWebClientGridAdapter(this.DataGrid8).getSelectedValuePK("SourceDocType"); expression += " =='1')"; codeBlock.Condition = expression; grid.SwitchColumnControl("IssueApplyDocLine4SrcDoc", "SourceDocNo"); //IssueApplyDocLine4SrcDoc为申请单的参照控件 codeBlock.TargetControls.addControl(grid); assoCGrid.addBlock(codeBlock); codeBlock = new CodeBlock(); expression = " else if( "; expression += new UFWebClientGridAdapter(this.DataGrid8).getSelectedValuePK("SourceDocType"); expression += " =='-1')"; codeBlock.Condition = expression; UFWebClientGridAdapter grid2 = new UFWebClientGridAdapter(this.DataGrid8); grid2.SwitchColumnControl("SourceDocNo", "SourceDocNo"); //SourceDocNo为备料参照控件 codeBlock.TargetControls.addControl(grid2); assoCGrid.addBlock(codeBlock); codeBlock = new CodeBlock(); expression = " else if( "; expression += new UFWebClientGridAdapter(this.DataGrid8).getSelectedValuePK("SourceDocType"); expression += " =='2')"; codeBlock.Condition = expression; UFWebClientGridAdapter grid3 = new UFWebClientGridAdapter(this.DataGrid8); grid3.SwitchColumnControl("IssueApplyDocLineSum4SrcDoc", "SourceDocNo"); //IssueApplyDocLineSum4SrcDoc为领料申请汇总参照控件 codeBlock.TargetControls.addControl(grid3); assoCGrid.addBlock(codeBlock); codeBlock = new CodeBlock(); expression = " else if( ("; expression += new UFWebClientGridAdapter(this.DataGrid8).getSelectedValuePK("SourceDocType"); expression += " =='0') && ("; expression += new UFWebClientGridAdapter(this.DataGrid8).getSelectedValuePK("BizType"); //expression += " =='47')"; expression += " !='52')"; expression += ")"; codeBlock.Condition = expression; UFWebClientGridAdapter grid4 = new UFWebClientGridAdapter(this.DataGrid8); grid4.SwitchColumnControl("MOPick4SrcDoc", "SourceDocNo"); codeBlock.TargetControls.addControl(grid4); assoCGrid.addBlock(codeBlock); codeBlock = new CodeBlock(); expression = " else if( ("; expression += new UFWebClientGridAdapter(this.DataGrid8).getSelectedValuePK("SourceDocType"); expression += " =='0') && ("; expression += new UFWebClientGridAdapter(this.DataGrid8).getSelectedValuePK("BizType"); expression += " =='52')"; expression += ")"; codeBlock.Condition = expression; UFWebClientGridAdapter grid5 = new UFWebClientGridAdapter(this.DataGrid8); grid5.SwitchColumnControl("PLSPick4SrcDoc", "SourceDocNo"); codeBlock.TargetControls.addControl(grid5); assoCGrid.addBlock(codeBlock); } 业务场景:表头字段更新其他字段的值private void CallBack_UomTab_ProductQtyby() { AssociationControl assoC_ProductQty = new AssociationControl(); // 生产数量 assoC_ProductQty.SourceServerControl = this.ProductQty196; assoC_ProductQty.SourceControl.EventName = "OnValueChanged"; ClientCallBackFrm cF = new ClientCallBackFrm(); cF.ParameterControls.Add(this.ProductQty196); //看自己需要可以注册多个控件 // cF.ParameterControls.Add(this.ProductQty1); // cF.ParameterControls.Add(this.PUToPBURate166); /// cF.ParameterControls.Add(this.PBUToSBURate91); cF.DoCustomerAction += new ClientCallBackFrm.ActionCustomer(onUOMTabProductQtyCallBackAction); cF.Add(assoC_ProductQty); } object onUOMTabProductQtyCallBackAction(CustomerActionEventArgs args) { // 生产数量 decimal ProductQty = args.ArgsHash[this.ProductQty196.ClientID].ToString().Equals("") ? 1 : decimal.Parse(args.ArgsHash[this.ProductQty196.ClientID].ToString()); // Assuming ProductQtyByProductUOM is defined elsewhere in your code. // decimal ProductQtyByProductUOM = ...; args.ArgsResult.Add(new UFWebClientNumberAdapter(this.ProductQty1).ClientInstance + ".set_Value('" + ProductQty.ToString() + "')"); return args; }
2025年08月15日
37 阅读
0 评论
0 点赞
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日
25 阅读
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日
41 阅读
0 评论
0 点赞
2025-06-17
【057】实体扩展字段设置只读
有时候扩展了一些私有段需要存储一些计算的值,或者生单的来源单信息,原则上是不允许用户修改只能查看 但是在个性化模板上只能选择扩展到什么地方,没有设置只读的选项 可以在界面权限的动作权限进行限制界面权限设置效果图示
2025年06月17日
50 阅读
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日
62 阅读
0 评论
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日
52 阅读
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日
44 阅读
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日
36 阅读
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日
61 阅读
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日
70 阅读
0 评论
0 点赞
1
2
3
...
8