多个表上的左外连接使用选择专家Crystal Reports隐藏数据

时间:2013-03-26 00:21:39

标签: crystal-reports outer-join multiple-tables

我在报告一对多关系中的两个表时遇到水晶报告的问题。


示例表:

dbo.stock

Barcode   Qty   
12345     3     
11111     5     
22222     6     

dbo.sales

Barcode    SalesDate    QtySold<br/>
12345      1/1/2013     1          
12345      1/1/2012     1
12345      1/1/2010     1
11111      1/1/2000     1

表格通过

链接
dbo.stock Left Outer Join On dbo.sales             

报告配置:

Group 1 Header |
Sales          |Sales.barcode Sales.QtySold
Group 1 Footer |Group(Barcode) Sum(QtySold) Stock.Qty

问题: 展示销售&amp;库存(没有销售日期限制)

Barcode    Sold    OnHand
12345      3       3
11111      1       5
22222              6

但是,当选择数据范围时,输出将删除销售超出所选数据范围的有效产品。说1/1/2012 - 2013年1月1日

Barcode    Sold    OnHand
12345      2       3
22222              6

我有一个使用子报告的版本,但是当每个行的子报告运行时,开销很大。

能想到解决这个问题的方法吗? (不使用子报告)

谢谢B


系统说明:
水晶8.5 通过ODBC驱动程序访问数据库.dbf文件

3 个答案:

答案 0 :(得分:2)

问题在于,即使您正在进行左外连接,也要在右侧表中选择日期范围,这有效地使其成为内连接。如果您的记录选择公式中有{Sales.SalesDate}={?DateParameter}之类的内容,请将其删除。

相反,请使用isnull({Sales.SalesDate}) or {Sales.SalesDate}<>{?DateParameter}取消详细信息部分,以便只在报告中显示所需日期的销售额。要处理“组页脚”中的“已售出数量”,请仅对您日期范围内的记录使用“运行总计”而不是直接求和。

答案 1 :(得分:1)

所以您想要所有条形码信息,但只需要与日期范围一致的销售额?

详细尝试这个公式 如果dbo.sales.SalesDate在{?daterange}中,那么{dbo.sales.QtySold}否则为0

将摘要插入组页脚

注意:您可能需要在公式编辑器或帐户中切换到Null的默认值,以获取公式中的NULL值

答案 2 :(得分:0)

当您想要在水晶报表中连接两个表时,使用左外连接,同时希望根据右表过滤报表,例如sales.SalesDate&GT; =&#39; 1-JAN-2014&#39;联接将转换为equi join 解决一些人建议使用的问题 (ISNULL(sales.SalesDate)或sales.SalesDate&gt; =&#39; 1-JAN-2014&#39;)

上述解决方案仅适用于库存销售为0并且您仍希望显示这些库存的情况,但如果某些库存的销售额超过0并且销售日期为“开启”或者“在2013年12月31日之前”# 39 ;.在这种情况下,ISNULL(sales.SalesDate)将无效。要解决此类问题,您需要添加命令对象或为sales表创建视图,如下所示

  1. 使用以下sql创建命令对象       选择stock.Barcode,sales.Salesdate       库存左边的外部连接订单.Barcode = order.Barcode和sales.SalesDate&gt; =&#39; 1-JAN-2014&#39;

  2. 第二个解决方案是为销售创建一个视图  创建或替换视图view_Sales为  从销售中选择* sales.SalesDate&gt; =&#39; 1-JAN-2014&#39; 然后使用报表中的视图而不是订单表作为右表。