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.




VS-Workflow soll SPFieldUrlValue ändern

Geprüfte Antwort Dieser Beitrag hat 6 Antworten

Ohne Rang
216 Beiträge
Nachtschelm erstellt 6 Okt. 2010 17:03
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Forum,
ich möchte in einer Hyperlink-Liste via Workflow das Hyperlink-Feld eines Elementes listitem bearbeiten. Leider laufe ich, sobald ich die Funktion listitem.SystemUpdate(false) ausführe, immer auf eine ArgumentException mit sinngemäß folgendem Inhalt: "0x80070057, Sie versuchen ein Feld mit ungültigen Werten zu aktualisieren oder das Feld ist schreibgeschützt". Da ich das Feld über die Maske im Frontend bearbeiten kann, schließe ich die Schreibschutz-Sache mal großzügig aus. Hier meine unterschiedlichen Code-Ansätzee:

destinationItem[COLUMNGUID_DESTINATION_LIST_URL_FIELD] = currentList.ParentWeb.Url + ", " + currentList.ParentWeb.Title;

destinationItem[COLUMNGUID_DESTINATION_LIST_URL_FIELD] = new SPFieldUrlValue(currentList.ParentWeb.Url + ", " + currentList.ParentWeb.Title);

((SPFieldUrlValue)destinationItem[COLUMNGUID_DESTINATION_LIST_URL_FIELD]).Description = currentList.ParentWeb.Title;
((SPFieldUrlValue)destinationItem[COLUMNGUID_DESTINATION_LIST_URL_FIELD]).Url = currentList.ParentWeb.Url;

SPFieldUrlValue urlValue = new SPFieldUrlValue();
urlValue.Description = currentList.ParentWeb.Title;
urlValue.Url = currentList.ParentWeb.Url;
destinationItem[COLUMNGUID_DESTINATION_LIST_URL_FIELD] = urlValue;

All diese Versuche waren leider nicht von Erfolg gekrönt.
Kann mir hier vllt jmd weiterhelfen? Wäre echt super!

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 7 Okt. 2010 08:21
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Deine Versuche mit SPFieldUrlValue sollten eigentlich alle funktionieren. Weclhe URL versuchst Du zu setzen? Probiere mal absolute vs. relative, ich tippe auf ein Problem dort.

Ansonsten natürlich die Standardfrage: bist Du wirklich sicher, daß Deine Konstante COLUMNGUID_DESTINATION_LIST_URL_FIELD paßt?

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
216 Beiträge
Nachtschelm Als Antwort am 8 Okt. 2010 12:07
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Andi,
wie immer erst mal Danke für Deine wie immer schnelle Antwort :). Sorry, dass es bei mir diesemal länger gedauert hat.

Als erstes poste ich hier nochmal die komplette Exception-Message:

System.ArgumentException wurde nicht von Benutzercode behandelt.
  Message=<nativehr>0x80070057</nativehr><nativestack></nativestack>Es wurden ungültige Daten zur Aktualisierung des Listeneintrags verwendet. Das Feld, das Sie aktualisieren möchten, ist möglicherweise schreibgeschützt.
  Source=""
  StackTrace:
       bei Microsoft.SharePoint.Library.SPRequestInternalClass.AddOrUpdateItem(String bstrUrl, String bstrListName, Boolean bAdd, Boolean bSystemUpdate, Boolean bPreserveItemVersion, Boolean bUpdateNoVersion, Int32& plID, String& pbstrGuid, Guid pbstrNewDocId, Boolean bHasNewDocId, String bstrVersion, Object& pvarAttachmentNames, Object& pvarAttachmentContents, Object& pvarProperties, Boolean bCheckOut, Boolean bCheckin, Boolean bMigration, Boolean bPublish, String bstrFileName, ISP2DSafeArrayWriter pListDataValidationCallback, ISP2DSafeArrayWriter pRestrictInsertCallback, ISP2DSafeArrayWriter pUniqueFieldCallback)
       bei Microsoft.SharePoint.Library.SPRequest.AddOrUpdateItem(String bstrUrl, String bstrListName, Boolean bAdd, Boolean bSystemUpdate, Boolean bPreserveItemVersion, Boolean bUpdateNoVersion, Int32& plID, String& pbstrGuid, Guid pbstrNewDocId, Boolean bHasNewDocId, String bstrVersion, Object& pvarAttachmentNames, Object& pvarAttachmentContents, Object& pvarProperties, Boolean bCheckOut, Boolean bCheckin, Boolean bMigration, Boolean bPublish, String bstrFileName, ISP2DSafeArrayWriter pListDataValidationCallback, ISP2DSafeArrayWriter pRestrictInsertCallback, ISP2DSafeArrayWriter pUniqueFieldCallback)
       bei Microsoft.SharePoint.SPListItem.AddOrUpdateItem(Boolean bAdd, Boolean bSystem, Boolean bPreserveItemVersion, Boolean bNoVersion, Boolean bMigration, Boolean bPublish, Boolean bCheckOut, Boolean bCheckin, Guid newGuidOnAdd, Int32& ulID, Object& objAttachmentNames, Object& objAttachmentContents, Boolean suppressAfterEvents, String filename)
       bei Microsoft.SharePoint.SPListItem.UpdateInternal(Boolean bSystem, Boolean bPreserveItemVersion, Guid newGuidOnAdd, Boolean bMigration, Boolean bPublish, Boolean bNoVersion, Boolean bCheckOut, Boolean bCheckin, Boolean suppressAfterEvents, String filename)
       bei Microsoft.SharePoint.SPListItem.SystemUpdate(Boolean incrementListItemVersion)
       bei WF_BusinessRelations.Workflow1.Workflow1.<codeActivity1_ExecuteCode>b__0()
       bei Microsoft.SharePoint.SPSecurity.<>c__DisplayClass4.<RunWithElevatedPrivileges>b__2()
       bei Microsoft.SharePoint.Utilities.SecurityContext.RunAsProcess(CodeToRunElevated secureCode)
  InnerException:

 

