none
CRM SDK Delete RRS feed

  • Frage

  • Hallo,
    ich beschäftige mich im Moment mit dem SDK.
    Nach dem das Hinzufügen und Updaten von Datensätzen funktioniert, möchte ich natürlich auch löschen können.

    Hier der Code:
    ' contactGuid is the GUID of the record being deleted.
    Guid contactGuid = new Guid("4D507FFE-ED25-447B-80DE-00AE3EB18B84")

    ' Delete the contact. ' The EntityName indicates the EntityType of the object being deleted. service.Delete(EntityName.contact.ToString(), contactGuid)
    Die Zeile "Guid contactGuid" wird leider so nicht erkannt. Ich habe es versucht mit "Dim contactGuid" dann lässt es sich kompilieren, aber es funktionert nicht. Weiß hier jmd den genauen Code, oder bzw. was ich falsch machen?

    Des weiteren benötige ich ja die Guid um einen Datensatz zu löschen. Wie bekomme ich die ohne direkte Sql auf der Datenbank raus? Sozusagen,

    select contactid from dbo.contact where InternContactId = 234;

    Danke für eure Hilfe.

    Gruß
    tw-elektric
    Donnerstag, 6. August 2009 07:29

Antworten

  • In deinem Fall würde ich den Datensatz per QueryByAttribute abfragen.

    Dim query As New QueryByAttribute()
    query.ColumnSet = New AllColumns()
    query.EntityName = EntityName.account.ToString()

    ' Alle Firmen mit Firmennummer 123
    query.Attributes = New String() {"accountnumber"}
    query.Values = New String() {"123"}

    ' Abfrage ausführen
    Dim retrieved As BusinessEntityCollection = service.RetrieveMultiple(query)

    Dim account As account = CType(retrieved(0), account)

    Dim id As Guid = account.accountid
    Alternativ kannst du dir die Abfrage auch direkt per QueryExpression erstellen. FetchXml würde ich für diese Problemstellung nicht einsetzen. Das hat seinen Einsatzgebiet eher im Clientscripting, als bei serverseitiger oder anderer Programmierung.

    P.S.: ich kann für die VB.NET Beispiele nicht garantieren, dass sie 100% korrekt sind, da ich eigentlich nur C# programmiere ;)
    • Als Antwort markiert tw-elektric Montag, 10. August 2009 11:20
    Freitag, 7. August 2009 11:15
  • Hallo,

    du benötigst für die Zuweisung des Kontakts zu einer übergeordneten Firma eine Instanz der Klasse Customer. Dieser musst du den Typ (contact oder account) mitgeben, sowie die ID des Datensatzes.

    Dim parentAccount As New Customer()
    parentAccount.type = EntityName.account.ToString()
    parentAccount.value = {ID der Firma}
    
    tweKontakt.parentcustomerid = parentAccount
    • Als Antwort markiert tw-elektric Montag, 10. August 2009 11:20
    Montag, 10. August 2009 10:17

