バージョン 4.2.5
 —  ステートメント  —

HISTOGRAM

HISTOGRAM

ALL

[MULTI-FETCH-clause ] [multi-fetch-factor] [IN] [FILE] view-name
(operand1)
  [PASSWORD=operand2]

[IN]

ASCENDING

[SEQUENCE]

DESCENDING
VARIABLE operand3
DYNAMICoperand3
  [VALUE] [FOR] [FIELD] operand4
  [STARTING/ENDING-clause]
  [WHERElogical-condition]
  statement
END-HISTOGRAMストラクチャードモードのみ
[LOOP]レポーティングモードのみ

このドキュメントでは、次のトピックについて説明します。

構文図で使用されている記号については、「構文記号」を参照してください。

関連ステートメント:ACCEPT/REJECT | AT BREAK | AT START OF DATA | AT END OF DATA | BACKOUT TRANSACTION | BEFORE BREAK PROCESSING | DELETE | END TRANSACTION | FIND | GET | GET SAME | GET TRANSACTION DATA | LIMIT | PASSW | PERFORM BREAK PROCESSING | READ | RETRY | STORE | UPDATE

関連機能グループ:「データベースへのアクセスと更新


機能

HISTOGRAM ステートメントは、ディスクリプタ、サブディスクリプタ、またはスーパーディスクリプタとして定義されているデータベースフィールドの値を読むために使用します。 値は Adabas インバーテッドリストまたは VSAM インデックスから直接読み取られます。

HISTOGRAM ステートメントは、処理ループを開始します。ただし、HISTOGRAM ステートメントで定義したフィールド以外のフィールドを参照することはできません。

プログラミングガイド』の「HISTOGRAM ステートメント」も参照してください。

注意:
SQL データベースの場合:HISTOGRAM は特定の列に同じ値を持つ行の数を返します。

Top of page

制限

Top of page

構文説明

オペランド定義テーブル:

オペランド 構文要素 フォーマット ステートメント参照 ダイナミック定義
operand1 C S           N P I   B *             不可
operand2 C S       A                         不可
operand3   S       A                         不可
operand4   S       A   N P I F B D T L       不可 不可

*operand1 のフォーマット B は、4 以下の長さでのみ使用できます。

構文要素の説明:

operand1 / ALL
処理ループの制限:

HISTOGRAM ステートメントで operand 1 を指定することで処理するディスクリプタ値の数は、数値定数(0~4294967295)またはユーザー定義変数(整数値を含む)を指定して制限できます。

ALL は全ディスクリプタ値が処理されるように強調するためにオプションとして指定できます。

このステートメントでは、指定した制限が、LIMIT ステートメントで設定した制限より優先されます。

LT パラメータで、より小さな制限が設定された場合、LT 制限が適用されます。

注意:
4 桁の件数を処理する場合、リーディングゼロを指定します(0nnnn)。これは、Natural が、カッコで囲まれた 4 桁の数をすべてステートメントの参照番号と解釈するためです。 operand1HISTOGRAM ループに入るときに評価されます。 operand1 の値が HISTOGRAM ループ内で変更されても、その値は処理するレコード数に影響を与えません。

MULTI-FETCH-clause 以下の「MULTI-FETCH 節」を参照してください。
view-name

view-name として、DEFINE DATA ステートメント内、またはグローバルデータエリアやローカルデータエリアで定義したビューの名前です。

ビュー内には HISTOGRAM ステートメントで使用するフィールドだけを指定します(operand4)。

ビューのフィールドが、添字範囲付きで定義された PE または MU の場合、その範囲の最初のオカレンスだけが HISTOGRAM ステートメントで参照されます。他のすべてのオカレンスは HISTOGRAM ステートメントの実行には関連しません。

レポーティングモードでは、view-nameDDM の名前にすることもできます。

PASSWORD=operand2
PASSWORD 節:

パスワードで保護された Adabas ファイルを検索する場合は、PASSWORD 節にパスワード(operand2)を指定します。 詳細については、ステートメント FIND および PASSW を参照してください。

SEQUENCE
SEQUENCE 節:

この節は、Adabas、VSAM、SQL データベースに対してだけ使用できます。

