1

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


示例表:

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

问题:显示销售和库存(无销售日期限制)

Barcode    Sold    OnHand
12345      3       3
11111      1       5
22222              6

But when a data range is selected then output removes valid products with sales outside the selected data range. 说 2012 年 1 月 1 日 - 2013 年 1 月 1 日

Barcode    Sold    OnHand
12345      2       3
22222              6

我有一个使用子报表的版本,但是开销太大了,因为子报表为每一行运行。

可以想办法解决这个问题吗?(不使用子报告)

谢谢乙


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

4

3 回答 3

2

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

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

于 2013-03-26T02:25:11.470 回答
1

所以你想要所有的条形码信息,但只想要日期范围内的销售额?

如果 dbo.sales.SalesDate 在 {?daterange} 然后 {dbo.sales.QtySold} 其他 0,请详细尝试这个公式

将摘要插入组页脚

注意:您可能需要在公式编辑器中切换到 Null 的默认值或在公式中考虑 NULL 值

于 2013-03-26T01:41:33.547 回答
0

当您想在水晶报表中加入两个表并使用左连接同时想要基于右表过滤报表时,例如 sales.SalesDate>='1-JAN-2014' 连接将转换为等连接来解决有些人建议使用的问题 (ISNULL(sales.SalesDate) OR sales.SalesDate>='1-JAN-2014')

上述解决方案仅适用于库存销售量为 0 并且您仍想显示这些库存但如果某些库存的销售量超过 0 并且销售日期为 ON 或“2013 年 12 月 31 日”之前怎么办。在这种情况下 ISNULL(sales.SalesDate) 将不起作用。要解决此类问题,您需要添加命令对象或为销售表创建视图,如下所示

  1. 使用以下 sql 创建命令对象 Select stock.Barcode, sales.Salesdate from stock left outer join order on stock.Barcode=order.Barcode and sales.SalesDate>='1-JAN-2014'

  2. 第二种解决方案是为销售创建一个视图,创建或替换视图 view_Sales 作为 Select * from sales where sales.SalesDate>='1-JAN-2014' 然后使用报表中的视图而不是订单表作为右表。

于 2015-02-05T15:02:02.457 回答