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.




Über customAction/Button ein Feldwert ändern

Unbeantwortet Dieser Beitrag hat 12 Antworten

Ohne Rang
86 Beiträge
MMAY erstellt 18 Juni 2015 16:53
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Viele Wege führen nach Rom, und eventuell gibt es ja auch einen ganz anderen Ansatz um das Problem zu beheben?

Ich habe eine Dokumentenbibliothek, in der nur sehr wenige User das Recht zum löschen haben.

Nun sollen aber alle Benutzer die Möglichkeit haben, ein Dokument als "zum löschen markieren" zu können. Hier für ist ein Bool Spalte (default=false) vorhanden.

 

Mein Ziel: User möchte das etwas gelöscht wird -> klick auf zum löschen markieren im Menüband

-> Dokument erhält in der Bool Spalte ein true (und wird danach in der Ansicht ausgeblendet)

-> Workflow wird ausgelöst (autom. Start bei geändertem Element, Bedingung: Bool Spalte ==true) (in dem bekommen bestimmte Personen mit Lösch-Rechten eine Email mit Infos) 

 

Mein grundlegendes Problem: Es ist für mich nicht möglich über die benutzerdefinierte Aktion direkt einen Workflow zu starten. (Nach Klick auf starten die Meldung "es ist ein unerwarteter Fehler aufgetreten". 

(SharePoint Server 2013 Enterprise + Workflow 2010)

 

Das Löschen von Dokumenten muss leider unbedingt im Bereich des Menübandes bleiben, meine User tun sich selbst mit kleinsten Änderungen schwer. 

Anbei Screen vom derzeitigen Workflow.

Hintergrund: Egal wie oft ich es den betreffenden Usern erkläre, Versionierung scheint ein zu schwieriges Thema zu sein, als das ich den Usern die Löschen-Rechte weiterhin gestatten kann.

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 19 Juni 2015 08:19
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Da gäbe es mehrere Möglichkeiten:

1. das boolesche Feld per CustomAction setzen. Beim Aufruf der CA kannst Du einen Parameter {ItemId} mitgeben (inkl. der geschweiften Klammern). SharePoint ersetzt das dann durch die ID des jeweils markierten Elements. Jetzt mußt Du "nur noch" per JavaScript Object Model die Liste und das ListItem laden, ändern und speichern.

2. mit SPServices kann man relativ einfach 2010er Workflows starten (2013 ticken komplett anders). Das habe ich auf die Schnelle gefunden (denke Dir einfach den Teil mit den Startparametern weg): http://mattbramer.blogspot.de/2014/01/fire-workflows-with-initiation.html

Statt [ItemId} kannst Du in der aufgerufenen Funktion auch SP.ListOperation.Selection.getSelectedItems() verwenden. Damit bekommst Du alle in der Liste markierten Elemente und die Benutzer können damit mehrere auf einmal markieren.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
86 Beiträge
MMAY Als Antwort am 19 Juni 2015 09:15
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Für mich hört sich der erste Weg in dieser Konstellation am besten an.

Derzeit wird über Custom Action ein Formular geöffnet mit dem betreffenden Element (mehrere auf einmal Löschen ist nicht notwendig).

Dort gibt es einen Button zum Löschen der diese Funktion aufruft:

 

 

In dem Fall setze ich den Wert in der entsprechenden Spalte bereits auf true, allerdings speichert er so natürlich den Wert noch nicht ab.

Jetzt habe ich hier was zum Aktualisieren eines Listenelements gefunden, allerdings bin ich was javascript angeht eher Anfänger..

Was/Wie kann ich das nun einbauen??

 

function updateListItem(siteUrl) {
    var clientContext = new SP.ClientContext(siteUrl);
    var oList = clientContext.get_web().get_lists().getByTitle('Announcements');

    this.oListItem = oList.getItemById(3);
    oListItem.set_item('Title', 'My Updated Title');
    oListItem.update();

    clientContext.executeQueryAsync(
        Function.createDelegate(this, this.onQuerySucceeded), 
        Function.createDelegate(this, this.onQueryFailed)
    );
}

function onQuerySucceeded() {
    alert('Item updated!');
}

function onQueryFailed(sender, args) {
    alert('Request failed. ' + args.get_message() + 
        '\n' + args.get_stackTrace());
}

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 19 Juni 2015 10:14
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich würde den Dialog komplett weglassen und per Script die Aktualisierung im Hintergrund machen. Du kannst dem Benutzer dann immer noch eine Rückmeldung geben. Per alert oder schöner per SharePoint Notification. Dazu gibst Du in Deiner CustomAction keine URL sondern einfach die JavaScript-Funktion an, der Du die ElementID gibst:

CustomAction: javascript:updateListItem({ItemId});

JavaScript:
function updateListItem(itemId) {
var ctx = SP.ClientContext.get_current();
var list = ctx.get_lists().getById(_spPageContextInfo.pageListId);
var item = list.getItemById(itemId);
item.set_item("BoolscheSpalte") = true;
ctx.load(item);
ctx.executeQueryAsync(...)
}

Das ist nur der Rahmen und ungetestet aus dem Kopf geschrieben. Es sollte Dir aber eine Idee geben, wie es gehen kann...

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
86 Beiträge
MMAY Als Antwort am 19 Juni 2015 10:43
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich muss leider nochmal nerven..

Es ist nicht möglich direkt in der custom action javascript einzubinden.

"CustomAction cannot contain JavaScript: Any UrlActions or CommandActions must be a URL to navigate to. The URL can be parameterized with normal custom actions tokens in addition to the app-specific tokens."

Und mir steht Visual Studio leider nicht zur Verfügung, ich muss das irgendwie über SPD lösen. :-(

Alternativ, lässt sich über CustomAction und Aufruf eines EditFormulars auch das Checkout prompt anstoßen? Dann könnte ich das eventuell anders zurecht basteln..

 

Ich bin eigentlich nicht davon ausgegangen, das es so unmöglich scheint, im Menüband einen Punkt "zum löschen markieren" zu setzen und damit einen Feldwert zu ändern. :-( 

Gibt es sonst eine Möglichkeit das Dokument anderweitig zu markieren über ein Flag, und nicht über einen Spaltenwert? 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 19 Juni 2015 11:07
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="MMAY"]Es ist nicht möglich direkt in der custom action javascript einzubinden[/quote]

Jetzt hast Du mich aber erschreckt. Ich hatte das zuletzt in SharePoint Online benutzt. Aber gerade nochmal bei einem on premise 2013 getestet und es geht problemlos sowohl im Kontextmenü als auch oben im Ribbon. Ich habe dazu bei "Zu URL navigieren" das hier eingesetzt:

javascript:alert('Hallo Welt');

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
86 Beiträge
MMAY Als Antwort am 19 Juni 2015 11:51
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

browser Fehler, doppelpost..

Ohne Rang
86 Beiträge
MMAY Als Antwort am 19 Juni 2015 11:52
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Tatsächlich scheint hier die Microsoft Doku mal wieder fehlerhaft zu sein.

Leider steigt er mir nach vielem testen immer an der Funktion get_lists() aus.

 

javascript:updateListItem({ItemId});

function updateListItem(itemId){

alert('ja es geht');

alert(itemId);

var ctx = SP.ClientContext.get_current();

var list = ctx.get_lists().getById(_spPageContextInfo.pageListId);

 

bei der var list scheitert es dann.

Noch irgendeine Idee? Sonst muss ich mir langsam überlegen wie ich erkläre das es nicht machbar ist.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 19 Juni 2015 12:24
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich hatte ja geschrieben, daß ich das einfach so runtergetippt habe. Es könnte noch mehr Fehler enthalten...

Hier habe ich einfach das Web vergessen:
var list = ctx.get_web().get_lists()

[quote user="MMAY"]die Microsoft Doku [/quote]

Was soll das denn sein? Seit wann dokumentieren die irgendwas? :-)

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
86 Beiträge
MMAY Als Antwort am 19 Juni 2015 14:11
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ja, dokumentieren tun die ja echt nichts, hast Recht.

Soweit bin ich gekommen, doch hier muss ich nun doch kapitulieren, ich finde den Fehler einfach nicht.

Jetzt muss ich mir noch eine Argumentation überlegen wieso/weshalb das nicht geht..

 

javascript:updateListItem({ItemId});

function updateListItem(itemId){

alert('ja es geht');

alert(itemId);

var ctx = SP.ClientContext.get_current();

var list = ctx.get_web().get_lists().getById(_spPageContextInfo.pageListId);

var item = list.getItemById(itemId);

item.set_item("Loeschen", "Ja");

item.update();

ctx.executeQueryAsync(

Function.createDelegate(this, this.onQuerySucceeded), 

Function.createDelegate(this, this.onQueryFailed)

);

alert('ich laufe noch');

}

function onQuerySucceeded() {

 

    alert('Item updated!');

}

function onQueryFailed(sender, args) {

 

    alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());

}

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 19 Juni 2015 14:32
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Was genau funktioniert denn nicht? Es sieht jedenfalls ganz vernünftig aus. Du kannst JavaScript übrigens im IE ganz gut debuggen (in den Entwicklertools F12). Firefox kann das bestimmt auch, aber da kenne ich mich nicht aus.

Hier mal ein paar mögliche Fehlerquellen:

item.set_item("Loeschen", "Ja");
Heißt das Feld mit internem Name wirklich "Loeschen"? Und ist es ein Textfeld (sonst funktioniert "Ja" nicht)? Bei einem Ja/Nein-Feld mußt Du true oder false setzen (ohne Anführungszeichen).

Und ich bin mir nicht ganz sicher, ob das so überhaupt geht. Evtl. muß man das ListItem zuerst asynchron laden und kann es erst dann verändern:

var item = list.getItemById(...
ctx.load(item);
ctx.executeQueryAsync(...

Das eigentliche Update kommt dann erst im Success-Handler.

[quote user="MMAY"]Jetzt muss ich mir noch eine Argumentation überlegen wieso/weshalb das nicht geht..[/quote]

Quatsch, mußt Du nicht. Das geht definitiv. Nicht gleich aufgeben, manchmal braucht es Tage, bis man eine Lösung gefunden hat ;-)

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
86 Beiträge
MMAY Als Antwort am 19 Juni 2015 14:45
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Was das setzen des Feldwertes angeht hab ich diverse Kombinationen ausprobiert, mit ' oder " (auch wenn es eigentlich keinen Sinn macht).

Werteübergabe mit/ohne Anführungsstriche, true, Ja, Yes, nichts davon hat funktioniert.

Eben gerade auch nochmals mit true versucht, nichts leider.

item.set_item('Loeschen', true);

item.update();

 

Mein Feld:

 

Das Problem beim basteln ist, das ich jede Stunde die ich hier dran sitze rechtfertigen muss, und wenn man einem Menschen mit wenig technischem Verständnis dann noch erklärt wieso, und an welcher Stelle man hängt... Oder noch besser die Frage wie lange es noch dauert.... 

 

Was ich der dürftigen Microsoft "Doku" entnehmen kann, sollte die Reihenfolge aber stimmen.

Dort ist überall erstmal variablen schreiben, Liste, Element bestimmen.

set_item Werte setzen, update, danach Async. Außer die "Doku" ist natürlich nicht nur unvollständig sondern auch falsch, was ja auch nichts ungewöhnliches wäre.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 19 Juni 2015 15:04
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Es ist also ein Ja/Nein-Feld und es müßte mit true/false funktionieren. Der Fehler liegt also irgendwo anders. Leider kann ich da aus der Ferne auch nicht mehr sagen...

[quote user="MMAY"]Das Problem beim basteln ist, das ich jede Stunde die ich hier dran sitze rechtfertigen muss, und wenn man einem Menschen mit wenig technischem Verständnis dann noch erklärt wieso, und an welcher Stelle man hängt... Oder noch besser die Frage wie lange es noch dauert.... [/quote]

Kenne ich auch alles. Du hast mein Mitgefühl.

Viele Grüße
Andi
af @ evocom de
Blog