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: Wenn Item geändert wird, X weitere Items aktualisieren?!

Unbeantwortet Dieser Beitrag hat 10 Antworten

Ohne Rang
46 Beiträge
Markus Doll erstellt 10 Mai 2011 19:25
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo zusammen,

ich verzweifel gerade an einem - wie ich dachte - einfach zu implementierenden Prozess und hoffe, dass Ihr mir helfen könnt, meine Denkblockade aufzuheben, bzw. mir Tipps zu geben, wie ich mein Problem lösen kann.

Die Umgebung:

Windows Server 2008 R2, MOSS 2010 Enterprise als Sandbox (Alle Rollen auf einem Gerät), keine Produktionsumgebung.

Hier die Situation:

Ich habe eine Liste, in der Einträge erstellt werden. Für jeden Eintrag, erstellt dann ein Workflow weitere Einträge in einer zweiten Liste. In der zweiten Liste gibt es jeweils ein Feld "ItemID" (welches sich aus einem von 5, 3-stelligen Prefix und der ID des Items aus Liste 1 zusammensetzt) und ein Feld "ParentID" (welches wiederum der ID des orginären Items aus Liste 1 entspricht).

Ich habe nun für die zweite Liste einen Workflow gebaut, der bei Änderung eines Items aus Liste 2, das entsprechende "Parent-Item" in Liste 1 aktualisiert und einzelne Informationen des in Liste 2 geänderten Items, in alle Items, mit der gleichen "ParentID" in Liste 2 einträgt.

Das ganze Konstrukt habe ich mir ausgedacht, weil es ja leider scheinbar nicht die Möglichkeit gibt, über den SPD sowas wie "UPDATE table set ("feld1","feld2","feld3") values ("a","b","c") WHERE FeldX="bla"" zu geben scheint.

Der Workflow:

Da das generische Updaten ala SQL nicht funktioniert, soll der Workflow ein Item nach dem anderen updaten, das die gleiche ParentID hat. Der Workflow startet sobald ein Item der Liste 2 geändert wird. Aus dem Aktuellen Element nehme ich mir die ParentID. Dem Workflow sage ich dann

UPDATE Liste1.Item.FeldX = Liste2.AktuellesElement.FeldY Where  Liste1.Item.ID=Liste2.AktuellesElement.ParentID

...dieser Teil funktioniert noch....dann sage ich weiter...

UPDATE Liste2.Item.FeldA = Liste2.AktuellesElement.FeldA1 Where Liste2.Item.ItemID = "PR1" & Liste2.AktuellesElement.ParentID

UPDATE Liste2.Item.FeldB = Liste2.AktuellesElement.FeldB1 Where Liste2.Item.ItemID = "PR2" & Liste2.AktuellesElement.ParentID

UPDATE Liste2.Item.FeldC = Liste2.AktuellesElement.FeldC1 Where Liste2.Item.ItemID = "PR3" & Liste2.AktuellesElement.ParentID

Problem:

Von diesen 3 "Updates" läuft maximal 1 durch, ohne das es einen Fehler gibt o.ä.

Die Auflösung von "PRX" & ...ParentID zu einem validen und suchbaren Wert ("PRX382") funktioniert augenscheinlich, wenn ich die Werte für ItemID konstruiere, werden sie ordentlich weggeschrieben. In der Regel läuft - wie beschrieben - das erste, manchmal auch das zweite Update durch, aktualisiert alles brav und der Workflow wird beendet.

Ich habe es bisher nicht nachvollziehen können, warum manchmal die Updates nicht laufen, obwohl der Workflow ausgeführt und auch nicht unterbrochen wird.

Die Items in Liste2 werden immer nach dem gleichen Schema F, vom Workflow in Liste1 angelegt, wodurch auch hier kein wirklicher Unterschied zu erkennen ist.

Ich habe auch schon im Feld ItemID, die Reihenfolge von Prefix und folgender ParentID geändert (z.b. 382PRX), ohne das sich hier etwas am (Fehl)verhalten geändert hat.

Trotzdem sich die Items in Liste1 innerlich immer unterscheiden (Personendaten) konnte ich keine Gemeinsamkeit der Items finden, bei denen die Updates teilweise laufen, und denen, wo sie nicht laufen.

