Marek Czarzbon

  • Schulung Basic und Advanced Nintex Workflows

    Mittlerweile arbeiten wir als Firma seit mehr als einem Jahr mit Nintex Workflow 2007 und der Workflow Foundation. In den Projekten haben wir für uns viele Lessons Learned mit Nintex Workflow definiert.

    Wir wurden von unsern Kunden nach einer Schulung in diesem Bereich gefragt. Das haben wir sehr gerne aufgegriffen und mittlerweile eine erfolgreiche Reihe an Schulungen durchgeführt.

    Durch die Schulungen sind auch sehr interessante Ideen für die Weiterentwicklung von Nintex Workflow entstanden. Diese habe ich auch an Nintex weitergegeben. Wir diskutieren noch mit den Australiern, wie die Vorschläge in die Release-Planung einfließen können.

    Basierend auf unserer praktischen Erfahrung haben wir zwei Trainings entwickelt:

    Basic Nintex Workflow 2007 Seminar (2 Tage)

    Ziel des Seminars ist die Einführung in die Konzepte und die praktische Umsetzung von Human-Centric Workflows auf der SharePoint 2007 Plattform (MOSS und WSS) auf Basis von Nintex Workflow 2007.

    Teilnehmerkreis:
    SharePoint Endanwender; Grundkenntnisse werden vorausgesetzt.

    Seminarinhalt:

    • Grundlagen Windows Workflow Foundation
    • Grundlagen Nintex Workflow 2007
    • Hello World mit Nintex
    • Positionierung SharePoint Designer, Visual Studio
    • Workfl ow-Verwaltung, Status, Ausgaben
    • Bedingungen
    Workflow Data, Liste Item Data, Konstanten
    • Timer Jobs
    • Action Set, Template, Snippet
    • Freigabe, Request Data
    • Delegation und Eskalation, Reminder, Report Webparts
    • Hands On: Travel Management
    • State Machine
    • Travel Management mit State Machine
    • InfoPath 2003, 2007 und Nintex
    • Nintex Aktion Items
    • Workflow Design Pattern

    Advanced Nintex Workfl ow 2007 Seminar (1Tag)

    Ziel des Seminars ist der Aufbau von Expertenwissen im Bereich Entwicklung und Administration von
    Nintex Workflow. Besonders stark wird auf das Thema Performance und Govermance von Workflow eingegangen.

    Teilnehmerkreis:

    Sie arbeiten bereits mit Nintex Workflow 2007 oder Sie haben die Basic Schulung absolviert.
    Zusätzlich benötigen Sie einen technischen Background oder Affinität zum Thema.

    Grundlagen MS Workflow Foundation
    • Persistenz, Timer
    • Performance
    • Überwachung der Workfl ow-Aufgaben
    • Administration Nintex, NWAdmin
    • Delegation und Eskalation
    • Nutzung Nintex-Webservices
    • Design Patterns
    • Advanced Action Item
    • WebService, Query List, Collection, RegExp
    • Look behind:
    Nintex Workflow in Visual Studio
    • Logging, Debuging
    • Optional (nach Wunsch der Teilnehmer):
    Action Item Entwicklung

    Die neuen Termine stehen ebenfalls fest:

    Basic Nintex Workflow 2007 Seminar (2 Tage)

    Nürnberg/München: 20.-21.04.2009 (Standort abhängig von den Teilnehmern)
    Düsseldorf: 28.-29.04.2009
    Hamburg: 06.-07.05.2009

    Advanced Nintex Workflow 2007 Seminar (1Tag)

    Nürnberg/München: 22.04.2009 (Standort abhängig von den Teilnehmern)
    Düsseldorf: 30.04.2009
    Hamburg: 08.05.2009

    Unterlagen als PDF und Preise:

    basic-nintex-workflows-2007

    advanced-nintex-workflows-2007

  • Trim, SubString etc.: reguläre Ausdrücke für Zeichenoperationen nutzen

    Vor kurzem hatte ich ein Problem bei einem Nintex Workflow. Es ging darum, einen Text aus einer Variable von Leerzeichen vor dem Text und danach zu befreien (TRIM).
    Dafür ist der „Build dynamic string“ nicht gedacht. Hier können Texte dynamisch aus Variablen und/oder statischen Texten zusammengesetzt werden.
    Was nun?
    Hier kann natürlich die Aktivität „Regular Expression“ helfen. Die Lösung ich recht einfach, wenn man sich bereits mit regulären Ausdrücken auskennt.
    ^(?:\s*)([\W\w]*)(?:\b\s*$)
    Für das Bauen von regulären Ausdrücken verwende ich sehr gerne das Tool RegExBuddy. Das Tool erzeugt auch automatisch eine Erklärung für den Ausdruck (siehe unten [1]).

    Was uns jetzt interessiert, ist die erste s.g. Backreference (Durch (?:xxx) können Ausdrücke zu einer Gruppe zusammengefasst werden ohne in der  Backreference-Liste aufzutauchen). Das können wir leider nicht so in der Nintex Aktivität angeben. Was uns hier hilft, ist Split Operation. Diese nutzt die Backreference, um den Text zu zerstückeln.
    Wieso hilft uns hier die Extract Operation nicht? Diese findet den gesamten Match und nicht nur die Backreference :- ( Damit ist die Extract Operationan dieser Stelle nutzlos.

    Fazit: Wie konfiguriert man die Aktivität?

    (1) Zuerst den Typ „Split“ festlegen, sonst werden alle Felder gelöscht! Die Einstellung ist leider nicht als erste da. Nicht besonders logisch :-(
    (2) Pattern: ^(?:\s*)([\W\w]*)(?:\b\s*$)
    (3) Input Text: eine String Workflow Variable auswählen
    (4) Die Ergebnisse werden in einer Collection abgelegt. Diese muss man vorher als eine Workflow Variable hinzufügen

    Es kann sein, das wir keinen Treffer haben, dann ist unsere Collection leer (Input-Variable war leer). Das würde eine RunTime-Exception hervorrufen. Deswegen brauchen wir noch zusätzliche

    Aktivitäten:
    (1) Collection Operation – die Anzahl der Elemente in der Collection wird ausgelesen und in einer Workflow-Variable vom Typ Number countCollection abgelegt.
    (2) Run If – wenn countCollection größer als 0 ist, dann können wir den Text auslesen.
    (3) Set Variable – wir setzen den Index für die Get-Operation auf 1. Split-Operation liefert 3 Elemente: vor der Backreference, die Backreference, alles nach der Backreference.
    (4) Collection operation – die Variable mit dem Text nach dem Trim auslesen. Es ist das zweite Element in der Collection. Der Index beginnt bei 0. Deswegen haben wir in (3) den Index auf 1 gesetzt.

    Das Ganze sollte man dann in eine Action Box verpacken.
    Nach demselben Muster können folgende Operationen ausgeführt werden:

    trim: ^(?:\s*)([\W\w]*)(?:\b\s*$) - rechts und links Leerzeichen abschneiden
    rtrim: ^([\W\w]*)(?:\b\s*$) - nur rechts Leerzeichen abschneiden
    ltrim: ^(?:\s*)([\W\w]*) – nur links Leerzeichen abschneiden
    substr :position, length : ^(?:[\W\w]{x})([\W\w]{y}) – einen Substring ausschneiden, ab der Position x und mit der Länge y

    Andere Operationen:

    concat – Textzeichen zusammensetzen: dafür ist Build dynamic String prädestiniert
    replace – Reguar Expression replace und für den Treffer $1 etc. nutzen
    Leider ist es nicht möglich mit RegEx und Nintex folgende Operationen durchzuführen. Vielleicht aber doch? Ideen?
    upper: ^([\W\w]*) \U1 -> Spirit Link Technology – SPIRIT LINK TECHNOLOGY
    lower ^([\W\w]*) \L -> Spirit Link Technology – spirit link technology
    initcap (\w)(\w+) \F1$2 -> spirit link technology - Spirit Link Technology
    rpad DOG-*-*-*, beginning, ending, padding
    lpad *-*-*DOG

    Mit der Match-Operation, die ein Yes/No zurückliefert, können Beispielweise folgende Werte validiert werden (hier kann auch „Set a Condition“ oder „Run If“ benutzt werden, dass ebenfalls reguläre Ausdrücke unterstützt):
    - Nur Buchstaben
    - Nur Zahlen
    - Alphanumerisch
    - gültige IP Adresse
    - gültige eMail Adresse
    - etc.

    Viel Spaß damit! Weitere Ideen?

    TIPP 1:
    Dem regulären Ausdruck können auch Parameter als „inline parameter“ übergeben werden.
    Um z.B. in einem Text wie „Spirit Link Technology“ nach dem Wort „Link“ zu suchen, könnten wir die Match-Operation benutzen:
    Pattern: link
    Allerdings wird hier case-senstive gesucht und wir bekommen keinen Treffer. Mit den „inline parameter“ i können wir das Verhalten ändern
    Pattern: (?i)link
    Mehr zum Thema RegEx und Parameter:
    http://msdn.microsoft.com/en-us/library/yd1hzczs.aspx

    TIPP 2:
    Benutzen Sie als String Unicode, so müssen andere Operatoren für die regulären Ausdrücke benutzt werden. Es gilt nicht bei UTF 8 für die englische und deutsche Sprache.
    \p{name}
    Matches any character in the Unicode general category or named block specified by name (for example, Ll, Nd, Z, IsGreek, and IsBoxDrawing).
    http://msdn.microsoft.com/en-us/library/20bw873z.aspx

    Erklärung:

    [1] Trim RegExp ^(?:\s*)([\W\w]*)(?:\b\s*$)
    Assert position at the start of the string «^»
    Match the regular expression below «(?:\s*)»
    Match a character that is a “whitespace character” (spaces, tabs, line breaks, etc.) «\s*»
    Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
    Match the regular expression below and capture its match into backreference number 1 «([\W\w]*)»
    Match a single character out of the list: non-word character, or a word character «[\W\w]*»
    Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
    Match the regular expression below «(?:\b\s*$)»
    Assert position at a word boundary «\b»
    Match a character that is a “whitespace character” (spaces, tabs, line breaks, etc.) «\s*»
    Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
    Assert position at the end of the string (or before the line break at the end of the string, if any) «$»

  • Rechte bei der Ausführung der Nintex Workflows 2007

    Bei der Gestaltung von  Workflows für Information Worker kommt es sehr oft zu folgendem Szenario:�
    Ein Mitarbeiter soll im Self-Service einen Antrag stellen, der von einem oder mehreren Verantwortlichen freigegeben werden soll, zum Beispiel einen Reiseantrag. Nachdem die Daten von ihm angegeben wurden, soll es den Antrag nicht mehr verändern können. Vom Workflows soll Status im Formular verändert werden.

    Ein einfaches Szenario. Im Kontext von SharePoint und Nintex Workflow wird das ganze jedoch problematisch. Man kann mit dem “Set Permissions” Action Item das Vererben der Rechte für ein Element unterbrechen und das Recht nur für den User setzen. Damit kann man dem Antragsteller nur das Leserecht gewähren (Initiator). Das Workflow läuft aber ebenfalls mit den Rechten vom Initiator. Die Folge: Ein “Item Update” kann nicht durchgeführt werden.

    Wenn man sich die Rechte, in denen ein Workflow ausgeführt wird, anschaut, ergibt sich folgendes Bild:

    • Manual – User, der manuell ein Workflow startet.
    • On update – User, der die letzte Änderung vorgenommen hat.
    • On create – User, der den Eintrag erzeugt hat.
    • Schedular for an Item – System account.
    • As a Subworkflow – im Namen des Users vom Haupt-Workflow.
    • As a workflow for a policy – System account.

    Umweg:

    Eine offizielle Empfehlung von Nintex ist es, an dieser Stelle das Web Service Action Item Web Service zu nutzen und dann auch die das _vti_bin/Lists.asmx Web Service zu gehen. Damit kann man einen Web Service im Namen eines anderen Users als Initiator aufrufen und eine Änderung vornehmen. Ein Weg, der selbstverständlich funktioniert. Damit könnte man sich aber doch alle Action Items im Bereich Operation and Libraries nachbauen. Mit dem Slogan: “Workflows for everyone” ist es gerade kein gutes Beispiel.

    Eine andere Idee wurde bei Fujitsu-Siemens (Boris Lisac) realisiert. Das Action Item Update Item wurde kopiert und angepasst. Ein neues Feld für den User, in dessen Namen es ausgeführt werden soll, wurde hinzugefügt.

    Diese Idee habe ich auch an Dan Parker von Nintex weitergegeben. Hoffentlich haben wir bald diesen Parameter bei allen Items, die eine Manipulation der SharePoint Liste vornehmen.