この節を使用して、レコードを昇順または降順のどちらで読み取るかを指定できます。

  • デフォルトは昇順です。昇順はキーワード ASCENDING を使用して明示的に指定することもできます。

  • レコードを降順で読み取る場合は、キーワード DESCENDING を指定します。

  • レコードを昇順または降順のどちらで読み取るかを事前に決めずに実行時に決めるには、変数(operand3)の前に VARIABLE キーワードまたは DYNAMIC キーワードを指定します。 operand3 は、フォーマット/長さ A1 で、値 A("昇順")または D("降順")が含まれている必要があります。

    • キーワード VARIABLE が指定された場合、HISTOGRAM 処理ループ開始時に読み込み順(operand3 の値)が評価されます。operand3 フィールドが HISTOGRAM ループ内で変更されるかどうかにかかわらず、ループが終了するまで読み込み順は変更されません。

    • キーワード DYNAMIC が指定された場合、HISTOGRAM 処理ループ内でレコードを取得する前に読み込み順(operand3 の値)が評価されます。あるレコードからレコードまで読み込み順を変更することが可能です。 これは、HISTOGRAM ループの任意の位置で読み込み順を昇順から降順(または、逆)に変更することが可能ということです。

SEQUENCE 節の例:

operand4
ディスクリプタ:

operand4 として、ディスクリプタ、サブディスクリプタ、スーパーディスクリプタ、またはハイパーディスクリプタが使用できます。

ピリオディックグループに含まれるディスクリプタをインデックス付きまたはなしで指定できます。 インデックスなしで指定した場合、ディスクリプタは指定した値がいずれかのオカレンスに見つかった場合に選択されます。 インデックス付きで指定した場合、レコードは値がインデックスで指定したオカレンス内に見つかった場合にのみ選択されます。 インデックスは定数で指定する必要があります。 インデックス範囲は使用できません。

MU のディスクリプタでは、インデックスを指定しないでください。値の位置に関係なく、値がレコードに存在していればディスクリプタは選択されます。

STARTING-ENDING-clause
STARTING/ENDING 節:

開始値と終了値は、キーワード STARTING および ENDING(または、THRU)の後に、処理を開始/終了する値を示す定数またはユーザー定義変数を続けて指定できます。

詳細については、以下の「Starting/Ending 値の指定」を参照してください。

WHERElogical-condition
WHERE 節:

WHERE 節は、追加の選択条件(logical-condition)を指定するために使用できます。この条件は、値が読み取られた、値に対する処理が実行されるに評価されます(AT BREAK 評価を含む)。

WHERE 節で指定するディスクリプタは、HISTOGRAM ステートメントで参照したディスクリプタと同じにする必要があります。 HISTOGRAM ステートメントでは、他のフィールドに対する処理を行うことができません。

logical-condition の構文については、『プログラミングガイド』の「論理条件基準」で説明しています。

システム変数

Natural システム変数 *ISN*NUMBER、および *COUNTERHISTOGRAM ステートメントで使用可能です。

*NUMBER および *ISN は、WHERE 節の評価後に設定されます。 これらを WHERE 節の論理条件に使用しないでください。

*NUMBER

システム変数 *NUMBER には、最後に読まれた値のデータベースレコード件数が入ります。

SQL データベースについては、『システム変数』ドキュメントの「SQL データベースに対する *NUMBER」を参照してください。

*ISN

システム変数 *ISN には、最後に読まれたディスクリプタ値を持つ、オカレンス番号が入ります。 *ISN は、PE に属さないディスクリプタに対しては常に 0 を返します。

*ISN は、SQL および VSAM データベースでは使用できません。

*COUNTER システム変数 *COUNTER には、読まれた値の個数の合計が入ります(WHERE 節の評価後)。
END-HISTOGRAM HISTOGRAM ステートメントを終了するには、Natural の予約キーワード END-HISTOGRAM を使用する必要があります。

MULTI-FETCH 節

注意:
この節は、Adabas または DB2 データベースでのみ使用できます。

MULTI-FETCH

ON

OFF
OF multi-fetch-factor

詳細については、『プログラミングガイド』の「MULTI-FETCH 節」(Adabas)または『データベース管理システムインターフェイス』ドキュメントの「Natural for DB2」で「複数行の処理」(SQL)を参照してください。

