我正在使用 SharePoint 列表作为记录工作中意外/事故的数据库。 每个事故都有一个编号。 由于有多人在使用这个列表,我非常希望"事件编号"列能自动填充下一个顺序号。 下面是目前的图片。在这种情况下,当用户选择"新项目"时,第一个字段应自动为"14-0002"; ![在此输入图片描述][1]
我希望当用户创建"新项目"时,第一个字段已经填入下一个#,如下图所示。 [在此输入图片描述][2]
这可能吗?我真的很感激在这件事上能得到的任何帮助。这是我们公司使用 SharePoint 2013 的一个巨大障碍。
您可以使用 SPUtility.js 库在 JavaScript 中实现这一功能
注:在本例中,我使用的是 SharePoint 2010,但其实是一样的 与 SP 2013 相同
作为示例,我创建了一个简单的列表'序号':
每个列表都有三个默认表单,用于添加、显示和编辑项目,我们将通过编辑这些表单来实现我们的目标。
![此处输入图片描述][2]
在开始修改之前,先下载 SPUtility.js 和 JQuery,然后将这两个文件上传到 SharePoint,例如共享文档库。
编辑 "默认新表单 "并添加内容编辑器 Web 部件
![在此输入图片描述][5]
编辑 Web 部件的 Html 内容并粘贴下面的代码:
<script src="/Shared%20Documents/jquery-1.10.2.min.js"></script>
<script src="/Shared%20Documents/sputility.min.js"></script>
<script>
// Get the current Site
var siteUrl = '/';
function retrieveListItems() {
var clientContext = new SP.ClientContext(siteUrl);
// Get the liste instance
var oList = clientContext.get_web().get_lists().getByTitle('sequential number');
var camlQuery = new SP.CamlQuery();
// Get only the last element
camlQuery.set_viewXml('<View><Query><OrderBy><FieldRef Name=\'ID\' Ascending=\'False\' /></OrderBy></Query><RowLimit>1</RowLimit></View>');
this.collListItem = oList.getItems(camlQuery);
clientContext.load(collListItem);
clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));
}
function onQuerySucceeded(sender, args) {
var listItemInfo = '';
var listItemEnumerator = collListItem.getEnumerator();
while (listItemEnumerator.moveNext()) {
var oListItem = listItemEnumerator.get_current();
var listItemInfovalue = oListItem.get_item('Occurrence_x0020__x0023_');
// Based in you request the id is : 14-00001
// Split the first
var res = listItemInfovalue.split("-");
console.log(res[1]);
// increment the index
var newId = parseInt(res[1])+1;
// create the new id
SPUtility.GetSPField('Occurrence #').SetValue(res[0] + '-' + pad(newId, 5) );
}
console.log(listItemInfo.toString());
}
function onQueryFailed(sender, args) {
alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}
// Create new id with fixed size :
// exp : 00001, 00001
// num : is the number
// size : is the number size
function pad(num, size) {
var s = num+"";
while (s.length < size) s = "0" + s;
return s;
}
$(document).ready(function(){
ExecuteOrDelayUntilScriptLoaded(retrieveListItems, "sp.js");
});
</script>
现在的结果是 :
[此处输入图片描述][6]
通常情况下,列表项 ID 编号可用于此目的。我不确定这在 2013 年有什么不同,但在 2010 年,你需要编辑用于向列表添加项目的表单,并添加一个从列表检索数据类型的数据连接,选择你的列表,然后选择 ID 字段。
然后创建一条使用 "Query for data" 操作查询数据的规则,并选择刚刚创建的数据查询,然后使用类似以下的方法设置出现次数的值:
concat("14-", max(ID))
这样,第一个文档就是 14-1 第十个文档就是 14-10 等等。
如果你想要前导零'(就像我们想要的那样),我发现最快的"解决方法"是制定 4 条规则,第一条检查 max(ID) 是否小于 10,并在连接语句中添加"000",然后下一条规则只在 max(ID) 小于 100 时运行,并在连接语句中添加"00",以此类推。确保规则上的 "don't run remaining rules if the condition is met" 复选框被勾选。也许有更好的方法,但我的黑客工作对我们有用。
请注意,如果列表为空,max(ID) 就没有值,第一次调用时会得到一个 NaN 值,但之后应该可以正常工作。
这个链接曾作为我使用的解决方案列在我的收藏夹中,但我的 IT 部门以其无穷的智慧决定 WordPress 现在是一个受限网站,所以我无法检查它:
http://claytoncobb.wordpress.com/2009/06/20/auto-generating-filenames-for-infopath-forms/
另一种常见的方法是创建一个名为"OccurrenceID"的独立列。然后让工作流程根据设置列表值来设置值。
创建一个名为"发生设置"的单独自定义列表,创建一个名为 "值 "的新列(设置为单行文本)。
创建一个项目(标题:NextOccurenceID,值:1)
在 "发生 "列表(而非 "设置 "列表)上创建一个Sharepoint列表工作流。 将 "发生ID "字段设置为 "NextOccurrenceID"。然后更新设置列表项,使其等于NextOccurrenceID + 1。 将其设置为仅在 "创建 "时触发。
这样,项目创建后,就会根据你的选择分配一个特定的标识符,并自动递增。 缺点是该值不会立即设置,根据工作流程设计,它会在创建项目后的某个时间点发生。
希望对你有所帮助。:)