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.




CAML bzw. SPQuery: Terminserie gegen Terminserien matchen ?

Geprüfte Antwort Dieser Beitrag hat 1 Antworten

Ohne Rang
508 Beiträge
Tom Scheuermann erstellt 14 März 2012 15:30
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi Community !

unter Verwendung von <DateRangesOverlap> kann ich in einer CAML Query EINEN Termin gegen alle Termine im Kalender matchen und so herausfinden, ob der neue Termin sich mit einem vorhanden überschneidet.

Code Snippet:

SPQuery query = new SPQuery();
string queryString = string.Empty;
queryString =
String.Format(
@"
<Where>
 <DateRangesOverlap>
  <FieldRef Name=""EventDate"" />
  <FieldRef Name=""EndDate"" />
  <FieldRef Name=""RecurrenceID"" />
  <Value Type=""DateTime"" IncludeTimeValue=""TRUE"">
   <Today />
  </Value>
 </DateRangesOverlap>
</Where>"
);
query.CalendarDate = DateTime.Parse(newEventDate);
query.ExpandRecurrence =
true;

newEventDate stellt dabei das Datum des neu eingetragenen Termins dar (beispielsweise).

Jetzt das Problem:

Wird im Kalender nicht ein neuer Termin sondern eine neue TerminSERIE eingetragen, müsste ich alle daraus resultierenden Termine gegen den Kalender matchen, um herauszufinden, ob es Überschneidungen gibt.

Natürlich sollte das ganze begrenzt werden - damit die Serie nicht in alle Ewigkeit (DateTime.MaxValue) läuft....

Hat jemand eine Idee, wie ich feststellen kann, ob eine NEU erstellte TerminSERIE mit bereits vorhandenen Terminen oder TerminSERIEN kollidiert ?

Alle Antworten

Ohne Rang
508 Beiträge
Tom Scheuermann Als Antwort am 19 März 2012 19:23
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Mein Dank an Andi Fandrich, der sich die Zeit genommen hat, das Problem mal kurz mit mir durchzusprechen.

Wenn es darum geht, eine Validierung für einen Kalender zu schreiben, sollte man das lieber bleiben lassen, weil:

1. Gruppenkalender
Der Gruppenkalender ist zwar ganz nett, aber das jedesmal wieder neu Resourcen in die Kalenderansicht geladen werden müssen, geht gar nicht ! Irgendwelche seltsamen JavaScripte kann ich Profi meinem Kunden leider nicht anbieten - wer weiss schon, wie lange die noch Funktionieren.
Ausserdem ist es nicht möglich, die Anzahl der auswählbaren Resourcen zu begrenzen.
Das Feature wirkt auf mich irgendwie "Halbfertig" !

2. ItemAdding EventReceiver für einen Kalender
Mit <DateRangesOverlap> kann ich zwar Terminserien für einen bestimmten Zeitraum extrahieren - aber erstens ist der Operator nicht ausreichend dokumentiert (gilt das nur für Serien oder für alle Termine) und zweitens scheint der noch ein wenig unzuverlässig zu funktionieren, wie einige Postings beschreiben.
Ausserdem bleibt dann das Problem, eine eben neue ersttellte Terminserie (die das ItemAdding ausgelöst hat) zu validieren. Aus dieser müssten zunächst alle möglichen Termine extrahiert werden um diese zu validieren. Kaum sinnvoll - und irgendwie technisch auch schlecht lösbar (das liegt nicht alleine an MS sondern am Faktor Zeit bzw. Unendlichkeit).

Denkbar wäre, den neuen Eintrag erst hinzuzufügen und dann über <DateRangesOverlap> eine Abfrage zu starten. Das geht aber leider nicht im ItemAdding sondern nur im ItemAdded (weil ich im ItemAdding keine Referenz auf das ListItem habe).

3. Benutzerdefinierte Liste
Am besten wäre, eine benutzerdefinierte Liste mit Kalenderansicht zu erstellen. Dort gibt es keine Terminserien und Überschneidungen könnten so mit einer CAML-Abfrage und einem SPQuery Objekt ermittelt werden. Das wird aber den Benutzern nicht gefallen, die den Komfort von Terminserien enbüssen.

4. Interessante Variante
Eine Idee bleibt noch unprobiert: Natürlich könnte man einen ItemAdded Eventhandler bauen. Dieser Validiert den neuen Eintrag und löscht ihn bei Überschneidungen. Der Ersteller würde dann per Mail benachrichtigt. Verkauft wird das ganze als "Reservierung mit Genehmigungsfunktion".

Fazit
In Bezug auf Kalenderabfragen bleiben viele Fragen offen ! Bevor ein geschätzter Kollege mal schnell ein Kalender-Feature anbietet, sollte er erst mal genau prüfen, auf was er sich da einlässt !

Schön ist zwar, das ich das jetzt alles weiss (nach 2 Tagen), aber unbefriedigend bleibt, das ich meinem Kunden keine Lösung anbieten kann !

P.S.:
Wer Lust hat, sich tief in das Thema zu vergraben kann sich mal dieses Projekt ansehen:
http://www.codeproject.com/Articles/30983/SharePoint-Reservations

Respekt vor dem Kollegen, der hat die Lösung fast geschafft - nur neue Terminserien kann er nicht richtig validieren.
Das Projekt ist noch für den MOSS 2007, aber die Lösung und der Weg bleibt eigentlich der gleiche.
Aber Achtung: Viel Zeit und Energie mitbringen !

Greets

Tom

ts (-at-) computer-kreativ.de

Microsoft Certified IT Professional: SharePoint 2010 Administration
Microsoft Certified Technoligie Specialist: SharePoint 2010 Configuring