Fragestellung:

Hat einer von Euch eine ähnlich gelagerte Problematik bereits gemeistert oder hat einen weiteren Ansatzpunkt, den ich checken kann um weiter zu kommen?

Ich bin für alle Hinweise, die mich in dieser Thematik endlich weiterbringen dankbar, da mich das Ganze schon schlaflose Nächte noch und nöcher gekostet hat.

Alternativ nehme ich gerne auch Ansätze auf, die mit einer Umsetzung mit VisualStudio zu tun haben. Ich habe C# Kenntnisse und VS auf der Sandbox laufen, jedoch fehlt mir das KnowHow, Listenworkflows per VS zu erstellen, da ich das Objektmodell nicht wirklich kenne und noch kein vernünftiges Step-By-Step bzw. "Hello World" eines Listenworkflows gefunden habe.

Vielen Dank & Gruß,

Markus

 

Alle Antworten

Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 10 Mai 2011 20:08
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo,

nur nochmal zum Verständnis: Du versuchst gerade direkt auf der Datenbank per SQL Statements SharePoint Elemente zu manipulieren?

Wenn ja: Mach das nicht - Manipulationen an der DB direkt sind im höchstem Maße unsupportet! Das es nicht 100%-tig funktioniert kann daran liegen, dass SharePoint noch andere Updates benötigt oder das nicht richtig mitbekommt. Manipulationen sollten nur über das Objektmodell geschehen.

Ich persönlich würde für dein Vorhaben eventuell einen Event Handler entwickeln. Henning hat hier (http://sharepointcommunity.de/forums/t/11047.aspx) ein Beispiel für einen Event Handler hinterlegt - eventuell kannst Du dich da reinlesen.

Ansonsten - Finger weg von der DB ;-)

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de

Ohne Rang
46 Beiträge
Markus Doll Als Antwort am 10 Mai 2011 22:47
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi Christian,

danke für Deinen Beitrag.

Nein, ich habe nicht vor direkt auf der Datenbank zu arbeiten, sondern lediglich ein Datenbankähnliches Verhalten auf 2 Listen anzuwenden.

Deswegen schreibe ich über Liste1 und Liste2 ;-).

Nichts destotrotz werde ich mich gerne mal morgen, wenn ich wieder @work bin, in das Thema Eventhandler einlesen.

Mit solchen Handlern habe ich schon in früheren Zeiten Erfahrung gesammelt, weiß aber noch nicht, in wie fern ich das auf diese Sache hier umsetzen kann.

Dennoch bleibt bei mir die Frage offen, warum die - aus meiner Sicht - logische Geschichte nicht logisch funktioniert, so wie ich mir das denke...

Ich sage mir halt immer, das es für dieses Verhalten eine Erklärung muss...;-)

Danke und Gruß,

Markus

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 11 Mai 2011 08:23
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Du hast einen Workflow auf Liste 2, der bei Änderungen automatisch startet. Dieser Workflow ändert Elemente in Liste 2. Das heißt dann aber, daß auf diesen geänderten Elementen sofort auch der Workflow anspringt und Elemente ändert. Ich nehme stark an, daß es dabei zu Konkurrenzsituationen kommt und der Workflow deshalb nicht ordentlich durchläuft.

Ich würde sowas auch eher per EventReceiver lösen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
46 Beiträge
Markus Doll Als Antwort am 11 Mai 2011 08:47
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Guten Morgen,

das hört sich absolut logisch an und ist etwas, woran ich noch so garnicht gedacht habe, obwohl es wahrscheinlichste ist.

Vielen Dank für diese Erleuchtung, obwohl es mir schon eher peinlich ist.

Ich schaue mir die Eventhandler-Geschichte direkt einmal an.

Danke & Gruß,

Markus

Ohne Rang
46 Beiträge
Markus Doll Als Antwort am 11 Mai 2011 14:04
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

 

Mahlzeit,

so, hatte jetzt was Zeit zu experimentieren.

Habe das ganze nicht mit nem Eventhandler, sondern mit einem Sequencial Workflow im VS2010 gemacht.

Der Code scheint syntaktisch korrekt zu sein, der Workflow wird auch veröffentlich und läuft auch ohne Fehler durch, macht aber leider nicht das, was er soll.

