2010-07-27 4 views
1

J'essaie d'écrire un rapport pour atteindre une très grande base de données, ce qui rend l'utilisation de sous-rapports ... désagréable pour le moins. Comment puis-je les éviter dans cette situation:Crystal Reports: Besoin de conseils sur la façon d'éviter l'utilisation de sous-rapports

Je pars d'un tableau des visites de patients. Chaque visite peut avoir plusieurs lectures vitales (Dites dans une table 'Vitals' qui est plusieurs-à-un avec la table de visite) dont je veux le min et max de chaque type. Pour ce faire, je grouperai par patient les visites, puis j'utiliserai des formules pour calculer les min/max et les afficher dans le pied de page du groupe. Jusqu'ici tout va bien. Cependant, il y a une autre table, Orders, qui contient toutes les commandes pour cette visite, dont je veux aussi sélectionner quelques valeurs min/max à afficher pour la rencontre.

Pour contourner un sous-rapport, j'ai ajouté d'autres formules aux détails supprimés qui trouvent également les valeurs min/max de ces valeurs de commande et qui s'affichent dans le pied de groupe. Le problème est que Crystal ne renvoie que les visites de patients qui ont des commandes (même si elles sont externes), et j'ai besoin d'une liste de TOUTES les visites qui peuvent ou non avoir des ordres quelconques. Pour compliquer les choses plus loin, il y a encore une autre table d'ordres que j'ai besoin de faire ceci aussi (une pour des médicaments et une pour des procédures). Des idées?

(visitID, patName, visitDate) 
------------------------------------------------------------------ 
1, Patient A, July-24-2009 
2, Patient B, July-25-2009 

(visitID, line, medName, dosage) 
------------------------------------------------------------------ 
1, 1, Aspirin, 200mg 
1, 2, Aspirin, 500mg 
2, 1, Codeine, 100mg 
2, 2, Codeine, 200mg 
2, 3, ValerianCap, 700mg 

(visitID, line, procName, procType, cost) 
------------------------------------------------------------------ 
1, 1, Xray-wrist, xray, $500 
1, 2, Xray-elbow, xray, $300 

+----------------------------------------------- 
| Patient A 
| Med Orders: 
|  Max Aspirin Dosage: 500mg 
| 
|  Proc. Orders: 
|  Max cost Xray: $500 
| 
+----------------------------------------------- 
| Patient B 
| Med Orders: 
| ... 
+-----------------------------------------------

Répondre

1

Vous devez aplatir votre ensemble de données que je suggère à commencer par la requête

Quelque chose comme ça. Notez fondamentalement que vous utilisez union pour interroger séparément chacune des jointures dans les tables Detail. Une fois terminé, vous pouvez regrouper par type d'enregistrement et faire plusieurs sections pour le groupe Type d'enregistrement (4 sections) Chaque section aura une condition de suppression (Exemple La section Vitals supprimera quand RecordType <> Vitals.) Maintenant, vous avez créé des groupes plutôt que des sous-rapports. .

SELECT 
    'Vitals' As RecordType, 
    Vitals.*, 
    --Fields For Orders, 
    --Fields For Medications, 
    --Fields For Procedures 
FROM Visits 
LEFT JOIN Vitals ON Vitals.VisitId = Visits.VisitId 
UNION ALL 
SELECT 
    'Orders' As RecordType, 
    --Fields for Vitals, 
    Orders.*, 
    --Fields For Medications, 
    --Fields For Procedures 
FROM Visits 
LEFT JOIN Orders ON Orders.VisitId = Visits.VisitId 
UNION ALL 
SELECT 
    'Medications' As RecordType, 
    --Fields for Vitals, 
    --Fields For Orders, 
    Medications.*, 
    --Fields For Procedures 
FROM Visits 
LEFT JOIN Medications ON Medications.VisitId = Visits.VisitId 
UNION ALL 
SELECT 
    'Procedures' As RecordType, 
    --Fields For Vitals, 
    --Fields For Orders, 
    --Fields For Medications, 
    Procedures.* 
FROM Visits 
LEFT JOIN Procedures ON Procedures.VisitId = Visits.VisitId 
+0

On dirait que ça va faire l'affaire. J'ai créé une commande SQL qui prend en charge la plus grande partie de la logique et le rapport s'exécute beaucoup plus rapidement qu'avec les sous-états. – Ryan