如何在Crystal Reports中过滤和分组后访问所有数据?

时间:2016-06-23 22:06:49

标签: crystal-reports

我有从服务器获得的这些数据行,看起来像这样:

CurrentDate ////工程师//// LineNumber //// RepairDate
23-6-2016 ------------ --------------- 1 1 ------------ 23-6- 2016年 23-6-2016 ------------ --------------- 1 2 ------------ 23-6- 2016年 23-6-2016 ------------ --------------- 1 3 ------------ 22-6- 2016年 23-6-2016 ------------ --------------- 1 2 ------------ 20-6- 2016年 23-6-2016 ------------ --------------- 2 7 ------------ 23-6- 2016年 23-6-2016 ------------ --------------- 2 3 ------------ 19-6- 2016年 23-6-2016 ------------ --------------- 2 2 ------------ 17-6- 2016年 23-6-2016 ------------ --------------- 5 8 ------------ 23-6- 2016年 23-6-2016 ------------ --------------- 5 1 ------------ 18-6- 2016年

现在,我想要实现的目标是,按工程师分组,然后显示在当前日期修复的行号,这些号码也应该分组,并显示它具有的维修历史,以及在那个日期修理它的工程师。

应该看起来像这样:

当前日期:2016年6月23日至11日 ENGINNER
1
在当前日期修复的行:
-1
由Eng.5于2016年6月18日修复 -2
由Eng.1于2016年6月20日修复 由Eng.5于2016年6月18日修复 由Eng.2于2016年6月17日修复
ENGINNER
2
在当前日期修复的行:
-7

ENGINNER
5
在当前日期修复的行:
-8

对于我所看到的,我有两个问题,首先,通过分组,我丢失了在打印时我当前没有分组的详细信息部分中的所有工程师数据,另一方面,如果我使用组过滤行公式只获取当前日期的数据,然后我也丢失了详细信息部分中的所有其他日期......

我尝试过的是在标题组中过滤,只过滤当前日期的行,但过滤其他行,我无法获得LineNumbers的历史记录。如果我按工程师分组,也会发生同样的情况。 ..我在这里很新,我似乎无法解决问题......

2 个答案:

答案 0 :(得分:1)

有几种方法,但最简洁的方法是在亚麻布上将LinesRepaired表连接到自身。我已经附加了原始SQL来执行此操作。您也可以跳过SQL并按照以下步骤在Crystal中执行:

  1. 左边在L.linenumber = L_1.linenumber
  2. 上加入表格
  3. 过滤其中L.repairdate = L.CurrentDate(考虑使currentdate为Crystal参数)
  4. 由L.engineer分组,然后由L.linenumber
  5. 分组
  6. 将L_1.Engineer和L_1.repairdate添加到详细信息
  7. 如果L.engineer = L_1.engineer AND L.repairdate = L_1.repairdate(因为这是当前的修复,不应该在历史记录中显示),请取消详细信息

    create table LinesRepaired (CurrentDate varchar(10), Engineer int, LineNumber int, RepairDate varchar(10))
    insert into LinesRepaired Values('23-6-2016',1,1,'23-6-2016') 
    insert into LinesRepaired Values('23-6-2016',1,2,'23-6-2016') 
    insert into LinesRepaired Values('23-6-2016',1,3,'22-6-2016') 
    insert into LinesRepaired Values('23-6-2016',1,2,'20-6-2016') 
    insert into LinesRepaired Values('23-6-2016',2,7,'23-6-2016') 
    insert into LinesRepaired Values('23-6-2016',2,3,'19-6-2016') 
    insert into LinesRepaired Values('23-6-2016',2,2,'17-6-2016') 
    insert into LinesRepaired Values('23-6-2016',5,8,'23-6-2016') 
    insert into LinesRepaired Values('23-6-2016',5,1,'18-6-2016') 
    
    select  *
    from    LinesRepaired l
            left join LinesRepaired l2 on l.linenumber = l2.LineNumber and convert(varchar,l.engineer)+'-'+l.RepairDate <> convert(varchar,l2.engineer)+'-'+l2.RepairDate
    where   l.RepairDate = '23-6-2016'
    order by 2,3
    

答案 1 :(得分:0)

我找到了一个解决方法,不是通过Crystal Reports强硬,而是通过编程使用应用程序和身份......例如:


CurrentDate ////工程师//// LineNumber //// RepairDate /// DateAPL /// EngineerAPL ///
23-6-2016 ------------ --------------- 1 2 ------------ 23-6- 2016 ---- 23-6-2016 --------- 1 -----&gt;&gt;身份&lt;&lt;
以及他们各自的申请:
23-6-2016 ------------ --------------- 1 2 ------------ 23-6- 2016 ---- 20-6-2016 --------- 1 -----
23-6-2016 ------------ --------------- 1 2 ------------ 23-6- 2016 ---- 18-6-2016 --------- 5 -----
23-6-2016 ------------ --------------- 1 2 ------------ 23-6- 2016 ---- 17-6-2016 --------- 2 -----

所以,当我开始分析水晶报告时,我不会丢失关键信息。然后我只需按日期 - >工程师 - > LineNumber进行分组,在详细信息部分中,它将显示对该线路进行的所有维修。

在代码部分,我使用从数据库获取的数据表(我目前正在使用vbnet)

- 过滤数据行中的所有工程师:
对于每个工程师

- 使用currentdate

过滤所有工程师行

对于当前日期的每一行

对于未过滤的所有数据中的每一行
if currentEngineerLineNumber = alldata.LineNumber和alldata.date&lt;&gt; currentDate
将应用程序数据(工程师和日期)添加到一个全新的表格中 否则
是标识,在该全新表中添加一行标识。