Es folgt der zweite Teil unserer kleinen Serie zur Veröffentlichung von Formularen in den Forms Services, die Programmierung enthalten. Diesmal widmen wir uns einem kleinen Beispiel, wie mit den Visual Studio Tools für Anwendungen (VSTA) eine Datumsdifferenz ermittelt werden kann.
Hier unsere kleine Serie im Überblick:
- Voraussetzungen
- Die Berechnung der Differenz (dieser Teil)
- Formular veröffentlichen
- Formular den Anwendern zur Verfügung stellen
Erstellen des Beispielformulars
Erstellen Sie ein neues Formular legen zuerst die Programmiersprache auf Visual Basic fest. Öffnen Sie dazu Extras – Formularoptionen und dort die Kategorie Programmierung. Hier können Sie die Codesprache der Vorlage festlegen. Definieren Sie nun in der Datenquelle drei Felder:
- datum_von (Date)
- datum_bis (Date)
- differenz_tage (Integer)
Das Wurzelelement der Datenquelle wird in Datumsdifferenz umbenannt.
Fügen Sie diese Felder in die Formularansicht ein, dazu noch eine Schaltfläche, die die Berechnung auslösen soll:
Jetzt soll beim Anklicken der Schaltfläche Berechnen unser Programmcode ausgeführt werden, den wir im folgenden definieren werden. Doppelklicken Sie dazu auf die Schaltfläche und klicken im Dialog auf Formularcode bearbeiten. Jetzt wird die VSTA-Programmierumgebung geöffnet und automatisch einige Zeilen Standard-Programmcode erzeugt. Wir arbeiten innerhalb der Prozedur Public Sub CTRL4_5_Clicked (die ID der Schaltfläche kann abweichen).
Um mit Visual Basic (oder C#) Formulardaten auszulesen oder zu bearbeiten, verwenden wir den sog. XPathNavigator. In unserem Beispiel definieren wir für jedes der drei Felder einen eigenen Navigator. Beachten Sie, wir wir über einen XPath-Ausdruck direkt das jeweilige Feld "anzapfen".
Anschließend prüfen wir, ob die beiden Datumsfelder Werte enthalten (wenn nicht, macht eine Berechnung keinen Sinn).
Schließlich lesen wir die beiden Datumswerte aus und weisen sie (nach Konvertierung) zwei Date-Variablen zu.
Ziel ist, die Differenz dem dritten Feld zuzuweisen. Bei Zahlenfelder müssen wir vor der Wertezuweisung das Attribut "nil" entfernen.
Zuletzt ermitteln wir die Datumsdifferenz und weisen diese dem entsprechenden Knoten zu.
Das ganze im Quellcode:
Public Sub CTRL4_5_Clicked(ByVal sender As Object, ByVal e As ClickedEventArgs) Dim node_von As XPathNavigator = _ MainDataSource.CreateNavigator().SelectSingleNode("/my:Datumsdifferenz/my:datum_von", NamespaceManager) Dim node_bis As XPathNavigator = MainDataSource.CreateNavigator().SelectSingleNode("/my:Datumsdifferenz/my:datum_bis", NamespaceManager) Dim node_diff As XPathNavigator = MainDataSource.CreateNavigator().SelectSingleNode("/my:Datumsdifferenz/my:differenz_tage", NamespaceManager) If node_von.Value <> "" And node_bis.Value <> "" Then Try Dim d_von, d_bis As Date d_von = Convert.ToDateTime(node_von.Value) d_bis = Convert.ToDateTime(node_bis.Value) If node_diff.MoveToAttribute("nil", "http://www.w3.org/2001/XMLSchema-instance") Then node_diff.DeleteSelf() End If node_diff.SetValue(DateDiff(DateInterval.Day, d_von, d_bis)) Catch ex As Exception 'keine Aktion, Berechnung abbrechen End Try End If End Sub

Hallo,
erstmal vielen Dank für die tolle Anleitung. Damit habe ich überhaupt erst einen Einstieg in die Infopath-Programmierung finden können und es hat genau das Problem gelöst, das ich hatte, denn eine DateDiff-Funktion fehlt ja leider bei den Aktionen für Regeln in Infopath.
Allerdings würde ich gerne noch zwei Dinge ergänzen.
Falls mal wieder jemand ratlos, wie ich, vor der Debugger-Meldung sitzt, daß DateDiff und DateInterval nicht bekannt sind:
- ganz am Anfang des Codes “Imports Microsoft.VisualBasic” hinzufügen
Außerdem sollte man daran denken, daß wenn man die Anzahl der Tage inklusive des DatumVon-Tages haben möchte, der Differenzwert um 1 erhöht werden muß (habe ich leider erst später gemerkt ;-)
Viele Grüße
AL