Bericht: komplizierte sql query mit connections etc.
-
18. januar 2012 14:19
Hallo alle,
ich bräuchte bei ner sql query für einen Bericht für crm2011 mal dringend Hilfe damit ich hier weiterkomme.
Ziel:
Verschiedene UIDs aus verschiedenen Entitäten holen (in der query).
Bsp:
Ehefrau zu einem Kontakt über Verbindungen (connections) holen.
Hier müsste ich einen join von kontakt zu connection machen (Bedingung UID Kontakt hat eine bestimmte Verbindung (Ehepartner). Wenn ja dann die UID des Verbundenen (Ehepartners) holen.Was ich da sql mässig nicht checke ist: Ich habe ja gar keine Felder wie z.B. fullname, sondern muss ein neues feld erstellen, was es im Kontakt als Feld gar nicht gibt. Ich weiss zwar wie man berechnete Felder erstellt --> new_menge * new_preis) as summe)
aber nicht, wie man ein neues Feld aus einer (Unter-?)Abfrage erstellt, also ob das geht .. und falls es nicht geht, wie ich das dann hinbekomme.Ausserdem habe ich noch ähnliche Fälle, bei denen es auch mehrere UIDs sein könnten, die aus den Verbindungen geholt werden sollen (z.B. Kinder des Kontakts, sowie Alternativ des Ehepartners).
Wie würde man da vorgehen, ein neues Feld anlegen (... as ehepartner_kinder) und die möglichen werte, als kommaseparierter Wert aus connection holt? .. und falls ja, wie würde ich das dann im Bericht wieder zu nem vollen Datensatz (Name, Anschrift, Geburtsag) hinbekommen? mit split() ???Ich hoffe mir kann jemand helfen, iss sehr dringend.
Danke Gruss, Pit
PS:
Ich habe das auch schon versucht mit mehreren datasets zu lösen, bin da aber leider auch gescheitert. Nun fällt mir im Moment kein weiterer Lösungsansatz ein.- Redigeret af bryce2071 18. januar 2012 14:20
Alle besvarelser
-
19. januar 2012 07:43
Hallo bryce2071!
Warum benutzt du zur Abfrage nicht FetchXml oder QueryExpession?
Im CRM-SDK gibt es eine Beschreibung dazu. http://www.microsoft.com/download/en/details.aspx?id=24004
Ich hoffe das bringt weiter. Andreas(a)Donaubauer.com www.crmfaq.de -
19. januar 2012 08:36
Hallo Herr Donaubauer,
ohh, ich erhalte Antwort von so hoher Stelle. Besten Dank :-)
OK, komischerweise habe ich gerade alle Berichte von fetchXML zu SQL umgestellt, da diverse Dinge nicht funktionierten (z.B. war glaube ich auch bei 5000 Datensätzen Schluss, das ist für unsere Kunden nicht ausreichend) und auch gerade wegen der Möglichkeit auf verschiedene Tabellen und Filteredtables per fetchXML begrenzt zu sein habe ich umgestellt auf SQL.
Man hat soweit ich weiss per fetchXML nicht auf alle SQL Tabellen zugreifen können (diese waren nicht sichtbar).
Ich müsste doch eigentlich nur wissen, wie ich eine sql abfrage so machen kann, dass ich innerhalb einer abfrage ergebnisse erhalte, die ich aus einer zusätzlichen abfrage generiere, also zB. dass ich für den Kontakt in den Verbindungen nachsehe, wer ist sein (ehe-)partner oder Lebensgemeinsachaft. Zusätzlich dann noch für den Kontakt nachsehe, hat er Kinder und welche Kontakt-uids haben diese Kinder (1 oder mehrere), sowie für den eben aus mithilfe der Verbindung ermittelten Partner (Kontakt-uid) auch dessen Kinder.
Sollte das nicht eigentlich relativ einfach mit sql möglich sein? ... und im Prinzip doch einfach nur eine sql-fachfrage sein, also wie ich das mit sql und diversen joins und unterabfragen hinbekomme?
Danke, Gruss pit
-
19. januar 2012 09:19
Hallo bryce2071!
Mit SQL sollte man nicht auf die CRM-Datenbank zugreifen. Dazu gibt es ja den Webservice, der im System oder Benutzerkontext laufen kann.
Über das Rechtesystem wird die Sichtbarkeit für die verschiedenen Benutzer geregelt.Wenn ein Feld leer ist, bekommt man mit FetchXml dieses Feld nicht zurück.
Wenn der Benutzer, in dessen Kontext der Webservice läuft, kein Recht auf die Datensätze hat bekommt man einen Fehler zurück.Um mehr als 5000 Datensätze per FetchXml auszulesen, musst du das Attribut moreresults im resultset auswerten.
Wenn es ungleich 0 ist, erhöhe das Page-Attribut um 1, und führe das Fetch in einer Schleife nochmal aus, bis das Attribut moreresults gleich 0 ist.
Ich hoffe das bringt weiter. Andreas(a)Donaubauer.com www.crmfaq.de- Markeret som svar af JuergenBeckModerator 12. oktober 2012 19:17
- Afmarkeret som svar af bryce2071 12. oktober 2012 20:37
-
19. januar 2012 13:10
Hallo Herr Donaubauer,
danke für Ihre Rückmeldung.
Wenn ich die Filtered-Views nehme bekomme ich doch auch bei sql nur die Datensätze angezeigt, dessen Rechte der Benutzer hat, oder?
Wobei dass mit dem page-attribut / moresults ist mir neu .. man bekommt hierzu aber auch nirgends im internet wirkliche Hilfestellung. Ihre ist die erst die wirklich hilft.
select * from FilteredContact AS CRMAF_FilteredContact
Zusätzlich mit dem AS CRMAF_ kann ich dann noch die im AdvancedFind gemachten Einträge und Selektionen mit in die Abfrage einbinden.Aber dennoch müsste ich unbedingt wissen, wie ich mit sql werte aus anderen Entitäten in ein dataset hole, und diese werte müssen noch an eine Bedingung geknüpft sein (verglichen werden), siehe oben.
Nix für ungut, aber ich habe jetzt in mühsamer Arbeit alle Reports von fetchXML zu sql umgestellt.
Besten Dank.
Gruss Pit
--Ausserdem gab es von Beginn an mit fetchXML Reports Probleme bei dem discovery oder sowas - irgendwas mit mehreren Servern und Lastverteilung, das hat immer zu rs reporting errors geführt und dass man manuell irgendeinen Serice auf dem server immer wieder einschalten musste ...
- Redigeret af bryce2071 19. januar 2012 13:13
-
19. januar 2012 18:03
Hallo Pit,
Du hast absolut recht und es gibt eine Vielzahl von abragen die man mit FetchXML überhaupt nicht ausdrücken kann.
Zum Thema selbst: Was Du tun willst geht am besten indem Du in deiner Abfrage zuerst die ContactIDs in einer Tempären Tabelle sammelst. Du kannst eine Abfrage nach der anderen starten und die ergebnisse in die Temptabel einfügen. Bis du alles zusammen hast. Dann am Ende ein select * from FilteredContact where contactid in (select contactid from #temptable)
So den Rest musst du selbst rausfummeln. Wir verdienen mit solchen Reports unser Geld ;-)
Grüße
Thomas
- Markeret som svar af bryce2071 12. oktober 2012 20:36
-
18. februar 2012 10:51Redaktør
Hallo Pit,
grundsätzlich muss ich ANdreas mit FetchXml recht geben. Man kann sich wirklich mehr als nur die ersten 5000 Datensätze zurückgeben lassen, aber nun mal leider immer nur maximal 5000 auf einmal, was die Sache nicht wirklich einfacher macht. Abgesehen davon, klappt SQL nicht für CRM Online.
Aber gut, bei dir geht es halt erst einmal um SQL. :-)
Ehrlich gesagt verstehe ich aber auch dein Problem nicht wirklich. Du möchtest doch einfach nur den Namen der Ehefrau eines Kontaktes über eine Verbindung holen.
select Name from FilteredConnection where Record1Id = '5CC00A3B-EA4A-E011-A72D-00155D31E925' and Record2RoleIdName = 'Ehefrau'
In "Name" steht der Fullname der Ehefrau, Record1Id ist die ContactId deines Kontaktes und Record2RoleIdName entspricht dem Namen der Rolle.
Wenn du nur die "erste" Ehefrau haben möchtest, kannst du natürlich zur Sicherheit auf ein "TOP 1" hinzufügen.Wenn du wirklich mehrere Ergebnisse hast, bspw. bei Kindern, kannst du in der Visualisierung doch einfach ein zusätzliches DataSet anzeigen lassen.
ALternativ findest du hier zusätzliche Ansätze, wie man hier vorgehen könnte: http://stackoverflow.com/questions/194852/concatenate-many-rows-into-a-single-text-string
Viele Grüße,
JürgenJürgen Beck
Dipl. Kfm./Wirtschaftsinformatik
MVP, MCSD.NET, MCITP DBA, MCDBA, MCSE
Microsoft Certified Business Management Solutions Professional
Microsoft Certified CRM Developer
Microsoft Certified Trainer
ComBeck IT Services & Business Solutions
Microsoft Gold Certified Partner
Microsoft Small Business Specialist
Developing & Supporting Business Applications from small business to big enterprises covering scores of sectors
http://www.combeck.de
- Foreslået som svar af JuergenBeckModerator 18. februar 2012 10:51
- Markeret som svar af JuergenBeckModerator 12. oktober 2012 19:17
- Afmarkeret som svar af bryce2071 12. oktober 2012 20:36