Crystal Reports:需要有关如何避免使用子报表的建议

时间:2010-07-27 15:30:40

标签: crystal-reports

我正在尝试编写一个报告来访问一个非常大的数据库,这使得使用子报告......至少可以说是令人不快的。在这种情况下如何避免它们:

我从患者就诊表开始。每次访问都可以有多个重要的读数(在'Vitals'表中与访问表多对一说)我想要每种类型的最小值和最大值。因此,为了实现这一点,我按患者访问进行分组,然后使用公式计算最小值/最大值并将其显示在组页脚中。到现在为止还挺好。但是,还有另一个表Orders,它包含该访问的所有订单,其中我还想选择一些最小/最大值来显示该遭遇。

为了使用子报表,我在抑制的细节中添加了一些公式,这些公式也找到了这些订单值的最小值/最大值并显示在组页脚中。问题是Crystal只返回有订单的患者访问(尽管是外部加入的),我需要的是所有访问的列表,可能有也可能没有任何订单。更复杂的是,还有另一个Orders表我也需要这样做(一个用于药物,一个用于程序)。有什么想法吗?

(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:
|   ...
+-----------------------------------------------

1 个答案:

答案 0 :(得分:1)

您需要展平我建议从查询开始的数据集

像这样的东西。请注意,您基本上使用union来分别查询Detail表中的每个连接。完成时,您可以按记录类型分组并为记录类型组创建多个部分(4个部分)每个部分都将具有抑制条件(示例Vitals部分将在RecordType<> Vitals时禁用。)现在基本上您已创建组子报告。

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