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.




PreSaveAction zum Befüllen von Feldern

Geprüfte Antwort Dieser Beitrag hat 5 Antworten

Ohne Rang
5 Beiträge
Erhard Rainer erstellt 22 Okt. 2012 17:27
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Fachleute,

ich will vor dem Speichern einer NewForm ein Formularfeld befüllen, das klappt auch insoweit gut, dass ich kurz sehe, dass die PreSaveAction den richtigen Wert in das Feld schreibt. Gespeichert wird dieser Wert jedoch nicht. Bedeutet dass, dass nur der Inhalt der Felder vor der PreSaveAction gespeichert werden? Und wie kann ich das umgehen? Ich könnte natürlich einen EventReceiver Programmieren, Aber das würde ich ehrlichgesagt nur ungern.Vielleicht gibt es ja eine Lösung (Idee) für mein Problem.

Danke im Voraus.

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 23 Okt. 2012 08:20
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das hängt vom Feldtyp ab. Manche Felder (z.B. Lookups) speichern den eigentlichen Wert in einem Hidden-Control. Bei einem einfachen Textfeld sollte es aber ausreichen die Textbox zu befüllen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
5 Beiträge
Erhard Rainer Als Antwort am 23 Okt. 2012 08:51
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Andi Fandrich"]

Das hängt vom Feldtyp ab. Manche Felder (z.B. Lookups) speichern den eigentlichen Wert in einem Hidden-Control. Bei einem einfachen Textfeld sollte es aber ausreichen die Textbox zu befüllen.

[/quote]

Du hast Recht,offensichtlich habe ich um das Beispiel zu vereinfachen was sehr wichtiges übersehen. Wenn ich ein Textfeld einfach so befülle, klappt das problemlos. Wenn ich aber eine asynchrone Abfrage (executeQueryAsync) dazwischen schalte, dann nicht mehr.

folgendes klappt beispielsweise:

<script type="text/javascript" language="javascript">
// --- Presave Action --- //
function PreSaveAction ()
{
    setTextFromFieldName('Title',"Test");
    return true; // if you want to execute save functionality of the form.
}

function setTextFromFieldName(FieldName, value) {
 if (value == undefined) return;
    var theInput = getTagFromIdentifierAndTitle("input","",FieldName);
    theInput.value=value;
}

function getTagFromIdentifierAndTitle(tagName, identifier, title) {
  var len = identifier.length;
  var tags = document.getElementsByTagName(tagName);
  for (var i=0; i < tags.length; i++) {
    var tempString = tags[i].id;
    if (tags[i].title == title && (identifier == "" || tempString.indexOf(identifier) == tempString.length - len)) {
      return tags[i];
    }
  }
  return null;
}
</script>

folgendes klappt hingegen nicht. (Anmerkung: Die Sinnhaftigkeit des Beispiels bitte nicht reflektieren)

<script type="text/javascript" language="javascript">
// --- Presave Action --- //
function PreSaveAction ()
{
    ExecuteOrDelayUntilScriptLoaded(countElements, "sp.js");
    return true; // if you want to execute save functionality of the form.
}

function countElements() {
context = new SP.ClientContext.get_current();
web = context.get_web();
var list = web.get_lists().getByTitle('Testliste');


var query = SP.CamlQuery.createAllItemsQuery();
allItems = list.getItems(query);
context.load(allItems, 'Include(Id)');

context.executeQueryAsync(Function.createDelegate(this, this.success), Function.createDelegate(this, this.failed));
}


function success() {

    var listItemEnumerator = this.allItems.getEnumerator();
    var j = 0;
   
    while (listItemEnumerator.moveNext()) {
            j++;
        }
    setTextFromFieldName('Title',j);   
   
    }
   
function onQueryFailed(sender, args) {

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

// --- Hilfsfunktion --- //
function setTextFromFieldName(FieldName, value) {
 if (value == undefined) return;
    var theInput = getTagFromIdentifierAndTitle("input","",FieldName);
    theInput.value=value;
}

function getTagFromIdentifierAndTitle(tagName, identifier, title) {
  var len = identifier.length;
  var tags = document.getElementsByTagName(tagName);
  for (var i=0; i < tags.length; i++) {
    var tempString = tags[i].id;
    if (tags[i].title == title && (identifier == "" || tempString.indexOf(identifier) == tempString.length - len)) {
      return tags[i];
    }
  }
  return null;
}

</script>

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 23 Okt. 2012 09:28
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Asynchron wird das natürlich nicht funktionieren, weil SharePoint sofort nach dem Aufruf von PreSaveAction serverseitig weiterarbeitet und das Element speichert. Zu dem Zeitpunkt ist Deine asynchrone Methode (d.h. deren Callback) aber noch gar nicht ausgeführt.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
5 Beiträge
Erhard Rainer Als Antwort am 23 Okt. 2012 09:40
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Andi Fandrich"]

Asynchron wird das natürlich nicht funktionieren, weil SharePoint sofort nach dem Aufruf von PreSaveAction serverseitig weiterarbeitet und das Element speichert. Zu dem Zeitpunkt ist Deine asynchrone Methode (d.h. deren Callback) aber noch gar nicht ausgeführt.

[/quote]

Sowas habe ich schon befürchtet - aber es gibt ja kein synchrones Pendant zu "executeQueryAsync". Irgendeine Idee wie ich das trotzdem realisieren könnte?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 23 Okt. 2012 10:11
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Du könntest das Ganze direkt beim Laden/Anzeigen des Formulars machen. Der Benutzer kann die Werte dann aber überschreiben. Ansonsten wird wohl nur ein EventReceiver bleiben...

Viele Grüße
Andi
af @ evocom de
Blog