Frage

Ich arbeite an einer Lösung, in der ich eine Liste mit einer Spalte mit dem Namen LogidNumber habe. Für jeden neuen Eintrag in der Liste möchte ich die Logidnumber um eins erhöhen. Ich könnte die von SharePoint generierte ID verwenden, aber für diese Lösung muss sie unabhängig sein. Ich habe darüber nachgedacht, einen Ereignisempfänger zu verwenden, aber das Problem, mit dem ich Probleme habe, besteht darin, den Wert aus dem vorherigen Eintrag zu erhalten.

Ich kann so etwas wie dieses Beispiel verwenden, um Zugriff auf die Listenelemente zu erhalten, aber ich bin mir nicht sicher, wie ich danach fortfahren soll.

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",);
    }
}

Gibt es eine Möglichkeit, den letzten Wert zu holen?

War es hilfreich?

Lösung

Sie können eine CAML -Abfrage verwenden und nach dem jeweiligen Feld sortieren, den höchsten Wert erfassen und einen hinzufügen. Sollte wahrscheinlich auch eine eindeutige Überprüfung haben.

Die Abfrage kann so etwas sein:

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

Für eine Prüfung siehe hier:https://stackoverflow.com/questions/516073/max-query-using-caml

Andere Tipps

Ich glaube nicht, dass Ihr Ansatz oder die Idee, eine CAML -Abfrage auszuführen, funktionieren würde (... zumindest nicht konsequent), vor allem aufgrund Ihrer Unfähigkeit, die Parallelität nativ zu bewältigen. Es wäre schwierig genug, es in einer einzelnen WFE -Umgebung zu behandeln. Wenn Sie jedoch mehrere WFEs haben, hätten Sie mit Sicherheit mehrere Instanzen eines Ereignisempfängers oder einer Abfrage, die gleichzeitig ausgeführt werden, um den gleichen "letzten ID" -Wert und dann alle zurückzugeben und dann alle Setzen Sie ihre LogidNumber -Eigenschaft auf denselben letzten+1 -Wert.

Ich nehme an, Sie können eine ID -Liste mit einer Spalte erstellen (LogidNumber), machen Sie sie zu einem Nummerntyp und stellen Sie sicher Eindeutige Werte durchsetzen = Ja. Sie können dann in Ihrem Ereignisempfänger ein Element zu dieser Liste hinzufügen. Wenn es erstickt, wissen Sie, dass eine andere EV -Instanz zuerst dort angekommen ist und Sie die letzte ID anfordern müssen, bis der Einfügen in die ID -Liste nicht erstickt. Wenn es nicht erstickt, besitzt Ihre EV -Instanz die ID und kann die LogidNumber -Eigenschaft für dieses Listenelement sicher aktualisieren.

Kann ich fragen, welche Anforderungen (en) Sie dazu veranlassen, Ihre eigene Auto-ICRement-Spalte im Vergleich zur Verwendung von ID zu erstellen?

Ich schlage vor, eine Referenzliste / Lookup -Spalte zu verwenden. Öffnen Sie in Ihrem Elementadding -Ereignis eine Liste namens Docids, die 2 Spalten enthält, Listurl und CurrentID. Holen Sie sich das richtige Element basierend auf der List -URL (aktuelle Listen -URL == Element in DOC ID LIBs Listurl), erhalten Sie den Wert der aktuellen ID und erhöhen Sie es. Verwenden Sie dann den neuen Wert als Ihre neue DOC -ID.

Es gibt jedoch viele Nachteile, die alle mit 1 zu tun haben: SharePoint ist nicht "transaktional". Wenn also 2 Benutzer diese Aktion gleichzeitig ausführen, kann es passieren, dass beide dieselbe ID erhalten. Um dies zu erstellen, benötigen Sie auch einen Ereignishandler von ItemUpdating in der ID -ID -Liste, um zu überprüfen, ob der neue Wert! = Aktueller Wert (Inkrement durch verschiedene Benutzer). Dies ist natürlich auch keine Garantie für Erfolg ...

Eine weitere Option in SP2010 ist die DOC -ID -Funktion, die eindeutige IDs über alle Inhalte garantiert und einen einfachen Zugriff über Such- / Umleitungs -URL ermöglicht.

Ich gehe davon aus, dass Sie eine Art Algorithmus benötigen, um Ihre benutzerdefinierte ID zu berechnen. Warum also einfach Ihre eigene Spalte erstellen und dann entweder die Ganzzahl -ID des Elements oder die GUID eindeutig als "Saat" für Ihren ID -Algorithmus verwenden und diese Spalte in der Spalte in der Spalte bevölkern Ereignisempfänger?

Sie können den Dokument -ID -Dienst für diesen verwenden. Diese eindeutige ID ist (glaube ich) nicht Echtzeit, sondern auf einer Timerjob -Basis. Und es funktioniert nur für Inhaltstypen, die aus einem Dokumentinhaltstyp abgeleitet werden. Für diesen Fall keine Programmierung erforderlich;)

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.sharepointanalyshq.com/2010/04/document-id-feature/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit sharepoint.stackexchange
scroll top