Dienstag, 17. Januar 2012

SharePoint 2010 + InfoPath 2010 + Excel Services + REST API

Bei der Realisierung eines Urlaubsantragssystems auf Basis von SharePoint 2010 kann es mitunter zu einigen Problemen kommen.

Einige Fragen, die vor der Realisierung beantwortet werden müssen sind folgende:

     - Wo wird der Stand der Urlaubstage verwaltet
     - Wie wird die Berechnung der verbrauchten Urlaubstage durchgeführt
     - Wie sieht der Prozess für den Urlaubsantrag aus
     - Tragen die Mitarbeiter die genommenen Urlaubstage händisch ein, oder soll dies automatisch 
        berechnet werden ?

All diese Fragen führten dazu, dass für das Formulardesign InfoPath 2010 verwendet wurde, um eine schöne Oberfläche für das Urlaubsantrags-Formular zu bekommen.

Das Formular hatte einige Steuerelemente wie z.B. People picker, Textboxen und Datumsfelder für das Datum des 1. und des letzten Urlaubstages.

Und genau bei diesem Punkt fängt das Problem der Urlaubstagsberechnung an.
InfoPath kann zwar die Differenz von 2 Datumswerten berechnen, was allerdings fehlt ist die Berechnung unter Berücksichtigung der Wochenenden und Feiertage.

Hier kommen die Excel Services ins Spiel. Excel besitzt nämlich die Funktion NETWORKDAYS, die die Arbeitstage zwischen zwei Datumswerten berechnet.

Wie bekommt man nun die Datumswerte des InfoPath Formulars in den Excel Sheet, der dann dort die Berechnung der Arbeitstage ausführt und diese dann an das Formular retourniert ?

Die Antwort lautet REST API. Die REST API macht genau das möglich. Im weiteren Verlauf dieses Posts werde ich auf die Umsetzung dieser Funktionalität unter Zuhilfenahme der verschiedenen Technologien im Detail eingehen.

Also beginnen wir zunächst mit dem Excel Sheet.
Hierfür erstellen wir einen neuen Excel Sheet und verwenden die ersten 2 Zellen in der Spalte A für unsere Inputs.
Ich habe die Felder in diesem Fall "StartDate" und "EndDate" genannt.
In der 1. Zelle in Spalte B soll dann unser berechneter Wert stehen.
Dazu fügen wir die Formel "=NETWORKDAYS(StartDate; EndDate) in diese Spalte.
Ein Test zeigt, dass die Formel funktioniert:






Jetzt kann der Excel Sheet in eine SharePoint Library via "Save & Send" gepublished werden. Wichtig hierbei ist, dass die beiden Felder StartDate und EndDate bei den Parametern angehakt werden, um diese Felder über die REST url dann verfügbar machen zu können.


 


Ein wichtiger Faktor ist das Datumsformat. In meinem Fall war das Datumsformat English (UK).
Wichtig ist, dass dieses Format auf jeden Fall korrekt übergeben wird, sonst wird ein falscher Wert vom REST Service zurückgeliefert.

Um zu testen, ob REST funktioniert, wird dann folgende Url im Internet Explorer eingegeben:

http://<server>/<site>/_vti_bin/ExcelRest.aspx/<library>/<ExcelSheet>.xlsx/Model/Ranges('DateDiff')?Ranges('StartDate')=2012-01-13&Ranges('EndDate')=2012-01-17

DateDiff ist in unserem Fall die Zelle, die die Formel für die Berechnung enthält.
Haben wir alles richtig, gemacht, erscheint folgende Ausgabe im Internet Explorer:


 

Da das Format des Rückgabewertes zum jetzigen Zeitpunkt noch HTML ist und wir in InfoPath XML benötigen, fügen wir noch den Ausdruck $format=atom zu unserer Url hinzu, sodaß die Url dann folgendermaßen aussieht:

http://<server>/<site>/_vti_bin/ExcelRest.aspx/<library>/<ExcelSheet>.xlsx/Model/Ranges('DateDiff')?$format=atom&Ranges('StartDate')=2012-01-13&Ranges('EndDate')=2012-01-17

Da wie bereits erwähnt das Datumsformat sehr wichtig ist, stellen wir im InfoPath Formular gleich das richtige Datumsformat in dem Date Picker ein. Dies geschieht über die Properties des DatePickers und war in meinem Fall English (UK).


 


Nachdem das Design des InfoPath Formulars abgeschlossen ist, binden wir nun das REST Service in unser Formular mit ein.
Dazu fügen wir zuerst das REST Service als Datenquelle hinzu.













In das Url Feld fügen wir unsere Url von vorher (inklusive dem $format=atom Parameter) ein und bei "Automatic retreive" entfernen wir den Haken in der Checkbox.

Jetzt müssen die Datumswerte noch von den Feldwerten ersetzt werden.
Hierzu fügen wir für jedes Datumsfeld eine Regel hinzu.

Zunächst für das Startdatum:



 


Als Action ändern wir die REST Url:


Die Funktion substring-before(<feldname>, "T00:00:00") muss durchgeführt werden, da InfoPath diesen Zeitwert an den Datumswert anhängt und wir kein vernünftiges Ergebnis bekommen, wenn wir diesen Zeitstempel nicht entfernen.

Diese Rule wird auch für das EndDatum angelegt und die REST Url geändert:


 


Im nächsten Schritt wird für das EndDatum Feld noch eine Regel erstellt, die die neu erstellte REST Url an das REST Service sendet:


 


