MSDN Forum - SharePoint 自定义的自增长编号字段

Microsoft 365 同时被 2 个专栏收录
163 篇文章 2 订阅
3 篇文章 0 订阅

自定义的自增长编号字段是一个月经问题,不时地就会有朋友问出来,不管国内还是国外,从SharePoint问世开始就有了这样的需求,如何让列表项在新建时能够自动生成固定格式的编号,如工单号、物资编码号、员工编号等。

这其实是由业务决定的,很多组织的业务系统都是带有这种自动编号的,而原来的系统的数据一般是直接存储在数据库中,在采用SharePoint平台之后,数据将作为列表项保存在SharePoint列表中,间接地存储在数据库中。在这种情况下,数据的处理逻辑受到SharePoint列表的制约,因此无法像数据库系统中那种方式实现自定义的自增长编号字段。

本文将介绍在SharePoint中实现它的几种方式,具体采用哪种方式需要根据具体情况而定。Event Receiver的方式是场解决方案的内容,所以只能应用在Onpremise环境。

  • 通过计算列
  • 通过Microsoft Flow
  • 通过Rest API和JavaScript
  • 通过SharePoint Designer工作流
  • 通过SharePoint Event Receiver

为了后面方便演示,我们首先做一些准备工作。

  • 创建一个体现业务的列表StaffInfo用于表示员工信息。
  • 创建员工信息的基本字段,除了员工编号外,再创建几个如姓名、性别、电话等象征性字段。
  • 到列表设置的高级设置中启用内容类型,点击列表设置页面ContentType部分的Item类型,选中刚才创建的员工编号列,将字段设置为Hidden,这样它将不会出现在表单页面,如创建页、编辑页。
    列表视图页
    新建列表项页面

I. 通过计算列

这种方式是不需要编程和工作流的最便捷的实现方式,通过创建一个calculated字段作为员工编号即可。
添加一个数字类型名为IDForCal的字段,再向列表中添加一个名为EmployeeNumberCalculated的Calculated字段,然后在Formula的部分填写公式="EPN - "&IDForCal,效果如下。
在这里插入图片描述
这里我没有使用默认ID列的原因,是因为它在计算列的公式中不好用。是的,就是不好用,如果使用默认的ID列,计算列的值只会在更新计算列的设置时才会更新,我猜这是个bug。因此我们使用了另外一个字段用来指定员工的ID信息,进而拼接生成员工编号。

II. 通过Microsoft Flow

在之前介绍Graph的文章中有一篇我们介绍过Flow,传送门。使用Office 365的朋友推荐使用这种方式。在我看来,使用Flow要比使用SharePoint工作流舒服得多。如果你使用的是SharePoint Online,推荐使用Flow实现这个小逻辑。
进入到Flow主页选择创建,选automated flow,起一个名字,在触发器那里选择When an item is created,创建。
在这里插入图片描述
默认的触发器上面选择我们的网站和对应的列表。点击添加一个叫做Update item的Step,配置如下所示,效果就不演示了,so easy。
在这里插入图片描述

III. 通过Rest API和JavaScript

这种方式是使用JavaScript调用Rest API去在创建列表项的时候进行动态赋值,由于是作用在创建发生时,这种方式就不能在新建页面隐藏对应的字段了,否则我们无法通过前端代码找到它。
在列表视图页面点击new item链接进入新建页面。然后点击右上角的齿轮图标,选择Edit page进入页面编辑模式。点击Add a Web Part,选择Script Editor进行添加,然后向其中填写类似下面的代码(自己动手的时候将内容换成自己的):

<script src="https://jfoxdave.sharepoint.com/sites/nms/Shared%20Documents/jquery-3.4.1.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function() {
            $.ajax({
                url: "https://jfoxdave.sharepoint.com/sites/nms/_api/web/lists/getbytitle('StaffInfo')/items?$top=1&$orderby=ID desc",
                method: "GET",
                headers: { "Accept": "application/json; odata=verbose" },
                success: function (data) {
                    if (data.d.results.length > 0) {
                        $("[title='Title Required Field']").val('EPN - ' + (data.d.results[0].ID+1));
                    }
                },
                error: function (data) {
                    alert("Error: " + data);
                }
            });
        });
</script>

代码正常执行的话,会将内容自动填充到指定的字段中。

IV. 通过SharePoint Designer工作流

工作流也是一种比较传统的方式,基本上也是所见即所得的形式。使用工作流这种方式我们需要安装SharePoint Designer。

用SharePoint Designer打开网站,点击List Workflow的下拉箭头,选择StaffInfo列表。在弹出的创建工作流窗口中填写工作流的名称并点击OK按钮完成创建。
在这里插入图片描述
我们可以看到工作流的设计界面,由于我们要实现自动编号的功能,我们需要添加Set Field这个活动。点击Action的下拉箭头,选择List Actions分组中的Set Field in Current Item,按照下图所示进行设置。
在这里插入图片描述
然后向下一行将工作流设置为结束,最终如下图所示。
在这里插入图片描述
保存工作流,然后点击左侧的Workflows菜单,找到刚才创建的工作流,点击进入工作流设置界面。在这里将工作流设置为在列表项被创建时自动启动,最后并发布工作流,all done。

V. 通过SharePoint Event Receiver

比较老的东西就不多说了,具体代码如下:

public override void ItemAdded(SPItemEventProperties properties)
        {
            SPWeb web = properties.OpenWeb();
            bool allowUpdates = web.AllowUnsafeUpdates;
            this.EventFiringEnabled = false;
 
            try
            {
                web.AllowUnsafeUpdates = true;
                SPList list = web.Lists[properties.ListId];
                var LastItemID = 0;
                var query = new SPQuery
                                   {
                                       Query ="<OrderBy><FieldRef Name='ID' Ascending='False' /></OrderBy><RowLimit>1</RowLimit>",
                                       Folder = list.RootFolder
                                   };
                SPListItemCollection items = list.GetItems(query);
                if (items.Count > 0)
                {
                    LastItemID = int.Parse(items[0]["ID"].ToString());
                }
                var currItem = properties.ListItem;
                currItem["EmployeeNumber"] ="EPN - " + LastItemID + 1;
                currItem.SystemUpdate(false);
            }
            catch (Exception ex)
            {
                Trace.WriteLine(ex.Message);
            }
            finally
            {
                this.EventFiringEnabled = true;
                web.AllowUnsafeUpdates = allowUpdates;
                web.Dispose();
            }
        }

以上就是实现自动编号逻辑的几种方式,特此做个总结,希望能帮助到碰到这种月经问题的朋友。

  • 1
    点赞
  • 0
    评论
  • 2
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:猿与汪的秘密 设计师:我叫白小胖 返回首页

打赏作者

Justin-Liu

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值