Die Konstante passt, ich habe sie schon zur Abfrage ereits bestehender Einträge verwendet. Hat funktioniert...

Auf Deine anderen Fragen poste ich meinen Code, ich denke, der sollte die beste Antwort sein:

      SPList currentList = workflowProperties.List;
      SPList destinationList = workflowProperties.Web.ParentWeb.Lists[LISTGUID_DESTINATION_LIST];
      SPListItem destinationItem;

      private void codeActivity1_ExecuteCode(object sender, EventArgs e)
      {

            SPSecurity.runWithElevatedPrivileges(delegate(){
                  destinationItem = destinationList.Items.Add();
                  destinationItem.SystemUpdate(false);
                  SPFieldUrlValue urlValue = new SPFieldUrlValue();
                  urlValue.Description = currentList.ParentWeb.Title;
                  urlValue.Url = currentList.ParentWeb.Url; //absolut
                  // urlValue.Url = currentList.ParentWeb.Url; //relativ
                  destinationItem[COLUMNGUID_DESTINATION_LIST_URL_FIELD] = urlValue;

                  destinationItem.System.Update(false); //Hier fliegt immer die ArgumentException
            });
      }

Vielleicht ist hieraus der Fehler ersichtlich...

Viele Grüße
Nachtschelm

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 8 Okt. 2010 12:22
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Nö, tut mir leid, keine Idee. Der Code sollte so funktionieren. Bist Du sicher, daß mit der Liste und dem Feld sonst alles stimmt? Kannst Du den Code in einer schnell gebastelten Konsolenanwendung ausführen (ist immer gut zum testen)?

Noch was anderes: das RunWithElevatedPriviledges bringt so nichts (was aber hier nicht das Problem sein dürfte). Wenn es etwas bringen soll, dann mußt Du angefangen von SPSite alle Objekte neu instanzieren:

SPSecurity.RunWithElevatedPriviledges(delegate() {
using (SPSite site = new SPSite(worklfowProperties.Web.Site.ID)){
using (SPWeb web = site.OpenWeb(workflowProperties.Web.ID)){
// usw.
}
}
});

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
216 Beiträge
Nachtschelm Als Antwort am 8 Okt. 2010 15:42
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ha, gut ztu wissen! :)

Allerdings stehe ich gerade wie der Prophet vor'm Berg.... Ich habe gerade versucht eine kleine Konsolenanwendung -wie du mir oben geraten hast- zu schreiben. Funktioniert das nicht mehr so, wie beim MOSS 2007? Muss ich über das Client Object Model gehen, dass ich mir mangels Notwendigkeit noch gar nicht angesehen habe (von CAML ganz zu shweigen)?

Ich entwickle auf der Servermaschine und versuche, wie ich es von MOSS 2007 kenne, über SPSite site = new SPSite ("http://servername") eine Verbindung zum Server herzustellen. Leider sagt mir eine Exception, dass es diesen SharePoint server nicht gäbe. Sollte ich auf's Client Object Model ausweichen müssen, hast Du da evtl. eine hilfreiche Website zur Hand?

Viele Grüße
Nachtschelm

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 8 Okt. 2010 15:46
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Funktioniert alles wie gewohnt, aber man muß in den Projekteinstellungen das "Build target" auf "Any CPU" oder x64 umstellen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
216 Beiträge
Nachtschelm Als Antwort am 11 Okt. 2010 09:44
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Sehr gut, das hat mein Debug-Problem gelöst.

Mein eignetliches Problem habe ich auch in den Griff bekommen, als ich festgestellt habe, dass der eigentliche Exception-Verursacher nicht das URL-Field war, sondern, dass ich versehentlich einem berechnetem Feld einen Wert zuweisen wollte.

Viele Grüße
Nachtschelm