Starting/Ending 値の指定

開始値と終了値は、キーワード STARTING および ENDING(または、THRU)の後に、処理を開始/終了する値を示す定数またはユーザー定義変数を続けて指定できます。

指定された開始値が存在しない場合は、次に高い値が開始値として使用されます。 高い値がまったくないときは、HISTOGRAM ループ内に入りません。

終了値を指定すると、終了値までの(終了値を含む)値が読まれます。

フォーマットが A または B のディスクリプタに対しては、開始値および終了値として 16 進定数を指定できます。

構文オプション 1:

1

[STARTING]

WITH

[VALUES] operand5

 

THRU

operand6

FROM ENDING AT

構文オプション 2:

2 [STARTING]

WITH FROM

[VALUES] operand5 TO operand6

構文オプション 3:

3

<

operand5
LT
LESS THAN
>
GT
GREATER THAN
<=
LE
LESS EQUAL
>=
GE
GREATER EQUAL

注意:
図 3 の比較演算子を使用した場合は、オプション ENDING ATTHRU、および TO は使用できません。 これらの比較演算子は READ ステートメントにも有効です。

オペランド定義テーブル:

オペランド 構文要素 フォーマット ステートメント参照 ダイナミック定義
operand5 C S       A U N P I F B D T L       不可
operand6 C S       A U N P I F B D T L       不可

構文要素の説明:

STARTING FROM ... ENDING AT/TO

STARTING FROM および ENDING AT 節は、ユーザー指定の値の範囲に読み込みを制限するために使用します。

STARTING FROM 節(=EQEQUAL TO、または [STARTING] FROM)は、読み取り操作の開始値を決めます。 開始値を指定すると、指定した値から読み取りが始まります。 開始値が存在しない場合は、次に高い(または DESCENDING 読み込みでは低い)値が返されます。 より高い(または DESCENDING ではより低い)値が存在しなければ、HISTOGRAM ループに入りません。

値を終了値に制限するには、包括的な範囲を示す用語 THRUENDING AT、または TO を持つ ENDING AT 節を指定することができます。 ディスクリプタフィールドが終了値を超えると、自動的なループ終了が実行されます。 TOTHRU および ENDING AT キーワードの基本機能は、非常によく似ていますが、内部的に動作が異なります。

THRU/ENDING AT

THRU または ENDING AT が使用される場合、開始値だけがデータベースに供給され、データベースによって値が返された後に、Natural ランタイムシステムによって終了値のチェックが実行されます。

THRU および ENDING AT 節は、HISTOGRAM ステートメントをサポートするすべてのデータベースに対して使用することができます。

TO

キーワード TO を使用すると、開始値と終了値の両方がデータベースに送られ、Natural は値の範囲をチェックしません。 終了値を超えると、データベースは"ファイルの終わり"に到達した場合と同様に対処し、データベースループを終了します。 データベースにより完全な範囲チェックが行われるので、ASCENDING または DESCENDING のいずれの順序でブラウズしていても、常に範囲の小さい方の値が開始値になり、大きい方の値が終了値になります。

Top of page

例 1 - HISTOGRAM ステートメント

** Example 'HSTEX1S': HISTOGRAM (structured mode)                       
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPLOY-VIEW VIEW OF EMPLOYEES                                         
  2 CITY                                                                
END-DEFINE                                                              
*                                                                       
LIMIT 8                                                                 
HISTOGRAM EMPLOY-VIEW CITY STARTING FROM 'M'                  
  DISPLAY NOTITLE                                                       
          CITY 'NUMBER OF/PERSONS' *NUMBER *COUNTER                     
END-HISTOGRAM                                                      
*                                                                       
END  

プログラム HSTEX1S の出力:

        CITY          NUMBER OF     CNT     
                       PERSONS              
-------------------- ----------- -----------
                                            
MADISON                        3           1
MADRID                        41           2
MAILLY LE CAMP                 1           3
MAMERS                         1           4
MANSFIELD                      4           5
MARSEILLE                      2           6
MATLOCK                        1           7
MELBOURNE                      2           8

レポーティングモードの例:HSTEX1R

例 2 - 降順レコード読み取りによる HISTOGRAM ステートメント

