Crystal Report上的存储过程非常慢

时间:2013-12-31 05:20:06

标签: sql stored-procedures crystal-reports

我使用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

1 个答案:

答案 0 :(得分:1)

缓慢可能在Crystal报告中而不是在存储过程中。例如,如果存储过程返回大量记录,并在记录选择公式中过滤它们。另一个可能的原因可能是,如果您在报告中添加了另一个表,其中包含存储过程的结果。如果报告看起来没问题,那么您可以检查驱动程序并使用不同的连接类型 - OLE DB,ODBC ...我不知道SQL Anywhere究竟可用的是什么。 有没有机会在子报表中进行多次调用?