二开案例.表单插件.单据获取种子值
【应用场景】
单据进行二开时,如果不走平台提供的Save接口保存单据数据,此时,需要用户自行维护单据的各数据表的主键值。
【注意】
此案例仅适用于单据,不适用于基础资料。
【案例演示】
采购订单,获取各种表格的种子值(最新的,可用的,主键值)。
【实现步骤】
<1>编写表单插件,代码如下。
using Kingdee.BOS.Core.DynamicForm.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.ServiceHelper; using Kingdee.BOS.Util; using System.ComponentModel; using System.Linq; using System.Text; namespace Jac.XkDemo.BOS.Business.PlugIn { /// <summary> /// 【表单插件】单据获取种子值 /// </summary> [Description("【表单插件】单据获取种子值"), HotUpdate] public class GetSeqValueFormPlugIn : AbstractDynamicFormPlugIn { public override void BarItemClick(BarItemClickEventArgs e) { base.BarItemClick(e); if (e.BarItemKey == "GetSeqValue") { // 获取表的种子值=获取表的自增Id=获取表的自增主键值,每获取一次,种子值就会加1,以确保主键值不会重复产生 // 种子值不是来自于当前数据表,而是来自于一个单独的种子表,一个数据表对应一个种子表,种子表名通常为数据表名的首字母t改为z,例如,数据表t_PUR_POOrder对应的种子表名为z_PUR_POOrder var log = new StringBuilder(); // 取单据头 var tableName = this.View.BusinessInfo.GetEntity("FBillHead").TableName; //var seqValue = new SequenceReader(this.Context).GetSequence(tableName, 1).FirstOrDefault();// 服务插件用这个方法 var seqValue = DBServiceHelper.GetSequenceInt32(this.Context, tableName, 1).FirstOrDefault(); // 表单插件用这个方法 log.Append(string.Format("表名:{0},种子值(内码):{1}", tableName, seqValue)); log.AppendLine(); // 取单据头多语言表 tableName = this.View.BusinessInfo.GetEntity("FBillHead").TableName; tableName = tableName + "_L"; seqValue = DBServiceHelper.GetSequenceInt32(this.Context, tableName, 1).FirstOrDefault(); log.Append(string.Format("表名:{0},种子值(内码):{1}", tableName, seqValue)); log.AppendLine(); // 取单据体 tableName = this.View.BusinessInfo.GetEntity("FPOOrderEntry").TableName; seqValue = DBServiceHelper.GetSequenceInt32(this.Context, tableName, 1).FirstOrDefault(); log.Append(string.Format("表名:{0},种子值(内码):{1}", tableName, seqValue)); log.AppendLine(); // 取子单据体 tableName = this.View.BusinessInfo.GetEntity("FEntryDeliveryPlan").TableName; seqValue = DBServiceHelper.GetSequenceInt32(this.Context, tableName, 1).FirstOrDefault(); log.Append(string.Format("表名:{0},种子值(内码):{1}", tableName, seqValue)); log.AppendLine(); this.Model.SetValue("F_Jac_Remarks", log.ToString()); } } } }
<2>拷贝插件组件到应用站点的WebSite\Bin目录下,重启IIS。
<3>BOSIDE扩展采购订单,新增字段,新增菜单,注册表单插件,保存元数据,开发完毕。
【功能验证】
<1>登录业务站点,打开采购订单新增界面,点击菜单【获取种子值】,即可获取多张数据表当前可用的主键值。
---------------------------------------------------------------------------------------------------------
【知识点】
<1>获取表的种子值=获取表的自增Id=获取表的自增主键值
<2>每成功访问一次GetSequence接口,种子值就会加1,以确保主键值不会重复产生,如果获取了种子值不用,那这个值就浪费了,种子值只会一直往前递增的。
<3>种子值不是来自于当前数据表,而是来自于一个单独的种子表,一个数据表对应一个种子表,种子表名通常为数据表名的首字母t改为z,例如,数据表t_PUR_POOrder对应的种子表名为z_PUR_POOrder。
<4>可通过执行以下脚本,观察数据表的种子表的当前种子值(只是看看,不会用掉)。
DBCC CHECKIDENT('z_PUR_POOrder', NORESEED)
<5>种子表的种子值有可能会在某些特殊场景下坏掉,其种子值会比数据表中的最大主键值小,此时继续使用,就可能会产生重复主键,此时,建议重置此种子表。可通过CHECKIDENT命名重置种子表的种子值。
例如:DBCC CHECKIDENT('z_PUR_POOrder', RESEED, 999999999)
具体操作方式可参考:【系统运维.数据库.修复种子表】https://vip.kingdee.com/article/116231986418582016
---------------------------------------------------------------------------------------------------------
【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696
二开案例.表单插件.单据获取种子值
本文2024-09-23 04:18:08发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-164428.html