【问题标题】:accessing previous record fields in crystal reports访问水晶报表中的先前记录字段
【发布时间】:2013-01-09 16:38:58
【问题描述】:

我正在显示学生记录的成绩。他们坐在低年级(AS ...),然后选择继续某些课程到高年级(A ...)。这意味着我对每个学生都有以下数据集:

+----------------------+-------+-----------+-----+
|            Name      | Grade |    End    | Code|
+----------------------+-------+-----------+-----+
| A Business           | C     | 06-Jul-12 | BUS |
| A English            | B     | 06-Jul-12 | ELL |
| A History            | C     | 06-Jul-12 | HIS |
| AS Business Studies  | E     | 08-Jul-11 | BUS |
| AS Critical Thinking | B     | 08-Jul-11 | CRT | <-- lower year only
| AS English           | D     | 08-Jul-11 | ELL |
| AS History           | F     | 08-Jul-11 | HIS |
+----------------------+-------+-----------+-----+

对于每个学生记录,我只想显示 A 和 AS 级别的成绩。在上面的例子中,这会抑制 AS 批判性思维:

A Business           | C
A English            | B
A History            | C
AS Business Studies  | E
AS English           | D
AS History           | F

在不编辑基础数据集的情况下,Crystal Reports 是否可以隐藏那些仅显示为 AS 成绩的记录?例如:

If Code not present in records AND Name starts with AS
  Suppress
Else
  Display

【问题讨论】:

  • 你关心订单吗?按课程代码分组是最容易的,但您的报告将不再按班级名称排序。
  • 抱歉,我想补充的是,每个学生都有这些记录列表之一。我会尽量让问题更清楚一点
  • 对,但是每个学生的课程显示顺序对您来说重要吗?
  • A 课程后跟 AS 课程会很棒。但如果他们不是,那也不算是一场噩梦

标签: crystal-reports crystal-reports-2010


【解决方案1】:

假设所有的“A”值都在“AS”值之前出现,我会使用一个数组来存储目前找到的代码。

首先,初始化数组,这可以在报告标题中,或者如果结果按学生分组,则在学生组标题中。

WhilePrintingRecords;
Global StringVar Array CodesFound;

Redim CodesFound[1];

CodesFound[1] := "";

//print nothing
"";

然后,更新详细信息中的列表

WhilePrintingRecords;
Global StringVar Array CodesFound;

If Left({table.Name},2) = "A "
    Then (
        If CodesFound[1] = ""
            Then (
                CodesFound[1] := {table.Code};
            )
            Else (
            Redim Preserve CodesFound[UBound(CodesFound) + 1];
        CodesFound[UBound(CodesFound)] := {table.Code};
        );
    );
//print nothing
"";

最后,在条件抑制部分:

WhilePrintingRecords;
Global StringVar Array CodesFound;
Local BooleanVar found := false;
Local NumberVar i;

If Left({table.name},2) = "AS"
    Then (
        For i := 1 to UBound(CodesFound) do (
            If CodesFound[i] = {table.Code}
                Then found := true;
        );
        //suppress if not found
        Not(found);
    )
    Else
       //Not an "AS", don't suppress
        false;

【讨论】:

    【解决方案2】:

    ** 编辑 **

    对于隐含问题,我更好的解决方案是在 Code 字段中将逻辑表连接到自身:

    -- Oracle syntax
    WITH
    
    V AS (
      SELECT Name, Grade, End_Date, Code
      FROM   ...
    )
    
    SELECT *
    FROM   V
    INNER JOIN V V2 ON V.Code=V2.Code
      AND SUBSTR(V2.Name,1,2)='A '
    

    如有必要:

    在详细信息部分添加条件抑制公式:

    IsNull({table.Code}) AND Left({table.Name},2)="AS"
    

    【讨论】:

    • 如果它本身就回答了问题的最后一部分,但这并不是 OP 真正想要的。他/她希望不显示“AS 批判性思维”行,因为批判性思维代码(“CRT”)没有“A”行。
    • 您的解释似乎是正确的,但 OP 的问题与此完全不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多