Laden...

CRM WebService Einträge suchen

Erstellt von marv100 vor 15 Jahren Letzter Beitrag vor 14 Jahren 4.572 Views
M
marv100 Themenstarter:in
227 Beiträge seit 2008
vor 15 Jahren
CRM WebService Einträge suchen

verwendetes Datenbanksystem: MS SQL, MS CRM

Hallo zusammen,

ich habe die ehrenvolle Aufgabe bekommen, in einem Programm eine Suche einzubauen. Sie soll über den CRM WebService von MS arbeiten. So weit so gut.

Was ich bis jetzt geschafft habe, ist die ServiceReference in meinem Projekt zu implementieren.
Weiter komm ich leider nicht, weil ich überhaupt keinen Plan hab, wie ich das anstellen soll.

Könnt ihr mir da weiter helfen?

**"Niemand wird je mehr als 640KB RAM benötigen!" **

Bill Gates, 1981

664 Beiträge seit 2005
vor 15 Jahren

Hi,

verwende für die Suche entweder die Klasse QueryExpression oder suche über FetchXML.
Beides ist im SDK [1] beschrieben.

[1] http://msdn.microsoft.com/de-de/library/bb928212(en-us).aspx oder http://www.microsoft.com/downloads/details.aspx?FamilyID=82E632A7-FAF9-41E0-8EC1-A2662AAE9DFB

M
marv100 Themenstarter:in
227 Beiträge seit 2008
vor 15 Jahren

da habe ich schon geschaut aber blick da irgendwie nicht durch.

allein schon beim "Set up the CRM Service" bekomm ich schon einen Fehler:


Error	1	'Angebot.CrmService' is a 'namespace' but is used like a 'type'	C:\develop\Angebot\Angebot\F_Suche.cs	22	13	Angebot

den rest versteh ich auch nicht. wie muss das form aussehen, welche elemente müssen drauf und wie funktioniert dann der code???

**"Niemand wird je mehr als 640KB RAM benötigen!" **

Bill Gates, 1981

664 Beiträge seit 2005
vor 15 Jahren

Abgesehen davon, dass die zwei Wege in der SDK gut dokumentiert sind, scheinen dir ein paar Grundlagen zu fehlen: [Hinweis] Bitte schau in die SDK-/MSDN-Doku und [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen)

M
marv100 Themenstarter:in
227 Beiträge seit 2008
vor 15 Jahren

hab mir das nun mal genau angeschaut und versucht mit dem fetchXML die daten auszulesen.
also ich bekomme die abfrage in einem stringgeliefert.
ich bin nur zu doof um die abfrage einzugrenzen.
meins sieht momentan wie folgt aus:


// Set up the CRM Service.
            CrmService service = new CrmService();
            service.Credentials = System.Net.CredentialCache.DefaultCredentials;

            //// Retrieve all accounts.
            //string fetch1 = "<fetch mapping='logical'>";
            //fetch1 += "<entity name='account'><all-attributes/>";
            //fetch1 += "</entity></fetch>";

            //// Fetch the results.
            //String result1 = service.Fetch(fetch1);

            // Retrieve all accounts where the last name is not Cannon.
            string fetch2 = @"
                              <fetch mapping='logical'>
                                <entity name='account'>
                                    <attribute name='accountid'/>
                                    <attribute name='name'/>
                                        <filter type='and'>
                                            <condition attribute='name' operator='like' value='%musik%' />
                                        </filter>
                                </entity>
                              </fetch>
                              ";

            // Fetch the results.
            String result2 = service.Fetch(fetch2);

möchte aber andere werte ausgegeben haben, so wie in dieser sql-abfrage:


                String lSelect = "";
                lSelect += " SELECT AccountBase.Name, ContactBase.FullName, CustomerAddressBase.Line1, CustomerAddressBase.PostalCode, CustomerAddressBase.City ";
                lSelect += " FROM AccountBase, CustomerAddressBase, ContactBase";
                lSelect += " WHERE AccountBase.Name LIKE '%" + I_Name.Text + "%'";
                lSelect += " AND CustomerAddressBase.ParentId = AccountBase.PrimaryContactId";
                lSelect += " AND AccountBase.PrimaryContactId = ContactBase.ContactID";
                lSelect += " AND CustomerAddressBase.Line1 != ''";
                lSelect += " AND CustomerAddressBase.PostalCode != ''";
                lSelect += " AND CustomerAddressBase.City != ''";

wie bekomm ich das hin?

**"Niemand wird je mehr als 640KB RAM benötigen!" **

Bill Gates, 1981

664 Beiträge seit 2005
vor 15 Jahren

Wenn dir FetchXml nicht aus den Fingern gleitet 👅 , kannst du die Abfrage mit den stunnware-Tools zusammenbauen -> http://stunnware.com/products/tools4/downloads/SwTools4.2.15.zip

Um Daten von mehrern Entitäten abzufragen musst du link-entity verwenden (Pendant zu einem Join).
Die SQL-Abfrage die du gepostet hast ist von Microsoft übrigens nicht supported. Technisch ist es zwar möglich, aber du spartst dir viel Handarbeit wenn du mit den FilteredViews arbeitest.

