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 via Button starten

Unbeantwortet Dieser Beitrag hat 8 Antworten

Ohne Rang
91 Beiträge
Myrcella erstellt 3 Dez. 2014 14:04
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Community,

meine neue Anforderung ist, einen Workflow per Button zu starten, sodass er nicht direkt in der Liste, sondern von einem beliebigen Punkt in der Farm aus gestartet werden kann. Dazu bin ich dieser Anleitung [https://www.simple-talk.com/blogs/2009/11/24/initiate-a-sharepoint-workflow-from-a-button-on-the-list-view/] gefolgt, die sich allerdings auf SP 2010 bezieht, deswegen habe ich den Link abgeändert und nun sieht er folgendermaßen aus:

<button type='button' onclick=javascript:StartWorkflow4('[Workflow-Template-ID]', '[Element-ID]', '[Listen-ID]')><p>Workflow starten</p></button>

Der Button erscheint auch wunderbar, nur funktioniert der Workflowstart noch nicht. Könnt ihr mir sagen, was ich falsch mache? Meine Programmierkenntnisse sind leider stark begrenzt, deswegen komme ich hier gerade nicht weiter.

Vielen Dank!

Myrcella

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 3 Dez. 2014 14:36
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich habe mir die von Dir verlinkte Lösung nicht näher angeschaut, aber SPServices (http://spservices.codeplex.com/) enthält ein StartWorkflow-Methode. Sehr simpel und ich habe gute Erfahrungen damit gemacht.

ABER: dieses einfache Vorgehen funktioniert nur mit 2010er Workflows. Für 2013er gibt es eigene Methoden im JavaScript Client Object Model: http://sharepoint.stackexchange.com/questions/89312/launch-sharepoint-2013-workflow-w-javascript

Edit: Link zu SPServices gefixt

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
91 Beiträge
Myrcella Als Antwort am 3 Dez. 2014 14:56
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Die Antwort auf stackexchange von dem Herrn mit dem niederländischen Sprachpaket scheint ja recht vielversprechend zu sein. Und mit berechneten Spalten arbeite ich sowieso ständig. Aber kannst du mir sagen, wo genau ich dann alles Andere einfügen würde?

[quote]

Added a reload delay function + the WF is starting dialog. So that you receive some feedback and you will see the result in your list.

What I've added:

//dialog element to show during processing
var dlg = null; 

//reload delay
function aReload() {
  location.reload(true);
  }

function startReload() {
  setTimeout("aReload()", 2000);
  }

and

//close dialog
function closeInProgressDialog() {
   if (dlg != null) {
       dlg.close();
   }
}
//open dialog
function showInProgressDialog() {
   if (dlg == null) {
       dlg = SP.UI.ModalDialog.showWaitScreenWithNoClose("Please wait...", "Waiting for workflow...", null, null);
   }
}

to start these add:

closeInProgressDialog();
startReload();

[/quote]

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 3 Dez. 2014 15:01
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das ist ja alles JavaSCript und gehört an eine dafür passende Stelle. Es gibt wie immer viele Möglichkeiten:

Wenn Du es nur in einer Seite brauchst, kannst Du es entweder per SharePoint Designer oder auch ein Script Editor Webpart direkt in die Seite einfügen. Wenn es globaler sein soll, in eine .js-Datei, die Datei z.B. in die Style Library und dann in den gewünschten Seiten verlinken. Oder über die Masterpage verlinken, dann hast Du es in allen Seiten.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
91 Beiträge
Myrcella Als Antwort am 3 Dez. 2014 15:17
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich habe jetzt die berechnete Spalte erstellt mit <a href=javascript:StartWorkflow(Element-ID,'{Template-ID}')>Workflow starten</a>. Dabei bin ich davon ausgegangen, dass die ID in den geschweiften Klammern die Template-ID des Workflows ist und nicht die ID der Liste, da ich sonst keinen Verweis auf den Workflow gefunden habe. Ist das richtig?

Dann habe ich sämtlichen anderen Code aus dem Beitrag mit <script>-Tags versehen und in einen Script Editor Webpart eingefügt. Jetzt wird die Seite alle zwei Sekunden aktualisiert, aber der Workflow wurde noch nicht gestartet. Sorry, falls ich hier irgendwie doofe Fragen stelle, aber was genau ist hier jetzt schief gelaufen?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 3 Dez. 2014 15:44
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Du wirst da etwas mehr basteln müssen und eine funktionierende Lösung aus den Teilen der Seite zusammenkompilieren. Es war einfach einer der ersten links, die ich gefunden habe und sollte Dir nur die grundsätzliche Richtung zeigen.

Hier habe ich noch was gefunden und dort wird auch gezeigt, woher diese Guid kommt: http://ranaictiu-technicalblog.blogspot.de/2013/06/sharepoint-2013-start-workflow-with.html

Mit etwas aufwendigerem Code kann man die aktuell gültige Guid auch selbst per Script ermitteln. Das kann ich Dir aber auch nicht auswendig sagen und müßte dazu ein größeres Projekt von mir zerpflücken. Wenn Du Glück hast und ich genug Zeit  finde, suche ich Dir das raus.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 3 Dez. 2014 16:22
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich habe mal das Wichtigste zusammengesucht und hoffentlich nichts vergessen:

var ctx = SP.ClientContext.get_current(),
 web = ctx.get_web(),
 servicesMan = SP.WorkflowServices.WorkflowServicesManager.newObject(ctx, web),
 instanceService = workflowServicesManager.getWorkflowInstanceService(),
 subsService = workflowServicesManager.getWorkflowSubscriptionService(),
 wfAssocs = subsService.enumerateSubscriptionsByList(<ListGuid>),
 enumerator, wf, wfAssoc,
 startParams = {};
ctx.load(wfAssocs);
ctx.executeQueryAsync(function() {
 enumerator = wfAssocs.getEnumerator();
 while (enumerator.moveNext()) {
  wf = enumerator.get_current();
  if (wf.get_name() == "Name of workflow") {
   wfAssoc = wf;
   break;
  }
 }
 startButton.click(function() {
  instanceService.startWorkflowOnListItem(wfAssoc, itemId, startParams);
  ctx.executeQueryAsync(function() {
   // sucessfully started
  }, function() {
   // start failed
  });
 });
}, function() {
 // query failed
});

Bei enumerateSubscriptionsByList mußt Du die Guid der Liste angeben. Wenn Du Dich im Kontext der Liste befindest, kannst Du _spPageContextInfo.pageListId verwenden.

Wenn Dein Workflow Startparameter benötigt, kannst Du die bei der Variablen startParams angeben.

Beim Durchsuchen der Workflows mußt Du den Namen Deines Workflows einsetzen.

Die Variable startButton enthält bei mir eine jQuery-Referenz des Buttons.

Bei startWorkflowOnListItem mußt Du noch die passende ID des Listenelements einbauen. Je nachdem, wo Du Dich befindest, bekommst Du sie z.B. aus der URL oder aus SP.ListOperation.Selection oder auch aus _spPageContextInfo oder ...

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
91 Beiträge
Myrcella Als Antwort am 4 Dez. 2014 08:37
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Andi,

oh wow, so eine ausführliche Antwort mit Skript hatte ich gar nicht erwartet. Vielen, vielen Dank!

Ich fürchte allerdings, dass ich mein Problem damit immer noch nicht vollkommen bewältigen kann... Sorry. Ich habe dein Skript in <script>-Tags in einen Skript-Editor unterhalb meiner Liste gepackt.

[quote user="Andi Fandrich"] Bei enumerateSubscriptionsByList mußt Du die Guid der Liste angeben. [/quote]

Listen-GUID hab ich eingefügt. Muss ich die geschweiften Klammern dabei mit einfügen?

[quote user="Andi Fandrich"] Wenn Dein Workflow Startparameter benötigt... [/quote]

Braucht er nicht.

[quote user="Andi Fandrich"] Beim Durchsuchen der Workflows mußt Du den Namen Deines Workflows einsetzen. [/quote]

Hab ich gemacht.

[quote user="Andi Fandrich"] Die Variable startButton enthält bei mir eine jQuery-Referenz des Buttons. [/quote]

Hier bleibe ich noch etwas hängen. Muss ich hier noch was machen oder war das einfach eine ergänzende Information? Mit JS kenne ich mich leider überhaupt nicht aus, deswegen blicke ich nur so mittelmäßig gut durch. Sucht dein Skript einfach nach dem ersten Button, den es findet? Ist es dann unterhalb der Liste überhaupt richtig positioniert? Oder wird das über die Listenelement-ID geregelt?

[quote user="Andi Fandrich"] Bei startWorkflowOnListItem mußt Du noch die passende ID des Listenelements einbauen. [/quote]

Die hab ich dort jetzt erst einmal fix eingebaut, das werde ich später sicher cleverer lösen müssen, aber da lasse ich dann einfach einen Kollegen ran. Erstmal muss das grundsätzlich funktionieren, und das tut es leider immer noch nicht.

Vermutlich sind das für dich alles ziemlich simple Fragen (um es nett auszudrücken), die sich eigentlich von selbst erklären, aber mir fehlt leider das Wissen dazu und mein Projekt-Kollege kann mir dabei auch nicht helfen. Deswegen bin ich dir wirklich dankbar, dass du dir schon so viel Zeit genommen hast und mir sogar Skript zur Verfügung gestellt hast.

Ich habe heute Morgen übrigens nochmal an meinem bisherigen Button herumprobiert. Dabei habe ich zwei Beobachtungen gemacht:

1. Wenn ich mir die Workflowstartseite der verschiedenen Elemente ansehe und dann mal mit dem Firebug die Startlinks untersuche, sind die erstmal sehr ähnlich aufgebaut, was ja auch Sinn macht: <a title="[WF-Name]" href="javascript:StartWorkflow4('[GUID1', 'Listenelement-ID', '{[GUID2]}')">[...]</a> Die GUID1 ist bei den Elementen gleich, aber die GUID2 ist bei jedem Element verschieden. Ist GUID1 dementsprechend die Template-ID und GUID2 die Instanz-ID? Aber ich dachte, jede WF-Instanz hat bei jeder Durchführung eine andere ID, und die GUID2 des einen Elements ist bisher immer gleich geblieben, egal wie oft der WF schon durchlaufen wurde. 

2. Der Button funktioniert überhaupt nicht. Ich kann ihn zwar anklicken und dann aktualisiert sich die Seite, aber es passiert nichts. Ich habe den Button-Link mal auf eine ganz normale Website abgeändert, aber trotzdem aktualisiert sich die Seite nur und sonst passiert nichts. Also muss ich ja schon bei dem Button etwas Grundlegendes falsch gemacht haben, fürchte ich. Dabei kann man bei Buttons theoretisch nicht so viel falsch machen, oder?

Viele Grüße,

Myrcella

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 4 Dez. 2014 08:52
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Sorry, das Script ist so noch nicht ganz lauffähig. Ich wollte Dir damit nur den wichtigsten Code zeigen und dachte eigentlich Du kennst Dich mit JavaScript gut aus.

[quote user="Myrcella"][quote user="Andi Fandrich"] Die Variable startButton enthält bei mir eine jQuery-Referenz des Buttons. [/quote]

Hier bleibe ich noch etwas hängen. Muss ich hier noch was machen oder war das einfach eine ergänzende Information?[/quote]

Hier mußt Du noch etwas tun. Der Code sollte Dir nur zeigen, wie man es machen kann. In meinem Fall habe ich noch jQuery eingebunden und die Variable startButton enthält bereits eine Referenz auf den richtigen Button. Die mußt Du Dir erst noch holen. Mit jQuery geht das relativ einfach:

startButton = $("#<ID_des_Buttons>");

Wenn Du einfach nur einen Button ohne Script auf eine Seite packst und den dann anklickst, dann löst er einfach nur das Neuladen der Seite aus. Sobald man ihm ein Click-Event zuweist, kann man das unterbinden, indem das aufgerufene Script false zurückgibt:

onclick="myFunction(); return false;"

[quote user="Myrcella"]Wenn ich mir die Workflowstartseite der verschiedenen Elemente ansehe und dann mal mit dem Firebug die Startlinks untersuche, sind die erstmal sehr ähnlich aufgebaut, was ja auch Sinn macht: <a title="[WF-Name]" href="javascript:StartWorkflow4('[GUID1', 'Listenelement-ID', '{[GUID2]}')">[...]</a> Die GUID1 ist bei den Elementen gleich, aber die GUID2 ist bei jedem Element verschieden. Ist GUID1 dementsprechend die Template-ID und GUID2 die Instanz-ID? Aber ich dachte, jede WF-Instanz hat bei jeder Durchführung eine andere ID, und die GUID2 des einen Elements ist bisher immer gleich geblieben, egal wie oft der WF schon durchlaufen wurde[/quote]

Ich kann Dir leider auch nicht sagen, was die Standardfunktion startWorkflow4 genau macht und welche Parameter sie erwartet. Microsoft hält es leider nicht für notwendig solche Dinge zu dokumentieren. Und es ist nicht wirklich einfach, es per Debugger herauszufinden.

Deshalb habe ich mich da einfach an das Objektmodell gehalten und selbst etwas gebastelt. Den Kern dazu habe ich ja gepostet.

Viele Grüße
Andi
af @ evocom de
Blog