Seiten

Herzlich willkommen im technischen Blog der MindBusiness GmbH
In diesem Blog veröffentlichen wir praxisnahes Know-how, neue Erkenntnisse und Erfahrungen zu Microsoft SharePoint- und Office-Themen direkt aus unserer Berater-, Trainer- und Entwickler-Praxis. Hier finden Sie interessante Lösungen und neue Ideen zu den verschiedensten Anforderungen und Problemen. Unseren News-Blog finden Sie unter newsblog.mindbusiness.de/newsblog. Wir wünschen Ihnen viel Spaß beim Lesen und Stöbern und freuen uns auf den Austausch mit Ihnen.

InfoPath: Webbasierte Formulare mit Programmierung (II)

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:

  1. Voraussetzungen
  2. Die Berechnung der Differenz (dieser Teil)
  3. Formular veröffentlichen
  4. 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.

image

Fügen Sie diese Felder in die Formularansicht ein, dazu noch eine Schaltfläche, die die Berechnung auslösen soll:

 image

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

1 Kommentar zu InfoPath: Webbasierte Formulare mit Programmierung (II)

  • AL

    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

Hinterlasse eine Antwort

 

 

 

Du kannst diese HTML-Tags benutzen

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">