Hallo zusammen
Ich möchte auf dem DispForm.aspx einer Aufgabe einen Button erstellen, der mir unter dieser Aufgabe einen Subtask generiert. Folgender Code funktioniert wunderbar:
<script src="http://code.jquery.com/jquery-1.10.2.min.js" type="text/javascript"></script><script type="text/javascript">
function newSubTask(){
var clientContext = new SP.ClientContext.get_current(); var oList = clientContext.get_web().get_lists().getByTitle('Briefings'); var itemCreationInfo = new SP.ListItemCreationInformation(); this.oListItem = oList.addItem(itemCreationInfo);
oListItem.set_item('Title', 'Test'); oListItem.set_item('ParentID', '5');
oListItem.update();
clientContext.load(oListItem);
clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this,
this.onQueryFailed));
}
function onQuerySucceeded() {
alert('Item created: ' + oListItem.get_id());
function onQueryFailed(sender, args) {
alert('Request failed. ' + args.get_message() + 'n' + args.get_stackTrace());
</script><input id="Button1" onclick="newSubTask()" type="button" value="Teilaufgabe erstellen"/>
Nun möchte ich aber, dass es mir die ID des aktuellen Elements immer gleich übernimmt (s. gelbe Markierung im code), je nachdem auf welchem Element ich mich befinde. Ich möchte dort also keine Zahl eingeben, sondern eine Variable für die ID des aktuellen Elements. Ich krieg das irgendwie nicht hin. Kann mir jemand weiterhelfen?
DANKE!
Wenn es mit einer Zahl funktioniert, dann mache aus dem String eine Zahl:
var strLookupId = getQueryStringParameter("ID");var intLookupId = parseInt(strLookupId, 10);
Zum Abschluss dieses Forums: Es hat nun geklappt. Ich habe die ParentID vom übergeordneten Element gleich dem subtask mitgegeben und ins Feld "Hilfstext" geschrieben. Im Editform kann der Wert des Feldes aber nicht einfach mit Hilfe von SPUtility ausgelesen werden:
function newSubTask(){ var clientContext = new SP.ClientContext.get_current(); var oList = clientContext.get_web().get_lists().getByTitle('Briefings'); var itemCreationInfo = new SP.ListItemCreationInformation(); this.oListItem = oList.addItem(itemCreationInfo); var feld = SPUtility.GetSPField('Hilfstext'); var value = $(feld.GetValue()).wrap('<p>').parent().find('div').text(); var titel = SPUtility.GetSPField('Titel'); var titelwert = titel.GetValue(); if(value) { oListItem.set_item( 'ParentID', value); oListItem.set_item( 'Title', titelwert); oListItem.set_item('Body', value); oListItem.update(); clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed)); } else { alert('ParentID was not found in QueryString!'); }}function onQuerySucceeded() { var neueID = oListItem.get_id(); alert('Teilaufgabe wurde erstellt. Sie werden gleich auf die soeben erstellte Aufgabe weitergeleitet.'); window.location = '/csa/Lists/Briefings/EditForm.aspx?ID=' + neueID;}function onQueryFailed(sender, args) { alert('Request failed. ' + args.get_message() + 'n' + args.get_stackTrace());} //Get QueryStringByNamefunction getQueryStringByName(name) { name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), results = regex.exec(location.search); return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));}</script><input id="btnNewSubTask" type="button" value="Nächste Teilaufgabe" onclick="newSubTask();if (!PreSaveItem()) return false; WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$ctl40$g_d4bd4b32_3af9_4de3_adb9_2ccaf99f5685$ctl00$toolBarTbl$RightRptControls$ctl00$ctl00$diidIOSaveItem", "", true, "", "", false, true))" />
Hallo nochmal,
also habe jetzt die Buttons um automatisch Unteraufgaben zu erstellen, was prima funktioniert. Nun möchte ich, dass bestimmte Werte aus der Hauptaufgabe beim Erstellen einer Unteraufgabe automatisch übernommen werden. Dabei kommt bei mir aber immer die Fehlermeldung "SCRIPT5022: Die Eigenschaft oder das Feld wurde nicht initialisiert. Es ist keine Anforderung erfolgt, oder die Anforderung wurde nicht ausgeführt. Ggf. muss eine ausdrückliche Anforderung erfolgen.". Muss ich eventuell zweimal am Anfang den context initialisieren? Weiss jmd was an diesem Code nciht stimmen könnte:
function newSubTaskPPro(){
var clientContext = new SP.ClientContext.get_current(); var oList = clientContext.get_web().get_lists().getByTitle('Test'); var itemCreationInfo = new SP.ListItemCreationInformation(); var aufgabenId = GetUrlKeyValue("ID", false, location.href); var contenttypeId = GetUrlKeyValue("ContentTypeId", false, location.href); this.targetListItem = oList.getItemById(aufgabenId); clientContext.load(targetListItem); if (contenttypeId = "0x0100AC8EB51D82286E40A404D369B76BE4F20300613240674F94194BB90CC8C0C428DAA3") { var test = targetListItem.get_item('CategoryDescription'); } this.oListItem = oList.addItem(itemCreationInfo); oListItem.set_item('Title', 'Bitte Ausfüllen!');
oListItem.set_item('Priority', '');
oListItem.set_item('ParentID', aufgabenId); oListItem.set_item('CategoryDescription', test); oListItem.update(); clientContext.load(oListItem);
Nach dem ctx.load() in Zeile 7 fehlt ein ctx.executeQueryAsync(...)
Danke schonmal..Neues Problem. Habe den Code etwas umgeschrieben, da ich cniht wusste, ob man zwei ctx.executeQueryAsync nacheinander laufen lassen kann. Jetzt kommt aber folgender Fehler "SCRIPT5007: Die Eigenschaft "Async" eines undefinierten oder Nullverweises kann nicht abgerufen werden.":
<script language="javascript" type="text/javascript">
var clientContext = new SP.ClientContext.get_current(); var oList = clientContext.get_web().get_lists().getByTitle('Test'); var itemCreationInfo = new SP.ListItemCreationInformation(); var aufgabenId = GetUrlKeyValue("ID", false, location.href); var contenttypeId = GetUrlKeyValue("ContentTypeId", false, location.href); var numaufgabenId = Number(aufgabenId); this.targetListItem = oList.getItemById(numaufgabenId); clientContext.load(targetListItem, 'CategoryDescription'); clientContext.executeQuery.Async(Function.createDelegate(this, this.onQuerySucceeded1), Function.createDelegate(this, this.onQueryFailed));
} function onQuerySucceeded1() { if (contenttypeId = "0x0100AC8EB51D82286E40A404D369B76BE4F20300613240674F94194BB90CC8C0C428DAA3") { var test = targetListItem.get_item('CategoryDescription'); } this.oListItem = oList.addItem(itemCreationInfo); oListItem.set_item('Title', 'Bitte Ausfüllen!');
oListItem.set_item('ParentID', aufgabenId); oListItem.set_item('CategoryDescription', test); oListItem.update(); clientContext.load(oListItem); clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded2), Function.createDelegate(this, this.onQueryFailed)); }
function onQuerySucceeded2() {
window.open("http://sps2.emea.festo.net/sites/fmtal/pro/P/Lists/Test/EditForm.aspx?ID="+oListItem.get_id()+"&ContentTypeId=0x0100AC8EB51D82286E40A404D369B76BE4F2030067F81E94B924C84B81CACB66F0B2E440")
} function onQueryFailed(sender, args) { alert('Request failed. ' + args.get_message() + 'n' + args.get_stackTrace());
</script><strong class="ms-rteThemeFontFace-1">Unteraufgabe erstellen:</strong><input id="Button1" onclick="newSubTaskPPro()" type="button" value="P-Pro"/>
Du hast da einen Punkt zu viel. Es heißt einfach nur clientContext.executeQueryAsync - ohne Punkt zwischen Query und Async.
Mache Dich mal schlau, wie man JavaScript debuggen kann, z.B. durch die im Browser eingebauten Entwicklertools, die man durch F12 erreicht. Damit findest Du solche Fehler selbst ganz schnell.