** Example 'HSTDSCND': HISTOGRAM (with DESCENDING)                     
***********************************************************************
DEFINE DATA LOCAL                                                      
1 EMPL VIEW OF EMPLOYEES                                               
  2 NAME                                                               
END-DEFINE                                                             
*                                                                      
HISTOGRAM (10) EMPL IN DESCENDING SEQUENCE FOR NAME FROM 'ZZZ' 
  DISPLAY NAME *NUMBER                                                 
END-HISTOGRAM                                                   
END                                                                   

プログラム HSTDSCND の出力:

Page      1                                                  05-01-13  13:41:03
                                                                               
        NAME            NMBR                                                   
-------------------- -----------                                               
                                                                               
ZINN                           1                                               
YOT                            1                                               
YNCLAN                         1                                               
YATES                          1                                               
YALCIN                         1                                               
YACKX-COLTEAU                  1                                               
XOLIN                          1                                               
WYLLIS                         2                                               
WULFRING                       1                                               
WRIGHT                         1

例 3 - 変数順序を使用した HISTOGRAM ステートメント

** Example 'HSTVSEQ': HISTOGRAM (with VARIABLE SEQUENCE)               
***********************************************************************
DEFINE DATA LOCAL                                                      
1 EMPL VIEW OF EMPLOYEES                                               
  2 NAME                                                               
*                                                                      
1 #DIR      (A1)                                                       
1 #STARTVAL (A20)                                                      
END-DEFINE                                                             
*                                                                      
SET KEY PF3 PF7 PF8                                                    
*                                                                      
MOVE 'ADKINSON' TO #STARTVAL                                           
*                                                                      
HISTOGRAM (9) EMPL FOR NAME FROM #STARTVAL                             
  WRITE NAME *NUMBER                                                   
  IF *COUNTER = 5                                                      
    MOVE NAME TO #STARTVAL                                             
  END-IF                                                               
END-HISTOGRAM                                             
*                                                         
#DIR := 'A'                                               
*                                                         
REPEAT                                                    
  HISTOGRAM EMPL IN VARIABLE #DIR SEQUENCE                
            FOR NAME FROM #STARTVAL                       
    MOVE NAME TO #STARTVAL                                
    INPUT NO ERASE  (IP=OFF AD=O)                         
          15/01 NAME *NUMBER                              
          //   'Direction:' #DIR                          
          //   'Press PF3 to stop'                        
          /    '      PF7 to go step back'                
          /    '      PF8 to go step forward'             
          /    '      ENTER to continue in that direction'
    /*                                                    
    IF *PF-KEY = 'PF7' AND #DIR = 'A'                     
      MOVE 'D' TO #DIR                                    
      ESCAPE BOTTOM                                       
    END-IF                           
    IF *PF-KEY = 'PF8' AND #DIR = 'D'
      MOVE 'A' TO #DIR               
      ESCAPE BOTTOM                  
    END-IF                           
    IF *PF-KEY = 'PF3'               
      STOP                           
    END-IF                           
  END-HISTOGRAM                      
  /*                                 
  IF *COUNTER(0250) = 0              
    STOP                             
  END-IF                             
END-REPEAT                           
END                

プログラム HSTVSEQ の出力:

Page      1                                                  05-01-13  13:50:31
                                                                               
ADKINSON                       8                                               
AECKERLE                       1                                               
AFANASSIEV                     2                                               
AHL                            1                                               
AKROYD                         1                                               
ALEMAN                         1                                               
ALESTIA                        1                                               
ALEXANDER                      5                                               
ALLEGRE                        1                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
MORE   

Enter キーを押した後:

Page      1                                                  05-01-13  13:50:31
                                                                               
ADKINSON                       8                                               
AECKERLE                       1                                               
AFANASSIEV                     2                                               
AHL                            1                                               
AKROYD                         1                                               
ALEMAN                         1                                               
ALESTIA                        1                                               
ALEXANDER                      5                                               
ALLEGRE                        1                                               
                                                                               
                                                                               
                                                                               
AKROYD                         1                                               
                                                                               
Direction: A                                                                   
                                                                               
Press PF3 to stop                                                              
      PF7 to go step back                                                      
      PF8 to go step forward                                                   
      ENTER to continue in that direction   

Top of page