none
Bericht: komplizierte sql query mit connections etc.

    问题

  • 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.  

    • 已编辑 pe.bo 2012年1月18日 14:20
    2012年1月18日 14:19

答案

  • 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

    • 已标记为答案 pe.bo 2012年10月12日 20:36
    2012年1月19日 18:03

全部回复

  • 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
    2012年1月19日 7:43
  • 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

    2012年1月19日 8:36
  • 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
    2012年1月19日 9:19
  • 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 ... 

    • 已编辑 pe.bo 2012年1月19日 13:13
    2012年1月19日 13:10
  • 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

    • 已标记为答案 pe.bo 2012年10月12日 20:36
    2012年1月19日 18:03
  • 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ürgen


    Jü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

    2012年2月18日 10:51