In einer Debugsitzung ist mir aufgefallen, dass die Felder auf die ich zugreife, leer zu sein scheinen.

Laut Hilfe ist die Liste, über die ich auf die Items zugreife richtig instanziert, zumindest wird der richtige Listenname angezeigt.

Die Eventhandler-Geschichte habe ich verworfen, weil aus dem Tutorial für mich nicht hervorging, wie ich den Eventhandler, in dem ich nahezu den gleichen Code (halt etwas angepasst) verwendet habe, an eine spezielle Liste flunchen kann.

Der Workflow hingegen startet wie gewollt, tut aber nix, weil die If-Bedingungen nicht erfüllt sind, da die Felder, die ich zur If-Prüfung heranziehe, aus irgendwelchen Gründern leer sind, wobei die Referenzfelder im aktuellen Item, Daten enthalten.

Der Code sieht so aus:

        private void onWorkflowActivated1_Invoked(object sender, ExternalDataEventArgs e)
        {
            SPList List1 = workflowProperties.List;
            SPView oView = List1.Views["All Tasks"];
            SPListItemCollection ListItems = List1.Items;
           
            if (workflowProperties.Item["ItemID"].ToString().Contains("ADS"))
            {
                foreach (SPListItem item in ListItems)
                {
                    if ((item["ParentID"] == workflowProperties.Item["ParentID"]) && (!item["ItemID"].ToString().Contains("ADS")))
                    {
                        item["Shortname"] = workflowProperties.Item["Shortname"].ToString();
                        item.Update();
                    }
                }
             }
        }

Kann dazu einer was sagen?!

Danke & Gruß,

Markus

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 11 Mai 2011 14:52
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich nehme an, daß diese Felder in der Standardansicht der Liste nicht enthalten und deshalb beim Zugriff über SPList.Items nicht enthalten sind. Verwende eine andere Methode um die Items zu holen, wie z.B. SPList.GetItems(SPQuery). Dabei kannst Du die SPQuery gleich so einschränken, daß Du nur die Items bekommst, die Du auch ändern möchtest. SPList.Items holt immer alle Items der Liste und daher aus Performancegründen zu vermeiden.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
46 Beiträge
Markus Doll Als Antwort am 11 Mai 2011 16:22
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich habe irgendwie den Eindruck, dass es doch an der Instanzierten Liste liegen muss.

Egal auf welche Weise ich versuche die Items abzurufen, es kommt immer ein leeres Ergebnis zurück.

Ich habe den Code jetzt umgebaut und nutze SPQuery.

Der "Filter" den ich beim Query verwende, liefert auf der Liste auf jeden Fall Ergebnisse. Dennoch werden keine Ergebnisse zurück gegeben.

 

Ich werde jetzt mal Versuchen die Liste ohne Einbeziehung der "Workflowproperties" zu nutzen, wobei ich nicht glaube, das das von Erfolg gekrönt sein wird, da definitiv auf die richtige Liste zugegriffen wird (wie man anhand des Display Names sieht).

Gruß,

Markus

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 11 Mai 2011 17:04
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Sehr seltsam. Welche Feldtypen sind denn ParentID und ItemID?

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
46 Beiträge
Markus Doll Als Antwort am 11 Mai 2011 17:18
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das sind "Single-Line of text"-Felder.

Habe zwischenzeitlich die Liste versucht über den "normalen" Rattenschwanz (SPSite, SPWeb usw.) zu öffnen...selbes Bild.

Ich kann mir da aktuell keinerlei Reim drauf machen, aber vielleicht sehe ich auch einfach den Wald vor lauter Bäumen nicht mehr.

Gruß,
Markus

 

Ohne Rang
46 Beiträge
Markus Doll Als Antwort am 11 Mai 2011 18:07
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

So, jetzt läufts!

Was ich gemacht habe?

Viel hin und her...letztendlich das Query nochmal verändert und die "NotIncludes"-Bedingung rausgelassen und siehe da, es funktioniert.

Verstehe ich zwar nicht ganz, da das ja - nach meinem dafürhalten - genau zum exkludieren gedacht ist, aber dann mache ich das eben über ein IF-Statement.

Sage vielen Dank und einen schönen Abend!

Gruß,

Markus