我使用SQL Anywhere作为我的数据库和Crystal Report用于报告目的。
我有两个表SALES DETAIL (POSDETAIL)
和Inventory Adjusted table (AdjustInventory)
,并创建和查询以显示销售和浪费/调整后的查询。
输出应该是这样的
Product SalesQty Value WastageQty Value
------------------------------------------------
Sales Qty
将来自POSDETAIL
表,而WastageQty
将来自AdjustInventory
POSDETAIL
共有435625条记录,AdjustInventory
共有183528条记录。
我设计了下面的存储过程,它根据需要为我提供了完美的输出,并且在查询分析器中运行速度非常快,但在使用此存储过程的Crystal Reports上变得非常慢,在报告上显示数据需要大约15到25分钟任何日期范围。
Create PROCEDURE MyDatabaseTest.ReportUser.sp_SalesWastage ()
BEGIN
DECLARE LOCAL TEMPORARY TABLE tblSumWastage (ProductId integer,TIMEORD date,WastedQty integer);
delete from tblSumWastage;
insert into tblSumWastage
select
DBA.AdjustInventory.INVENNUM as ProductId,
DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd') as OrderDate,
SUM(AdjustInventory.ADJUSTUNITS) as WastedQty
from
DBA.POSDETAIL
join
DBA.AdjustInventory on DBA.POSDETAIL.PRODNUM = DBA.AdjustInventory.INVENNUM
and DBA.AdjustInventory.AdjustType = 9
and AdjustInventory.ADJUSTUNITS > 0
and DATEFORMAT(DBA.AdjustInventory.AdjustTime,'yyyy/mm/dd') = DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd')
group by
DBA.AdjustInventory.INVENNUM, DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd');
select
p.OrderDate, p.ProductId, p.SalesQty,
f.WastedQty / p.SalesQty as WastedQty,
p.EachCost
from
(select
POSDETAIL.PRODNUM as ProductId,
DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd') as OrderDate,
POSDETAIL.COSTEACH as EachCost,
SUM(POSDETAIL.QUAN) as SalesQty
from
DBA.POSDETAIL
group by
DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd'),
POSDETAIL.PRODNUM,POSDETAIL.COSTEACH
) as p (ProductId, OrderDate, EachCost, SalesQty)
inner join
(select * from tblSumWastage) as f (ProductId, OrderDate, WastedQty)
on p.ProductId = f.ProductId and p.OrderDate = f.OrderDate;
END
答案 0 :(得分:1)
缓慢可能在Crystal报告中而不是在存储过程中。例如,如果存储过程返回大量记录,并在记录选择公式中过滤它们。另一个可能的原因可能是,如果您在报告中添加了另一个表,其中包含存储过程的结果。如果报告看起来没问题,那么您可以检查驱动程序并使用不同的连接类型 - OLE DB,ODBC ...我不知道SQL Anywhere究竟可用的是什么。 有没有机会在子报表中进行多次调用?