Was soll die Abfrage eigentlich bezwecken? Ich hab das Gefühl dass dein Problem einfacher zu lösen ist.

M
marv100 Themenstarter:in
227 Beiträge seit 2008
vor 15 Jahren

ich habe im CRM eine Liste mit Kunden.
Nun möchte ich ein Programm schreiben, wo ich nach einem Kunden suche und von dem die Adresse rausbekommen um mit dieser weiter im Programm arbeiten zu können.

**"Niemand wird je mehr als 640KB RAM benötigen!" **

Bill Gates, 1981

M
marv100 Themenstarter:in
227 Beiträge seit 2008
vor 15 Jahren

habe jetzt folgendes im netz gefunden:


            // Set up the CRM Service.
            CrmService service = new CrmService();
            service.Credentials = System.Net.CredentialCache.DefaultCredentials;

            // Create the query object.
            QueryByAttribute query = new QueryByAttribute();
            query.ColumnSet = new AllColumns();
            query.EntityName = EntityName.account.ToString();

            // The query will retrieve all accounts whose address1_city is Sammamish.
            query.Attributes = new string[] { "name" };            
            query.Values = new string[] { "Musik" };

            // Execute the retrieval.
            BusinessEntityCollection retrieved = service.RetrieveMultiple(query);

3 fragen habe ich dazu noch.

  • wie bekomme ich beim query.values das hin, dass nicht nach musik sondern nach musik oder %musik% gesucht wird?
  • wie krieg ich die gefundenen Werte in ein datagrid?
  • was muss ich tun, damit er mir nur den namen und die adresse in das datagrid schreibt?

**"Niemand wird je mehr als 640KB RAM benötigen!" **

Bill Gates, 1981

664 Beiträge seit 2005
vor 15 Jahren

Solange du nicht versuchst das Thema zu verstehen, wird das nichts...

--> string.Format(), ColumnSet, ...

Siehe [Hinweis] Wie poste ich richtig? Punkt 1.1.1, 4, ...

M
marv100 Themenstarter:in
227 Beiträge seit 2008
vor 14 Jahren

Eine Frage habe ich noch zu diesem Thema.

Ich habe es jetzt wie folgt gelöst:


                // Set up the CRM Service.
                CrmService service = new CrmService();
                service.Credentials = System.Net.CredentialCache.DefaultCredentials;

                string fetch = "";
                fetch += "   <fetch mapping='logical'>";
                fetch += "     <entity name='account'>";
                fetch += "         <attribute name='name'/>";
                fetch += "         <attribute name='address1_line1'/>";
                fetch += "         <attribute name='address1_postalcode'/>";
                fetch += "         <attribute name='address1_city'/>";
                fetch += "         <attribute name='websiteurl'/>";
                fetch += "         <attribute name='emailaddress1'/>";
                fetch += "         <attribute name='telephone1'/>";
                fetch += "         <attribute name='fax'/>";
                fetch += "	       <attribute name='CFSesVerkehrsnummer'/>";
                fetch += "         <link-entity name='contact' from='accountid' to='accountid'>";
                fetch += "              <attribute name='firstname'/>";
                fetch += "              <attribute name='lastname'/>";
                fetch += "         </link-entity>";
                fetch += "           <filter type='and'>";
                fetch += "               <condition attribute='name' operator='like' value='%" + I_Nachname.Text.ToString() + "%' />";
                fetch += "           </filter>";
                fetch += "         <order attribute='name'/>";
                fetch += "     </entity>";
                fetch += "   </fetch>";

                // Fetch the results.
                String result = service.Fetch(fetch);

                byte[] MyData;
                MyData = System.Text.Encoding.GetEncoding(1252).GetBytes(result);
                MemoryStream ms = new MemoryStream();
                ms.Write(MyData, 0, MyData.Length);
                FileStream output = File.OpenWrite(@"C:\Angebot\Vorlagen\result.xml");
                ms.WriteTo(output);
                output.Flush();
                output.Close();
                ms.Close();

                XmlDataDocument xmlDoc = new XmlDataDocument();
                xmlDoc.DataSet.ReadXml(@"C:\Angebot\Vorlagen\result.xml");
                DataSet ds = new DataSet("result");
                ds = xmlDoc.DataSet;

                dataGridView1.DataSource = ds.DefaultViewManager;
                dataGridView1.DataMember = "result";


Mein Problem ist es, wenn bei einem Eintrag nicht alle Felder ausgefüllt sind, lässt er die einfach weg. Kann ich dies verhindern?

**"Niemand wird je mehr als 640KB RAM benötigen!" **

Bill Gates, 1981

664 Beiträge seit 2005
vor 14 Jahren

Nein, alle Attribute die Null sind werden per FetchXML nicht ausgegeben.

Btw. wieso schreibst du die Antwort auf Platte um sie direkt danach wieder zu laden?!