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.




Workflow aus Designer-Aktion mehrmals aufrufen

Unbeantwortet Dieser Beitrag hat 4 Antworten

Ohne Rang
12 Beiträge
Daniel erstellt 9 Nov. 2010 13:42
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo,

ich versuche einen Workflow X zu erstellen, welcher einen Workflow Y mehrmals aufruft um eine Wiederholte Tabelle im InfoPath Formular Zeile um Zeile abzuarbeiten.

Dies habe ich als Aktion im Sharepoint Designer 2010 mittels Visual Studio 2010 erstellt und deployt. Zum Test besteht der andere Workflow mal nur daraus eine Mail an mich zu versenden.

Ich übergebe Workflow X einen Parameter mit dem Namen von Y und die Anzahl, wie oft dieser gestartet werden soll. Dies funktioniert auch. Leider jedoch erhalte ich immer nur alle 5 min eine Mail.

Was seltsam ist bei der Sache... Die Mail kommen immer nur alle vollen 5 min. Bsp. Die erste 9:10, die zweite 9:15, die dritte 9:20 Uhr.

Hier noch der Code von meiner Workflow Aktion, welcher immer wartet bis ein Workflow abgeschlossen ist und dann den nächsten startet:

protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
        {
            SPList thislist = VEGAHelper.Helper.getList(this.__Context.Web, this.__Context.ListId); // Aktuelle ListenID holen
            SPListItem thisItem = thislist.GetItemById(this.__Context.ItemId); // Aus zuvor geholter Liste aktuelles Element holen.
            for (int i = 0; i < this.XTimes; i++) // Für jedes Element in einer Wiederholten Liste Workflow x ausführen.
            {
                Common.WriteSuccessToHistoryLog(this.__Context.Web, this.__Context.WorkflowInstanceId, "Schleife " + i + " läuft..."); // Info in Sharepoint Protokoll schreiben
                SPWorkflowManager wfm = this.__Context.Site.WorkflowManager; // Referenz zu aktuellem Workflowmanager anlegen
                //SPWorkflowAssociation wfa = thislist.WorkflowAssociations[0]; // Workflows welche zur Liste gehören in Array schreiben
                SPWorkflowAssociation wfa = thislist.WorkflowAssociations.GetAssociationByName(this.WorkFlowName, new CultureInfo(1033));
                while (true)
                {
                    bool nochAktiv = false;
                    SPWorkflowCollection myActiveWorkflows = wfm.GetItemActiveWorkflows(thisItem);
                    foreach (SPWorkflow wf in myActiveWorkflows)
                    {
                        if (wf.ParentAssociation.Name == this.WorkFlowName)
                        {
                            nochAktiv = true;
                            System.Threading.Thread.Sleep(10000);
                            break;
                        }
                    }
                    if(nochAktiv == false)
                    {
                        break;
                    }
                }
                wfm.StartWorkflow(thisItem, wfa, wfa.AssociationData, true); //Neuen workflow starten
              
            }
            this.Variable = "1"; //gibt bei erfolgreichem durchlauf 1 zurück
            return ActivityExecutionStatus.Closed;
        }

 

Vorab vielen Dank!

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 9 Nov. 2010 14:17
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

So ganz kapiere ich nicht, was Du da erreichen möchtest. Der Workflow soll sich selbst neu starten? Würde mich wundern, wenn das überhaupt geht...

Warum programmierst Du nicht eine Aktion, die ALLE Schritte auf einmal ausführt? Der kannst Du ja auch die Anzahl als Parameter mitgeben.

Aber wie auch immer: wenn ein Workflow warum auch immer in den Ruhezustand versetzt wird, z.B. weil er auf etwas wartet, dann wird er von einem Titemjob wieder reaktiviert und der läuft nur alle fünf Minuten - daher die Pause.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
12 Beiträge
Daniel Als Antwort am 9 Nov. 2010 14:37
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Also erreichen möchte ich damit, dass Workflow 1 beim speichern des Infopath Formulars aufgerufen wird. Dieser ruft dann so oft Workflow 2 auf wie Zeilen in einer Tabelle innerhalb des Infppath Formulars vorhanden sind.

Der Grund warum ich das einzeln machen will ist der, dass ich bereits weitere Actions im Designer habe wo ich verwenden möchte. So ist dann später nicht bei jeder kleinen Änderung Arbeit am Code notwendig.

Den Timejob hab ich mittlerweile geschafft auf 2 min runterzusetzen. Gibt es hier auch eine Möglichkeit, diesen direkt aus dem Code anzustoßen?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 9 Nov. 2010 14:50
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Na gut, wenn Du unbedingt so vorgehen möchtest...

[quote user="Daniel"]Den Timejob hab ich mittlerweile geschafft auf 2 min runterzusetzen. Gibt es hier auch eine Möglichkeit, diesen direkt aus dem Code anzustoßen?[/quote]

Die Möglichkeit gibt es bestimmt, ist aber nicht ganz einfach und ich habe auch kein Beispiel zur Hand. Falls Du mal suchen möchtest: die Dinger heißen SPJobDefinition...

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
12 Beiträge
Daniel Als Antwort am 9 Nov. 2010 16:39
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ja wenn du ein andere Lösung hättest wäre ich der gegenüber auch offen...

Aber danke erst mal ich werde morgen mal nach SPJobDefinition suchen.

Viele Grüße