データベースへのアクセス

特定のデータをデータベースファイルから読み込み、対応する出力を表示する簡単なプログラムを作成します。

以下の演習を完了すると、サンプルのアプリケーションは 1 つのモジュールでのみ構成されます(プログラムで使用されるデータフィールドはプログラム内で定義されます)。

Application structure

このドキュメントには次の演習が含まれています。


新しい名前でのプログラムの保存

このチュートリアルの残りの部分で使用する新しいプログラムを作成します。新しいプログラムは、Hello World プログラムを新しい名前で保存することによって作成します。

Start of instruction setプログラムを新しい名前で保存するには

  1. プログラムエディタのコマンド行で、次のいずれかを入力します。

    SAVE PGM01
    SA PGM01

    現在のプログラムが新しい名前「PGM01」で保存されます。プログラム名「HELLO」は、引き続きプログラムエディタに表示されます。

  2. プログラムエディタのコマンド行で次のように入力して、新しく作成したプログラムをプログラムエディタに読み込みます。

    READ PGM01

    プログラムエディタに表示されるプログラム名が「PGM01」に変わります。

  3. プログラムエディタですべてのコードを削除します。これを行うには、削除する各行の先頭で次の行コマンドを入力し、ENTER キーを押します。

    D

    例:

    >> -----------Columns 001 072 <<  Program PGM01    Lines  4      User SAG      
    Command ===>                                       Mode   Struct Lib  TUTORIAL
    ****** ****************************** top of data *****************************
    D00010 * The "Hello world!" example in Natural.                                
    D00020 *                                                                       
    D00030 DISPLAY "Hello world!"                                                  
    D00040 END /* End of program                                                   
    ****** **************************** bottom of data ****************************

    または:
    最初の行の先頭で次の行コマンドを入力し、ENTER キーを押します。

    D4

    コマンドの後にある番号は、削除する行数を表します。

    または:
    コマンド行で次の行コマンドを入力し、削除する最初の行にカーソルを移動して、ENTER キーを押します。

    :D4

    エディタ画面のコマンド行で行コマンドを入力することもできます。この場合、コマンドの前にコロン(:)を付ける必要があります。カーソルでマークされた行に常に適用されます。

ビューを使用した必須データの定義

プログラムで使用するデータベースファイルおよびフィールドは、プログラムの先頭にある DEFINE DATAEND-DEFINE との間で指定する必要があります。

Natural がデータベースファイルにアクセスできるようにするには、物理データベースファイルの論理定義が必要です。このような論理ファイル定義は、データ定義モジュール(DDM)と呼ばれます。DDM には、ファイルの個々のフィールドに関する情報が含まれます。DDM は通常、Natural 管理者が定義します。

Natural プログラムでデータベースフィールドを使用できるようにするには、ビューで DDM からフィールドを指定する必要があります。このチュートリアルでは、EMPLOYEES データベースファイル用の DDM を使用します。

前の Hello World プログラムから行をすべて削除したため、プログラムエディタは現時点では次のようになっています。

>> -----------Columns 001 072 <<  Program PGM01    Lines         User SAG       
Command ===>                                       Mode   Struct Lib  TUTORIAL  
****** ****************************** top of data ***************************** 
****** **************************** bottom of data **************************** 

プログラムのコードを入力する前に、空行を挿入する必要があります。

Start of instruction set空行を挿入するには

  • "top of data" という語句を含む行の先頭で次の行コマンドを入力し、ENTER キーを押します。

    I

    これにより、1 行の空行が挿入され、エディタが挿入モードに切り替わります。これで、プログラムコードを入力できるようになります(以下を参照)。ENTER キーを押すと、新しい行が挿入されます。新しく挿入した行(行番号の代わりにアポストロフィがいくつか表示されます)にデータを入力せずに ENTER キーを押すと、エディタの挿入モードが終了し空行が削除されます。

    ヒント:
    (以下に示すように)LOCAL の下に空行を挿入するには、この行でアスタリスク(*)を入力します。(プログラムの最終行を入力してから ENTER キーを 2 回押した後で)挿入モードがアクティブでなくなると、アスタリスクを削除できます。この場合、空行は削除されません。

Start of instruction setDEFINE DATA ブロックを指定するには

  • プログラムエディタで次のコードを入力します。

    DEFINE DATA
    LOCAL
    
    END-DEFINE
    *
    END

    LOCAL は、次の手順で定義する変数がこのプログラムにのみ適用されるローカル変数であることを示します。

Start of instruction setDDM のデータフィールドを画面分割で表示するには

  1. プログラムエディタのコマンド行で、次のように入力します。

    SPLIT VIEW EMPLOYEES SHORT

    SHORT は、データフィールドが短縮形でリストされる(Adabas ショートネームおよび対応する Natural フィールド名のみが表示される)ことを示します。

    画面が 2 つのセクションに分割されます。DDM のデータフィールドは、画面の下半分に表示されます。画面の下半分でデータを編集することはできません。

    >> -----------Columns 001 072  <<  Program PGM01    Lines  6      User SAG     
    Command ===>                                        Mode   Struct Lib  TUTORIAL
    ****** ****************************** top of data *****************************
    000010 DEFINE DATA                                                             
    000020 LOCAL                                                                   
    000030                                                                         
    000040 END-DEFINE                                                              
    000050 *                                                                       
    000060 END                                                                     
    ****** **************************** bottom of data ****************************
                                                                                   
    >> -----------Columns 001 072  <<     View EMPLOYEE Lines  38     User SAG     
    Command ===>                                                      Lib  SYSTEM  
    ****** ****************************** top of data *****************************
    000001 DB: 020 FILE: 014  - EMPLOYEES                        DEFAULT SEQUENCE: 
    000002   1 AA PERSONNEL-ID                      A    8    D                    
    000003 G 1 AB FULL-NAME                                                        
    000004   2 AC FIRST-NAME                        A   20  N                      
    000005   2 AD MIDDLE-I                          A    1  N                      
    000006   2 AE NAME                              A   20    D                    
    000007   1 AD MIDDLE-NAME                       A   20  N                      
    Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12---
          Help  Save  Exit  Run   Rfind Stow  -     +     Check Home  Undo  Canc
  2. ビューでページをスクロールし、どのデータフィールドが使用され、それがどのように定義されているかを確認することができます。これには、次のコマンドまたはキーを使用します。

    コマンドまたはキー 説明
    SWAP 編集エリアのコマンド行から表示エリア(ビュー)のコマンド行、またはその逆にカーソルを移動します。また、目的のコマンド行にカーソルを単に移動することもできます。
    + または PF8 ビューの次のページに進みます。カーソルを表示エリア(ビュー)のコマンド行に置く必要があります。
    - または PF7 ビューの前のページに進みます。カーソルを表示エリア(ビュー)のコマンド行に置く必要があります。
    SPLIT END 画面分割モードを終了します。カーソルを編集エリア(プログラム)のコマンド行に置く必要があります。

    次の手順では、画面分割モードが終了していることが前提となります。

  3. LOCAL を含む行の最初の位置にカーソルをおき、次のように入力します。

    I9

    9 行の空行が挿入されます。

  4. LOCAL の下に次のコードを入力します。

    1 EMPLOYEES-VIEW VIEW OF EMPLOYEES
      2 FULL-NAME
        3 NAME (A20)
      2 DEPT (A6)
      2 LEAVE-DATA
        3 LEAVE-DUE (N2)
  5. ENTER キーを押します。

    残りの空行が除去されます。ただし、カーソルが置かれている 1 行の空行は残ります(エディタは挿入モードのままになります)。ENTER キーを押すと、挿入モードが終了します。

最初の行には、ビューの名前およびフィールドが取得されるデータベースファイルの名前が含まれています。最初の行は、常にレベル 1 で定義されます。レベルは、行の先頭に示されます。DDM のデータベースフィールドの名前は、レベル 2 および 3 で定義されます。

レベルはフィールドグルーピングと合わせて使用します。2 またはそれ以上のレベル番号が付いたフィールドは、それより小さいレベル番号が付いた直前のグループの一部であるとみなされます。グループで定義すると、グループ名を使用して一連のフィールド(または 1 つのフィールドだけでもよい)を参照することができます。これは一連の連続フィールドを参照するのに便利で効果的な方法です。

各フィールドのフォーマットおよび長さは、カッコで囲んで示されます。"A" は英数字を示し、"N" は数字を示します。

データベースからのデータの読み込み

必須データの定義が完了したので、READ ループを追加します。このループは、定義されたビューを使用してデータベースファイルからデータを読み込みます。各ループでは、データベースファイルから 1 人の従業員を読み込みます。この従業員の名前、部署、および休暇の残り日数が表示されます。すべての従業員が表示されるまで、データが読み込まれます。

注意:
トランザクションが中止されたことを示すエラーメッセージが表示されることがあります。これは通常、Adabas によって決められる非アクティビティタイムリミットを超えた場合に発生します。このようなエラーが発生した場合は、最後に実行されたアクションを単に繰り返す(RUN コマンドを再発行するなど)必要があります。

Start of instruction setデータベースからデータを読み込むには

  1. END-DEFINE の下に次の行を挿入します(空行を挿入するには、上記の手順で I コマンドを使用します)。

    READ EMPLOYEES-VIEW BY NAME
    *
      DISPLAY NAME 3X DEPT 3X LEAVE-DUE
    *
    END-READ

    BY NAME はデータベースから読み込むデータが名前別にアルファベット順にソートされることを示します。

    DISPLAY ステートメントは、出力を列形式で配列します。指定されたフィールドごとに列が作成され、列の上にヘッダーが表示されます。3X は、列間に 3 文字分の空白が挿入されることを示します。

  2. プログラムを実行します。

    次の出力が表示されます。

    MORE                                                                           
    Page      1                                                  09-06-30  16:06:49
                                                                                   
            NAME           DEPARTMENT   LEAVE                                      
                              CODE       DUE                                       
    --------------------   ----------   -----                                      
                                                                                   
    ABELLAN                PROD04        20                                        
    ACHIESON               COMP02        25                                        
    ADAM                   VENT59        19                                        
    ADKINSON               TECH10        38                                        
    ADKINSON               TECH10        18                                        
    ADKINSON               TECH05        17                                        
    ADKINSON               MGMT10        28                                        
    ADKINSON               TECH10        26                                        
    ADKINSON               SALE30        36                                        
    ADKINSON               SALE20        37                                        
    ADKINSON               SALE20        30                                        
    AECKERLE               SALE47        31                                        
    AFANASSIEV             MGMT30        26                                        
    AFANASSIEV             TECH10        35                                        
    AHL                    MARK09        30                                        
    AKROYD                 COMP03        20                                        
    ALEMAN                 FINA03        20                                        
    

    DISPLAY ステートメントの結果、列ヘッダー(DDM から取得)に下線が引かれ、下線とデータの間に 1 行の空行が挿入されます。各列の幅は、DEFINE DATA ブロックで定義された値(ビューで定義された値)と同じになります。

    各ページ上部のタイトルにはページ番号および日時が含まれ、これも DISPLAY ステートメントによって表示されます。

  3. ENTER キーを繰り返し押して、すべてのページを表示します。

    すべての従業員が表示されると、プログラムエディタに戻ります。

    ヒント:
    すべての従業員が表示される前にプログラムエディタに戻るには、[MORE]プロンプトで「EDIT」または省略形である「E」を入力します。また、[MORE]プロンプトで、現在の Natural 操作を中断する端末コマンド「%.」を入力することもできます。デフォルトでは、各端末コマンドは制御文字 % で始まります。ただし、管理者が別の制御文字を定義している可能性もあります。

データベースからの選択したデータの読み込み

前の出力は非常に長いため、それを制限します。"Adkinson" で始まり "Bennett" で終わる範囲の名前のデータのみを表示します。これらの名前はデモデータベースに定義されています。

Start of instruction set出力をデータの範囲に制限するには

  1. 新しい変数を使用する前に、それを定義する必要があります。したがって、 LOCAL の下に次の行を挿入します。

    1 #NAME-START        (A20) INIT <"ADKINSON">
    1 #NAME-END          (A20) INIT <"BENNETT">

    これらはユーザー定義変数であり、デモデータベースには定義されていません。名前の先頭にあるハッシュ(#)は、ユーザー定義変数とデモデータベースに定義されているフィールドを区別するために使用されていますが、必須文字ではありません。

    INIT は、フィールドのデフォルト値を定義します。デフォルト値は、山カッコおよび引用符で囲んで指定する必要があります。

  2. READ ステートメントの下に次の行を挿入します。

    STARTING FROM #NAME-START
    ENDING AT #NAME-END

    プログラムは次のようになります。

    DEFINE DATA
    LOCAL
      1 #NAME-START        (A20) INIT <"ADKINSON">
      1 #NAME-END          (A20) INIT <"BENNETT">
      1 EMPLOYEES-VIEW VIEW OF EMPLOYEES
        2 FULL-NAME
          3 NAME (A20)
        2 DEPT (A6)
        2 LEAVE-DATA
          3 LEAVE-DUE (N2)
    END-DEFINE
    *
    READ EMPLOYEES-VIEW BY NAME
      STARTING FROM #NAME-START
      ENDING AT #NAME-END
    *
      DISPLAY NAME 3X DEPT 3X LEAVE-DUE
    *
    END-READ
    *
    END

    プログラムコードは 1 画面ページを超えています。次のコマンドまたはキーを使用すると、プログラムソース内で移動できます。

    Command 説明
    BOT プログラムの最後にジャンプします。
    TOP プログラムの最初に戻ります。
    キー 説明
    PF8 または プログラムを 1 ページ下にスクロールします。
    PF7 プログラムを 1 ページ上にスクロールします。
  3. プログラムを実行します。

    出力が表示されます。ENTER キーを繰り返し押すと、数ページ後(Bennett という名前の最後の従業員のデータが表示された後)でプログラムエディタに戻ります。

  4. プログラムを格納します。

次の演習に進みます。ユーザー入力