Alle Antworten

  • Okay, ich mache es nun mit
    Public Sub CRMDelete()
    
    ' contactGuid is the GUID of the record being deleted.
    Dim contactid = New Guid("A65EEEB6-6882-DE11-BCE9-00237D2ECAB3")
    
     ' Delete the contact.
     ' The EntityName indicates the EntityType of the object being deleted.
     service.Delete(EntityName.contact.ToString(), contactid)
    
    End Sub
    und es funktioniert. Hatte vorhin eine alte ID, welche nicht mehr vorhanden war ^^

    Ein Problem wäre nun gelöst. Ich kann nun also Insert, Update und Delete Befehle ausgeben.

    Nur wie bekomme ich die GUID raus bzw. wie frage ich die Datensätze nach der GUID ab?

    Danke

    Gruß
    tw-elektric
    Donnerstag, 6. August 2009 09:11
  • Hallo,

    hast du schon einen bestimmten Datensatz vorliegen? Datensätze, deren ID du nicht kennst, kannst du beispielsweise mit einer QueryExpression abfragen.
    Die Id findet sich nach Namenskonvention in der Eigenschaft <Entitätsschemaname>id und ist vom Typ Key.

    Nach deinem Beispiel:
    Dim contactId as Guid = crmKontakt.contactid.Value
    Die Guid selbst steht in der Eigenschaft Value des Key.
    Donnerstag, 6. August 2009 18:51
  • Hallo,

    hast du schon einen bestimmten Datensatz vorliegen? Datensätze, deren ID du nicht kennst, kannst du beispielsweise mit einer QueryExpression abfragen.
    Die Id findet sich nach Namenskonvention in der Eigenschaft <Entitätsschemaname>id und ist vom Typ Key.

    Nach deinem Beispiel:
    Dim
    
    
     contactId as
    
    
     Guid = crmKontakt.contactid.Value
    Die Guid selbst steht in der Eigenschaft Value des Key.

    danke für deine Antwort.
    Ich habe noch keinen Datensatz vorliegen. Mir fehlt der Weg zur Selektierung. Wenn ich zum Beispiel den Datensatz bekommen möchte, welcher in der Entität Firma ist und die Firmennummer 123 hat. Wie würdest du das machen?

    Ich habe es über den Fetch Befehl versucht, funktioniert, aber ist aus meiner Sicht etwas kompliziert:

    Public Sub CRMFetch()
    
            'Retrieve all accounts that the user has read access to.
            Dim fetch1 As String = _
            "<fetch mapping='logical'>" + _
              "<entity name='account'>" + _
                "<attribute name='accountid'/>" + _
                  "<filter type='and'>" + _
                    "<condition attribute='accountnumber' operator='eq' value='123'/>" + _
                "</filter>" + _
              "</entity>" + _
            "</fetch>"
    
            ' Fetch the results.
            Dim result1 As String = service.Fetch(fetch1)
            Dim strAccountId As String
    
            Dim xmldoc As New Xml.XmlDocument
            xmldoc.LoadXml(result1)
            Dim reader = New Xml.XmlNodeReader(xmldoc)
            While reader.Read
                Select Case reader.NodeType
                    Case Xml.XmlNodeType.Element
                        If reader.Name = "accountid" Then
                            reader.Read()
                            strAccountId = reader.Value
                            strAccountId = strAccountId.Replace("{", "")
                            strAccountId = strAccountId.Replace("}", "")
                        End If
                End Select
            End While

    Nun steht in der Variable strAccountId die ID.
    Gibt es auch einen leichteren Weg, wie ich die Datensätze nach bestimmten Paramtern abfrage und dann zur ID komme?

    Habe eben noch diesen Artikel gefunden: http://technet.microsoft.com/en-us/library/aa680437.aspx
    Aber dies sieht noch komplizierte aus, und benötigt noch mehr Code zur Abfrage.

    Freitag, 7. August 2009 06:50
  • In deinem Fall würde ich den Datensatz per QueryByAttribute abfragen.

    Dim query As New QueryByAttribute()
    query.ColumnSet = New AllColumns()
    query.EntityName = EntityName.account.ToString()

    ' Alle Firmen mit Firmennummer 123
    query.Attributes = New String() {"accountnumber"}
    query.Values = New String() {"123"}

    ' Abfrage ausführen
    Dim retrieved As BusinessEntityCollection = service.RetrieveMultiple(query)

    Dim account As account = CType(retrieved(0), account)

    Dim id As Guid = account.accountid
    Alternativ kannst du dir die Abfrage auch direkt per QueryExpression erstellen. FetchXml würde ich für diese Problemstellung nicht einsetzen. Das hat seinen Einsatzgebiet eher im Clientscripting, als bei serverseitiger oder anderer Programmierung.

    P.S.: ich kann für die VB.NET Beispiele nicht garantieren, dass sie 100% korrekt sind, da ich eigentlich nur C# programmiere ;)
    • Als Antwort markiert tw-elektric Montag, 10. August 2009 11:20
    Freitag, 7. August 2009 11:15
  • Hallo,

    danke dir für deine gute Hilfe.
    Bis hier funkioniert alles Bestens und ich sehe auch in der Variable meine Werte:
    Dim
     retrieved As
     BusinessEntityCollection = service.RetrieveMultiple(query)

    Die letzten zwei Zeilen haben Fehler:
    CType(retrieved(0) , account)  = Die Klasse "CRMImportApp.CrmSdk.BusinessEntityCollection" kann nicht indiziwet werden, da sie keine Standardeigenschaft hat.

    account.accountid = Der Wert vom Typ "CRMImportApp.CrmSdk.Key" kann nicht in System.Guid konvertiert werden.

    Daraus habe ich jetzt einfach account.accountid.value gemacht. DIes sollte nun gehen!
    Aber bei der oberen Meldung komme ich leider nicht weiter. Ich weiß nicht wie ich an das retrieved ran komme, bzw. an den Wert der accountid.

    Vielen Dank

    Grüße tw-elektric
    Freitag, 7. August 2009 13:51
  • Hallo,

    das war natürlich mein Fehler. Es sollte so lauten
    Dim firma As account = CType(retrieved.BusinessEntities(0) , account)
     Diese Zeile gibt dir die erste Firma aus dem Ergebnis deiner Abfrage zurück.
    • Bearbeitet ckeller Freitag, 7. August 2009 16:02
    Freitag, 7. August 2009 15:54
  • super, sieht gut aus. Läuft durch ohne Fehler.
    Was ich noch komisch finde, wenn ich die Werte von Account anschaue, sehe ich alle Angaben wie Stadt, Strasse etc. Aber die GUID ist leer.

    Siehe Screen:
    http://www.myimg.de/?img=screen89261.jpg

    Da müsste doch eig die E7128-213-123213 etc. drin stehen?

    Und wo ich auch noch meine Probleme habe, sind die Abhängigkeiten.
    Wenn ich z.B. einen neuen Kontakt hinzufügen, und diesen dann einer Firma zuweisen möchte, so dachte ich, ich schreibe die GUID in das Feld "parentcustomerid". Aber das ist ja ein Lookup Feld und ich benötige eine bestimmte Zuordnung.

    Ich danke dir herzlich für deine Hilfe, ohne diese, würde ich noch fast am Anfang stehen!

    EDIT:
    Okay, das mit der GUID hat sich erledigt. Ich weiß zwar nicht, warum ich den Wert nicht in der Variable Key sehe, aber wenn ich es in ein String umwanlde, sehe ich die GUID als klartext :)

    EDIT2:
    Ich stand mal wieder auf dem Schlauch, das Lookup ging am Fr. abend ja schon :)
    Ist ja ganz easy...

    EDIT3:
    verdammt, zu früh gefreut... Also die Felder mit Lookup kann ich bewältigen. Aber die Beziehung vom Kontakt zur Übergeordneter Firma bekomme ich nicht hin. Der Datentyp des Feldes ist "customer"
    Wenn ich es so versuche: tweKontakt.parentcustomerid = accountGuid bekomme ich ein Fehler!
    Wie muss diese Zuweisung aussehen?


    Viele Grüße
    tw-elektric
    Montag, 10. August 2009 07:03
  • Hallo,

    du benötigst für die Zuweisung des Kontakts zu einer übergeordneten Firma eine Instanz der Klasse Customer. Dieser musst du den Typ (contact oder account) mitgeben, sowie die ID des Datensatzes.

    Dim parentAccount As New Customer()
    parentAccount.type = EntityName.account.ToString()
    parentAccount.value = {ID der Firma}
    
    tweKontakt.parentcustomerid = parentAccount
    • Als Antwort markiert tw-elektric Montag, 10. August 2009 11:20
    Montag, 10. August 2009 10:17
  • traumhaft, funktioniert bestens.
    nun habe ich alle funktionen die ich benötige.

    vielen vielen dank.

    Grüße
    tw-elektric
    Montag, 10. August 2009 11:20
  • Da mir in diesem Thread so super geholfen wurde, hänge ich noch schnell eine Frage dran.
    Wenn ich einen Datensatz Create oder Update, und z.B. das Land oder die Stadt hat einen Umlaut wie Ä, so bekomme ich einen Fehler.
    Wenn ich es mit AE schreibe, funktioniert es!

    Bekommt man das auch irgendwie geregelt?
    Wenn ich den Datensatz im CRM anlege, kann ich ja auch Umlaute nutzen!

    Danke

    Gruß
    tw-elektric
    Dienstag, 11. August 2009 07:42
  • Hallo,

    da es ein neues Problem ist würde ich am besten einen neuen Thread aufmachen.
    Welchen Fehler bekommst du? Schau dir die Eigenschaft Detail der SoapException an, die dir das CRM-System zurück gibt.
    Dienstag, 11. August 2009 08:32