Als nächster Schritt wird das Ergebnis der Query - also die Anzahl der Urlaubstage - in einem Feld gespeichert:


Als Wert wird aus der Secondary Data Source das REST Service ausgewählt:


 


Damit ist die Funktionalität für die Berechnung der Urlaubstage implementiert.
Zusätzlich verwalte ich den aktuellen Urlaubsstand der Mitarbeiter noch in einer Liste und wenn der Urlaubsantrag approved wird, wird der Stand der Urlaubstage entsprechend korrigiert.

10 Kommentare:

  1. hallo,

    bei mir klappt es leider nicht- Excel schmeißt Fantasiewerte raus. Obwohl ich die Anleitung- nur mit deutschem Datumsfomat, genau befolgt habe.
    Was mir aufgefallen ist: In Excel heißen die Bereiche anderes (Enddate) als in der Abfrage in Infopath: CorrectEnd.
    Warum dieses

    Danke für Tipps
    Susanne

    AntwortenLöschen
  2. Hallo Susanne,

    Hast du die REST-Url für einen Test mit 2 Datumswerten in deutschem Format probiert ?
    Probiere einmal folgende Url im Browser:

    http:////_vti_bin/ExcelRest.aspx/
    /.xlsx/Model/Ranges('DateDiff')?Ranges('StartDate')=2012-01-13&Ranges('EndDate')=2012-01-17

    Dast Datumsformat musst du ans deutsche Datum anpassen. Ist das Datumsformat deiner Excel-Zellen auf Deutsch eingestellt ? Sonst hat Excel hier Probleme mit der Datumskonvertierung.

    Die Benamsung ist deshalb unterschiedlich, weil die Zellen im Excel Formular einen eigenen Namen bekommen und die im InfoPath Formular auch.

    lg,
    Chris

    AntwortenLöschen
  3. Hallo Chris,

    bei mir erscheint eine Fehlermeldung sobald ich den REST als Datenverbindung mit dem Link (incl. $format=atom?) Parameter einfügen möchte.
    Erst heißt es "konnte nicht geöffnet werden" dann drücke ich ok, und dann kommt "xyz-url....für diesen Befehl ist nicht genügend Speicher verfügbar"
    Woran kann das liegen?
    Wenn ich den Link ohne den zusätzlichen Parameter in den IE eingebe, wird der richtige wert ausgespuckt, allerdings nicht wenn ich den Parameter hinzufüge. Dann erscheint direkt "website nicht gefunden".

    Grüße
    Ben

    AntwortenLöschen
  4. Dieser Kommentar wurde vom Autor entfernt.

    AntwortenLöschen
    Antworten
    1. Dieser Kommentar wurde vom Autor entfernt.

      Löschen
    2. Hallo,

      Sorry, dass ich mich so spät melde, berufliche Gründe haben mich leider etwas aufgehalten.
      Bei der Query ist mir leider ein Typo unterlaufen, das ? gehört bei atom durch ein & ersetzt.

      lg,
      Chris

      Löschen
  5. Hallo,
    ich bin gerade dabei die Funktion dieser Urlaubsplanung zu testen. Leider berechnet InfoPath im Formuular leider die Tage nicht. An was kann das liegen?

    Die Rest-URL lauter wie folgt bei mir:
    verketten("http://srv-01/_vti_bin/ExcelRest.aspx/Urlaubsplanung/Formularbibliothek/Urlaubstageberechnung.xlsx/Model/Ranges('DateDiff')?&$format=atom&Ranges('StartDate')="; teilzeichenfolge-vor(Urlaubsbeginn; "T00:00:00"); "&Ranges('EndDate')="; teilzeichenfolge-vor(Urlaubsende; "T00:00:00"))verketten("http://vsrvecs:84/_vti_bin/ExcelRest.aspx/Urlaubsplanung/Formularbibliothek/Urlaubstageberechnung.xlsx/Model/Ranges('DateDiff')?&$format=atom&Ranges('Urlaubsbeginn')="; teilzeichenfolge-vor(Urlaubsbeginn; "T00:00:00"); "&Ranges('Urlaubsende')="; teilzeichenfolge-vor(Urlaubsende; "T00:00:00"))

    Urlaubsende und -beginn heissen die Felder in InfoPath.

    Würde mich über Hilfe freuen!

    Gruß

    AntwortenLöschen
    Antworten
    1. Hi,

      Sorry für die späte Antwort, du hast zwischen ('DateDiff')? und $format ein '&', das darf da an und für sich nicht stehen. Bitte entferne das '&' bitte mal, sollte dann eigentlich klappen.

      Lg,
      Chris

      Löschen
  6. Hallo,
    Funktioniert das auch mit den SharePoint Services oder nur mit SharePiont 2010?

    LG
    Axel

    AntwortenLöschen
  7. Hallo zusammen
    hat bis zu, veröffentliche des Formulars alles super geklappt.
    Bekomme aber jetzt nach dem Aufrufen des Formulars folgende Fehlermeldung :
    XML-Daten, die erforderlich sind, damit dieses Formular ordnungsgemäß funktioniert, wurde nicht gefunden. Weis jemand eine Lösung ?? Wenn ich das Excel Sheet hochlade bietet er mir folgende Optionen an : ODC Datei oder universal Data Connection-Datei , dort muss ich noch den Verbindungstypen auswählen XmlSubmit, XML-Query, WebService, SharePoint Libary SharePoint List

    AntwortenLöschen