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
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
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
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)
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
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.
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
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.
**"Niemand wird je mehr als 640KB RAM benötigen!" **
Bill Gates, 1981
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, ...
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
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?!