1

学生の成績を表示しています。彼らは下の年(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
4

2 に答える 2

2

すべての "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;
于 2013-01-09T21:44:56.610 に答える
1

** 編集 **

暗黙の質問に対するより良い解決策は、コードフィールドで論理テーブルをそれ自体に結合することです。

-- 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"
于 2013-01-09T18:39:48.680 に答える