二开案例.表单插件.单据获取种子值

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

二开案例.表单插件.单据获取种子值

【应用场景】

单据进行二开时,如果不走平台提供的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

二开案例.表单插件.单据获取种子值

【应用场景】单据进行二开时,如果不走平台提供的Save接口保存单据数据,此时,需要用户自行维护单据的各数据表的主键值。【注意】此案例仅...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息