CRM 2011 - Lookup-Wert programmatisch per C# auf null setzen
-
Montag, 30. Januar 2012 08:42
Hallo zusammen
Ich benötige dringend Hilfe. Bislang habe ich vergeblich eine Möglichkeit gesucht, per C# ein Lookup-Feld programmatisch auf null zu setzen. Sollte doch eigentlich einfach sein, oder?
Ich suche eine Lösung in C#.
Hier ein kleines Beispiel, um alle Unklarheiten zu beseitigen: Ich habe eine selbst definierte Entität namens MyEntity, in der sich bereits Daten befinden. Das MyEntity-Feld 'abc_myLookupId' vom Typ Guid verweist auf die Entität MySpecialType. 'abc_myLookupId' ist also ein Lookup-Feld und ist nullable. Nun lese ich einen Datensatz der Entität MyEntity aus und möchte das Feld 'abc_myLookupId' dieses Datensatzes auf null setzen.
Ich möchte also Folgendes realisieren, wobei die Zuweisung im Fokus der Lösungssuche stehen sollte:
Entity myRecord = service.Retrieve("MyEntity", searchedId, new ColumnSet(true));
myRecord.Attributes["abc_myLookupId"] = null; // funktioniert so nicht!!!
service.Update(myRecord);
Diese Lösung führt beim Updaten zu eine "Generic SQL Error", vermutlich weil ich den null-Wert nicht in dieser Weise einem Lookup-Feld zuweisen darf.
Aber wie mache ich es denn richtig?
Für gute Antworten bedanke ich mich im Voraus.
ukiwa_san
Alle Antworten
-
Montag, 30. Januar 2012 10:00
Hi,
was passiert wenn du anstatt null eine leere EntityReference (myRecord.Attributes["abc_myLookupId"] = new EntityReference();) setzt?
Lg
Uli
-
Montag, 30. Januar 2012 11:32
Hallo
Erst einmal danke für die rasche Antwort.
In diesem Fall wird anscheinend automatisch das Feld mit einer Guid.Empty initialisiert. Beim Update-Versuch gibt es einen "Generic SQL Error" mit dem Hinweis, dass es in der Lookup-Entität keinen Eintrag mit der ID '00000000-0000-0000-0000-000000000000' gibt.
Uwe
-
Montag, 30. Januar 2012 11:56
Hi,
Hier mein Sample-Code eines Tickets (Incidents) bei dem ich das Product-Lookup auf null setze. Das funktioniert einwandfrei.
using (var service = new OrganizationServiceProxy(new Uri("http://srv/Org/XrmServices/2011/Organization.svc"), null, null, null)) { var ticket = service.Retrieve("incident", new Guid("0E47C097-6E3B-E111-B8AE-00155D001009"), new ColumnSet(true)); ticket.Attributes["productid"] = null; service.Update(ticket); }
Eventuell passt was mit deiner Entity nicht ganz. Wie sieht die Attribute.Definition aus?
- Als Antwort vorgeschlagen Andreas Buchinger Montag, 30. Januar 2012 13:55
-
Montag, 30. Januar 2012 12:25
Hallo ukiwa_san,
Folgendes sollte auch funktionieren, da so das ganze Attribut löscht:
myRecord.Attributes.Remove("abc_myLookupId");Liebe Grüße,
Andreas
Andreas Buchinger
Microsoft Dynamics Certified Technology Specialist
MCPD: SharePoint Developer 2010 -
Montag, 30. Januar 2012 12:38
Hallo Andreas,
Das würde ihr Problem nicht lösen, da bei einem Update dieses Attribut nicht auf null gesetzt wird. Das Crm Service berücksichtigt nur Attribute, die im Attributes Dictionary enthalten sind.
Wenn also wie in meinem Sample das Attribute "productid" gesetzt ist und ich deine Codezeile ausführe und danach ein Update auf das objekt ausführe ist das Attribut nach wie vor gesetzt und nicht auf null gesetzt.
Lg
Uli -
Montag, 30. Januar 2012 13:52
Hallo Andreas, hallo Uli,
ich stimme Uli zu, dass ich mit der Remove()-Methode lediglich beim Updaten dieses eine Attribut ausgrenze - Änderungen seitens CRM hat dies allerdings nicht zur Folge. Ich entferne damit also nur das Attribut aus der Attributen-Liste, nicht jedoch den Wert im CRM (bzw. im darunter liegenden SQL Server).
Zwischenzeitlich habe ich aber gemerkt, dass der "Generic SQL Error" nicht an der Zuweisung von 'null' an das Lookup-Feld lag. Dies funktioniert tatsächlich so wie Uli es beschrieben hatte, also:
ticket.Attributes["productid"] = null;
Meine Fehlermeldung scheint also eine andere Ursache zu haben. Das Problem ist, dass ich nicht debuggen kann. Ich importiere über einen ProxyService eine grössere Menge an Daten von eineml externen System nach CRM. Beim Import werden diverse PlugIns asynchron ausgeführt - und bei deren Update-Aktionen gibt es den geschilderten Fehler. Dummerweise erhalte ich nicht den Fehler, wenn ich im CRM von Hand einen Datensatz einfüge - in diesem Fall laufen die PlugIns fehlerfrei.
Aber gut - wie gesagt, das ist ein anderes Problem.
Ich danke Euch für die Hilfe.
Uwe
-
Montag, 30. Januar 2012 13:56
Hallo,
Ihr habt natürlich beide recht - war wohl ein vorschneller Post...
Liebe Grüße,
Andreas
Andreas Buchinger
Microsoft Dynamics Certified Technology Specialist
MCPD: SharePoint Developer 2010 -
Montag, 30. Januar 2012 16:16
Das erklärt dann einiges :)
Kannst du bitte den Thread abschließen.Danke & Lg
Uli