SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




SPList Items selectiv per ForEach löschen?!

Unbeantwortet Dieser Beitrag hat 5 Antworten

Ohne Rang
46 Beiträge
Markus Doll erstellt 12 Mai 2011 17:39
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo zusammen,

habe eine Liste in der sich seit Anfang des Jahres ca. 550 Einträge angesammelt haben.

Hierbei gehts um ToDo, die von verschiedenen Personen abgeschlossen und dann auf den Status "Done" gesetzt werden.

Ich möchte gerne nun regelmäßig alle Einträge dieser Liste löschen, deren "Startdatum" weiter als 2 Monate in der Vergangenheit liegt.

Die Einträge identifiziere ich mittels CAML Query und möchte sie nun löschen.

Ich habe schon gelesen, das sich die entsprechende Liste wohl nicht per Foreach durchlaufen lässt, weil es dann entsprechende Fehlermeldungen gibt, das sich die Collection in der Zwischenzeit geändert hat o.ä.

Soweit bin ich jedoch noch nicht.

Wenn ich mit CAML Query Builder entsprechendes Query zusammenklicke und ausführe, habe ich genau die Treffer, die ich haben. Füge ich den Query String so wie er ist, in den Code ein (" gegen ' getauscht), wird die komplette Liste zurück geliefert als würde der Querystring ignoriert werden. Lasse ich <QUERY> und </QUERY> im String weg, so wie bei meinen bisherigen Queries, wird kein einziger Treffer zurück geliefert...!

Jemand ne Idee, was falsch sein könnte?

Der Querystring sieht so aus:

<Query><Where><Lt><FieldRef Name="Startdate" /><Value Type="DateTime">[Today-2Month(s)]</Value></Lt></Where></Query>

Der Code im VS (ohne <Query></Query>), der nichts zurück liefert so:

SPQuery oCheckOutdatedItemsQuery = new SPQuery();

oCheckOutdatedItemsQuery.Query = "<Where><Lt><FieldRef Name='Startdate' /><Value Type='DateTime'>[Today-2Month(s)]</Value></Lt></Where>";

SPListItemCollection oCheckOutdatedItemCol = workflowProperties.Web.Lists["Starters @ SKP"].GetItems(oCheckOutdatedItemsQuery);

Gruß,

Markus

Alle Antworten

Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 12 Mai 2011 20:27
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi,

ich bin mir nicht sicher ob [Today] in einer CAML direkt im Code funktioniert. Ich würde das Datum eventuell mal als string bauen und in die Query einbinden.

Die <Query> Nodes solltest du weglassen im Code.

Ausserdem würde ich überlegen für diese Aufgabe einen Timer Job zu schreiben und kein Workflow. Ist denke ich besser geeignet für solche wiederkehrenden Aufgaben.

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de

Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 12 Mai 2011 20:29
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hier ist noch ein Beispiel für CAMLs auf DateTimes:
http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/fed59f8e-72e2-46e2-9329-460fd65d7536/

 

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de

Ohne Rang
46 Beiträge
Markus Doll Als Antwort am 12 Mai 2011 21:10
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi Christian,

danke für Deine Antworten.

[quote user="C.Kaiser"]Ich würde das Datum eventuell mal als string bauen[/quote]

Das hatte ich mir als B-Lösung überlegt, weil ich das eigentlich ziemlich nervig finde. Die Frage, die ich darüber hinaus habe ist, wie der String aussehen muss, damit er in dem Query auch als gültig einen Match liefert?! So, das Format im Sharepoint, oder muss ich da ein anderes Format wählen?!

Die Seite, die Du in Deinem 2. Post verlinkt hattest, habe ich auch schon gefunden gehabt und auch schon mit der SPUtility Geschichte experimentiert, jedoch ohne großen Erfolg, was aber im Nachhinein betrachtet daran lag, das ich - ich weiß,man soll's auch nicht - anstatt den FeldGuids, die Feldnamen im Query - wo dann das SPUtility-Konstrukt nicht lief - verwendet hatte und die Fehlermeldung, die auf einen falschen Feldnamen zurückzuführen war, fehlinterpretiert und auf SPUtility zurück geführt hatte.

Ich werde mich morgen nochmal mit der Thematik beschäftigen...habe gestern und heute doch schon beträchtliche Fortschritte erzielt und mittlerweile ist auch das, was ich mal von C# konnte, wieder da...was die Sache einfacher macht :-).

Beste Grüße,

Markus

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 13 Mai 2011 08:25
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Beim Zusammenbauen der Query muß man extrem aufpassen. Ein kleiner Fehler und man bekommt eine meist irreführende Fehlermeldung oder einfach kein Ergebnis.

In der Query funktioniert auf jeden Fall <Today/>. Wenn man ein bestimmtes Datum angeben möchte, muß es im UTC-Format sein. Mehr Infos:
http://blogs.evocom.de/af/archive/2010/12/03/caml-anfragen-in-sharepoint.aspx

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
46 Beiträge
Markus Doll Als Antwort am 13 Mai 2011 11:37
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Mahlzeit,

so, ich habe jetzt alles so, wie ich es mir vorgestellt habe, vielen Dank für Eure Hilfe.

Ich bin nun wieder um einiges schlauer und habe etwas mehr Verständnis des ganzen Systems.

Das löschen der veralteten Items habe ich über den Workflow laufen, der immer ausgeführt wird, wenn ein Item geändert wird...die Timergeschichte werde ich mir aber in einem anderen Zusammenhang anschauen.

Wünsche Euch ein schönes Wochenende.

Danke & Gruß,

Markus