K/3 Cloud保存单据时,是如何为表格产生主键的?

1. 说在前面的废话

经常看到有伙伴咨询,需要手工向K/3 Cloud的物理表格中插入数据,但不知道如何生成表格主键值。

或者自行获取表格当前最大主键值+1,作为新的主键值:
这样插入的数据本身不会出现问题,但是用户从K/3 Cloud中手工新增单据保存时,即会因为 主键重复 而保存失败。

被问的多了,感觉有必要开个专贴,再有新伙伴咨询时,即可奉上此贴。

2. K/3 Cloud是如何为表格产生流水号的?

K/3 Cloud 为每个物理表格( t_xxx ),都建立了一个索引辅助表( z_xxx ),内含一个自动增长的Id字段,以及一个无意义的整数字段Column1。

在向表格(t_xxx)插入数据之前,先向其索引辅助表(z_xxx),插入1行数据,利用自动增长的Id字段,产生一个流水号作为表格主键。
随后,会清空索引辅助表,保持空行。

普通的物理表格,其索引辅助表的命名规则,是把表格的前缀"t_",替换为"z_",如" t_Bas_Item "表的索引辅助表为" z_Bas_Item "。

如果表格的前缀不是"t_",则直接在表名前添加"z_"作为索引辅助表,如" JD_t_Cust_Entry100001 "的索引辅助表为" Z_JD_t_Cust_Entry100001 "

例外: 各种基础资料的主表(仅主表),采用同一个索引辅助表(z_bas_item),以便产生统一的流水号,如供应商、客户、员工,部门的主表,其内码是统一分配、互不重复的。


3. K/3 Cloud插件如何为表格产生流水号?

K/3 Cloud封装了一个服务 ( Kingdee.BOS.ServiceHelper.DBServiceHelper. GetSequenceInt64 ),产生表格的流水号。

插件直接调用此服务即可。

示例代码如下:

/// <summary>
/// 把图片数据,直接存入到数据库表格中
/// </summary>
private void SaveFileToDB()
{
    // 获取表格名称
    string tableName = this.View.BillBusinessInfo.Entrys[0].TableName;
    // 表格主键字段名
    string pkFieldName = this.View.BillBusinessInfo.GetForm().PkFieldName;
    // 图片字段名(Image类型)
    string imageFieldName = "F_JD_Picture";

    // SQL语句
    string sql = string.Format("INSERT INTO {0} ({1}, {2}, {3}) Values (@FID, @FBillNo, @Image)",
        tableName,
        pkFieldName,
        this.View.BillBusinessInfo.GetBillNoField().FieldName,
        imageFieldName);

    // 准备字段值:
    // 获取主键值
    var ids = Kingdee.BOS.ServiceHelper.DBServiceHelper.GetSequenceInt64(this.Context,
        tableName,
        1);

    // 图片内容
    Byte[] fileValue = this.ReadFile(this._fullFileName);

    // 准备SQL参数
    List<SqlParam> paramList = new List<SqlParam>();
    paramList.Add(new SqlParam("@FID", KDDbType.Int64, ids.ElementAt(0)));
    paramList.Add(new SqlParam("@FBillNo", KDDbType.String, "JD" + Convert.ToString(ids.ElementAt(0))));
    // 使用KDDbType.Binary类型可行,测试图片能够存入(测试图片2,280K)
    paramList.Add(new SqlParam("@Image", KDDbType.Binary,  fileValue));

    DBServiceHelper.Execute(this.Context, sql, paramList);
}

4. 存储过程中,如何为表格产生流水号?

我们不推荐使用存储过程插入表格数据,但必须时,请使用如下 示例代码 ,产生表格流水号:

declare @id int
insert into z_bas_item (column1) values (1)
select @id = id from z_bas_item
delete from z_bas_item
select @id


5. 与K/3 Wise的差异?

K/3 Wise有一个单独的物理表格(表名我不记得了),记录各个表的当前最大流水号,插入各种表格数据前,都要读取此表格的数据并更新。
并发业务量大时,会有性能瓶颈。
K/3 Cloud则是为各个表格单独建立索引辅助表,不易形成性能瓶颈。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值