计算给定时期内每天的开放票证 - Crystal Reports 11.0.0.895

时间:2017-06-20 21:30:42

标签: crystal-reports

我的任务是创建一个报告,该报告在过去365天内每天计算开放服务票证。如果没有完成日期,或者完成日期大于评估日期且创建日期小于或等于评估日期,则票证在任何给定日期被分类为未结。我的问题是我没有在报告中分组的日期字段,因为我无法对创建或解决的日期字段进行分组,因为我正在计算打开的故障单,并且可能在指定的日期没有创建或完成故障单。

我已经尝试创建一个命令,该命令每天列出,然后将其添加到报告中,没有连接,这当然会创建一个笛卡尔积,但这会使报告更快并且需要长时间运行。如何在给定时间段(在本例中为最后365天)中为每天创建一个组,我可以在其中放置公式来计算打开的票证?

是否有解决此问题的方法,任何帮助都非常感谢。我使用的是Crystal报告版本11.0.0.895

1 个答案:

答案 0 :(得分:0)

这是您最好在数据库(或Crystal Reports中的查询/命令)中解决的任务。作为草图:

  1. 您想要查看的每一天都有一行(可能使用date table
  2. 对于该表中的每一天,选择符合条件的票证号码(count
  3. 这样,您将拥有一个始终包含365行的结果集,因此报表中不会出现任何问题。如果当天没有门票,则某些行可能包含0。

    以下是一个例子。它使用日期表。它显示了将票证信息提供给指定日期的两种方法:

    • 一个子选择:这提供了每个日期打开的票数,不多也不少
    • 加入日期的门票。使用这种方式,您的结果集中可以使用所有票证信息。计数和分组可以在SQL或报告中完成(按严重性,指定用户分组打开故障单......)

    查看where / join条件(opened <= adate(closed is null or closed >= adate))是否完全代表您的需求(如果当天关闭的机票被视为当天未结,将是一张机票在同一天打开和关闭算作开放,......

    create table #dates (adate date);
    insert into #dates (adate) values 
    ('2017-06-23'),
    ('2017-06-22'),
    ('2017-06-21'),
    ('2017-06-20'),
    ('2017-06-19')
    
    
    create table #tickets (id int, opened date, closed date);
    insert into #tickets (id, opened, closed) values
    (1, '20170620', null),
    (2, '20170620', '20170622'),
    (3, '20170621', '20170622'),
    (4, '20170624', null)
    
    -- just the open tickets per day
    select 
        adate 
        ,(select count(id) from #tickets where opened <= adate and (closed is null or closed >= adate)) open_tickets
    from #dates
    left outer join #tickets on opened <= adate and (closed is null or closed >= adate)
    
    -- tickets joined to date, all ticket information available
    select 
        adate 
        ,#tickets.*
    from #dates
    left outer join #tickets on opened <= adate and (closed is null or closed >= adate)
    
    drop table #tickets
    drop table #dates