我正在处理一个解决方案,其中有一个名为LogidNumber的列的列表。对于列表中的每个新条目,我想将LogidNumber递增一个。我可以使用SharePoint生成的ID,但是对于此解决方案,它需要独立。我正在考虑使用事件接收器,但是我遇到的问题是从上一个条目中获取价值。

我可以使用此示例之类的内容来访问列表项目,但是在此之后我不确定如何进行。

using (SPSite siteCol = new SPSite("http://server/sites/Contoso"))
{
    using (SPWeb web = siteCol.RootWeb)
    {
        SPList list = web.GetList("/sites/Contoso/Lists/Books");
        SPListItemCollection items = list.GetItems("Title", "LogIDNumber",);
    }
}

有没有办法抓住最后一个值?

有帮助吗?

解决方案

您可以使用CAML查询并在特定字段上排序,抓住最高值并添加一个。可能还应该有明显的检查。

查询可以是这样的:

"<OrderBy><FieldRef Name='ColumnName' Ascending='False' /></OrderBy><RowLimit>1</RowLimit>"

对于审查员,请参见:https://stackoverflow.com/questions/516073/max-query-using-caml

其他提示

我认为您的方法或执行CAML查询的想法不会起作用(至少...至少不一致),这主要是由于您无法本地管理并发。在单个WFE环境中处理它将很具有挑战性,但是如果您有多个WFE,那么您肯定会同时拥有多个事件接收器或查询执行的多个实例,返回相同的“最后ID”值,然后返回所有将其LogidNumber属性设置为同一+1值。

我想您可以使用一列(LogidNumber)创建一个ID列表,使其成为数字类型,并确保 执行唯一值=是. 。然后,您可以在事件接收器中将项目添加到该列表中,如果它窒息,那么您知道另一个EV实例首先到达那里,并且需要申请最后一个ID,直到插入ID列表中的插入不扼杀为止。如果不扼流圈,则您的EV实例拥有ID,并且可以安全地更新该列表项目的LogidNumber属性。

我能问一下什么要求导致您创建自己的自动电网列而不是使用ID?

我建议使用参考列表 /查找列。在您的ItemAdding事件中,打开一个名为DocID's的列表,该列表有2列,ListUrl和CurrentID。根据HE LIST URL获取正确的项目(当前列表URL == doc ID lib列表中的项目),获取CurrentID的值并将其递增。然后将新值用作您的新文档ID。

但是,有很多缺点,这与1件事有关:SharePoint不是“交易”。因此,如果任何2个用户同时执行此操作,则可能会发生相同的ID。为了解决这个问题,您也需要在HE DOC ID列表上使用ItemUpdating事件处理程序,请检查新值!=当前值(由不同的用户增量)。当然,这也不能保证成功...

SP2010中的另一个选项是DOC ID功能,它可以保证所有内容中的唯一ID,并允许通过搜索 /重定向URL轻松访问。

我假设您将需要某种算法来计算自定义ID,因此为什么不简单地创建自己的列,然后将项目的整数ID或GUID silutiD用作您的ID算法的“种子”,然后在该列中填充该列事件接收器?

您可以为此使用文档ID服务。这个唯一的ID(我相信)不是实时生成的,而是在TimerJob基础上产生的。它仅适用于从文档内容类型派生的内容类型。这本书无需编程;)

http://msdn.microsoft.com/en-us/library/ee559302.aspxhttp://blogs.technet.com/b/blairb/archive/2009/10/20/new-document-id-feature-in-sharepoint-2010.aspxhttp://www.sharepointanalysthq.com/2010/04/document-id-feature/

许可以下: CC-BY-SA归因
scroll top