ユーザー入力

データ、つまり出力の開始名と終了名の入力プロンプトをユーザーに対して表示する方法を習得します。

以下の演習を完了すると、サンプルのアプリケーションは次のモジュールで構成されます。

Application structure

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


ユーザー入力の許可

プログラムを修正して、開始名および終了名の入力フィールドが出力に表示されるようにします。これには、INPUT ステートメントを使用します。

Start of instruction set入力フィールドを定義するには

  1. END-DEFINE の下に以下を挿入します。

    INPUT (AD=MT)
      "Start:" #NAME-START /
      "End:  " #NAME-END

    セッションパラメータ AD は "属性定義" を表し、値 "M" は "変更可能出力フィールド"、値 "T" は "小文字から大文字への変換" を表します。

    AD=MT の値 "M" は、INIT で定義されたデフォルト値を表します(つまり、"ADKINSON" および "BENNETT")が入力フィールドに表示されます。ユーザーは異なる値を入力できます。"M" 値を省略すると、デフォルト値が定義されていても入力フィールドには表示されません。

    AD=MT の値 "T" は、小文字の入力がすべて大文字に変換されてから処理されることを示します。デモデータベースファイル内の名前はすべて大文字で定義されているため、これは重要です。"T" 値を省略すると、すべての名前を大文字で入力する必要があります。大文字で入力しないと、指定した名前が検出されなくなります。

    "Start:" および "End:" はテキストフィールド(ラベル)です。引用符で囲んで指定します。

    #NAME-START および #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
    *
    INPUT (AD=MT)
      "Start:" #NAME-START /
      "End:  " #NAME-END
    *
    READ EMPLOYEES-VIEW BY NAME
      STARTING FROM #NAME-START
      ENDING AT #NAME-END
    *
      DISPLAY NAME 3X DEPT 3X LEAVE-DUE
    *
    END-READ
    *
    END
  2. プログラムを実行します。

    定義したフィールドが出力に表示されます。

    Start: ADKINSON                                                                
    End:   BENNETT
  3. デフォルト名を使用し、ENTER キーを押します。

    従業員のリストが表示されます。

  4. プログラムエディタに戻るまで繰り返し ENTER キーを押すかMORE プロンプトで「EDIT」と入力します。

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

ユーザー入力のマップの設計

入力プロンプトをユーザーに表示するさまざまな方法を説明します。マップエディタを使用して、前にプログラムで定義した同じフィールドを含むマップを作成します。マップは別のオブジェクトであり、ユーザーインターフェイスのレイアウトをアプリケーションのビジネスロジックから分離するために使用します。

ここで作成するマップは次のようになります。

XXXXXXXXXX                                                           TT:TT:TT 
                                                                              
                                                                              
                         Start XXXXXXXXXXXXXXXXXXXX                           

                           End XXXXXXXXXXXXXXXXXXXX                           
                                                                              
                                                                              



マップの最初の行には、現在の日時を示すシステム変数が含まれます。開始名および終了名をユーザーが指定できる 2 つのデータフィールド(入力フィールド)があります。データフィールドの前にはテキストフィールド(ラベル)があります。

上記のマップには、次の手順が必要です。

マップの作成

マップエディタを起動し、マップを設計します。

Start of instruction setマップを作成するには

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

    EDIT MAP
    E M

    Natural Map Editor]メニューが表示されます。

    +------------------------------------------------------------------------------+
    ¦                    NATURAL MAP EDITOR (Esc to select field)                  ¦
    ¦Create   Modify    Erase     Drag      Info OFF  Lines     Ops. Map  Quit     ¦
    +------------------------------------------------------------------------------+
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
     Create a new field definition

テキストフィールドの定義

2 つのテキストフィールド(定数またはラベルとも呼ばれる)をマップに追加します。

Start of instruction setテキストフィールドを定義するには

  1. Natural Map Editor]メニューで[Create]を選択し、ENTER キーを押します。

    作成可能なすべての項目をリストするウィンドウが表示されます。

    +------------------------------------------------------------------------------+
    ¦                    NATURAL MAP EDITOR (Esc to select field)                  ¦
    ¦Create   Modify    Erase     Drag      Info OFF  Lines     Ops. Map  Quit     ¦
    ++-----------------------+-----------------------------------------------------+
     ¦ A Parameter Data Area ¦                                                      
     ¦ G Global Data Area    ¦                                                      
     ¦ H Help Routine        ¦                                                      
     ¦ L Local Data Area     ¦                                                      
     ¦ M Map                 ¦                                                      
     ¦ N Subprogram          ¦                                                      
     ¦ P Program             ¦                                                      
     ¦ S Subroutine          ¦                                                      
     ¦ T Text Constant       ¦                                                      
     ¦ U User Defined        ¦                                                      
     ¦ V View Defined        ¦                                                      
     ¦ 1 Parm Defined        ¦                                                      
     ¦ 2 Local Defined       ¦                                                      
     +-----------------------+                                                      
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
     Take variable definition from parameter data area
  2. 方向キーを使用して[Text Constant]を選択し、ENTER キーを押します。

    または:
    T キーを押します。

    空の画面が表示されます。カーソルを置いてテキストを入力するよう指示するメッセージが表示されます。

  3. 4 行目の最初の位置(行および列番号は画面下部に表示されます)にカーソルを移動し、次のように入力します。

    Start

    まだ ENTER キーを押さないでください。

  4. PF2 キーを押します。

    このテキストフィールドに属性を設定できるウィンドウが表示されます。

                                                                                  
                                                                                  
                                                                                  
    Start                                                                         
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
    +-Text Attribute/Color Definition: --------------+                            
    ¦ Attribute: <No Attribute> Color: <No Color>    ¦                
    +------------------------------------------------+                            
     MAP0083: Use cursor keys (UP, DOWN) for Attribute. (Esc=Cancel, Enter=OK)

    Attribute]フィールドが自動的に選択されます。

    注意:
    LEFT-ARROW および RIGHT-ARROW を使用して、フィールド属性とカラー定義との間を切り替えることができます。このチュートリアルでは色は使用しません。

  5. UP-ARROW または DOWN-ARROW を使用して、使用可能な属性をスクロールできます。ウィンドウに "Default" と表示されたら、ENTER キーを押します。"Default" は、フィールドが高輝度表示でなく強調表示でもないことを示します。

    これで、フィールドが画面で選択されました。このことは、強調表示された背景によって示されます。

  6. ESC キーを押すと、メニューが再表示されます。

    ESC キーは、メニューの表示と非表示を切り替えるために使用されます。定義したテキストフィールドは表示されなくなります。削除されたのではなく、メニューの後ろに消えるだけです。ESC キーをもう一度押すと、メニューが非表示になりフィールドが再表示されます。

  7. 最初のテキストフィールドの追加と同じ手順で、2 つ目のテキストフィールドを追加(2 つ目のテキスト定数を定義し、[Default]属性を設定)します。[Start]フィールドの下にある行(行 5)にこのフィールドを配置し、次のように名前を付けます。

    End
  8. 2 つ目のテキストフィールドを追加したら、ESC キーを押してメニューを再表示します。

    新しい[End]フィールドがメニューの真下に表示されます。

データフィールドの定義

2 つのデータフィールドをマップに追加します。これらは、開始名および終了名をユーザーが指定できる入力フィールドです。

Start of instruction setデータフィールドを定義するには

  1. Create]メニューで、[User Defined]を選択します。

    Extended Field Editing]ウィンドウが表示されます。

                                                                                    
                                                                                    
                                                                                    
    Start                                                                           
    End                                                                             
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
    +-Extended Field Editing-------------------------------------------------------+
    ¦Field :                                                                       ¦
    ¦Format: A Len:            AL:             PM:                  ZP: N  SG: N   ¦
    ¦Rules : 0 Rule Editing: N Array:          Array Editing: N     Mode:          ¦
    ¦AD:            CD:        CV:                                  DY: N  HE: N   ¦
    ¦EM:                                                                           ¦
    +------------------------------------------------------------------------------+
                                                                                    
     MAP0079: Position cursor and press Enter or format char.(Esc=Cancel) (012,019)
  2. Start]フィールドの後にカーソルを置き(テキストフィールドとデータフィールドの間にスペースを残します)、ENTER キーを押します。

    次のウィンドウが表示されます。

    +---------------------+
    ¦ A Alphanumeric      ¦
    ¦ B Binary            ¦
    ¦ D Date              ¦
    ¦ F Floating Point    ¦
    ¦ I Integer           ¦
    ¦ L Logical           ¦
    ¦ N Numeric           ¦
    ¦ P Packed Numeric    ¦
    ¦ T Time              ¦
    ¦ * System            ¦
    +---------------------+
  3. A Alphanumeric]を選択します。

    選択したフォーマットは、[Extended Field Editing]ウィンドウの [Format]フィールドに表示されます。カーソルは[AL]フィールドに自動的に移動します。

  4. AL]フィールドに「"20"」を入力します。

    これは、データフィールドが長さ 20 文字で定義されることを示します。

  5. TAB キーを押します。

    マップでフィールド長が "X" 文字で示されます。

  6. AD]フィールドが強調表示されるまで、TAB キーを繰り返し押します。

    I/O 特性および充填文字を定義します。次の属性定義文字は、[AD]フィールドに現在表示されています。

    ILMFHT'_'

    I/O 特性は文字 "M" で示されます。充填文字は '_' で示されます。このチュートリアルでは、これらのデフォルト設定を使用します。次の手順は、この機能の使用方法を単に示しています。この時点で、以下に詳しく説明するように、[Attribute Definition]ウィンドウおよび[Extended Field Editing]ウィンドウも閉じることができます。

    注意:
    AD]フィールドにおける属性定義文字の配列順序は変わることがあります。つまり、属性が異なる位置で生じる可能性があります。

  7. PF2 キーを押して、属性定義を編集します。

    Attribute Definition]ウィンドウが表示されます。

    +-Attribute Definition--+
    ¦Representation         ¦
    ¦Alignment              ¦
    ¦I/O Characteristics    ¦
    ¦Mandatory Characters   ¦
    ¦Length Characteristics ¦
    ¦Upper/Lower Case       ¦
    ¦Filler Character       ¦
    +-----------------------+
  8. I/O Characteristics]を選択します。

    次のウィンドウが表示されます。

    +------------------------+
    ¦ A Input, non_protected ¦
    ¦ M Output, modifiable   ¦
    ¦ O Output, protected    ¦
    +-Esc=Quit, Enter=Toggle-+
  9. 文字 "M" が[AD]フィールドにすでに表示されている場合は、ESC キーを押してこのウィンドウを終了します。

    または:
    文字 "M" が[AD]フィールドに表示されていない場合は、[M Output, modifiable]を選択します。

    注意:
    同じ属性を何度も選択するとトグル効果が生じ、属性の定義または削除が切り替えられます。

  10. Attribute Definition]ウィンドウで[Filler Character]を選択します。

    新しい充填文字の入力を求めるプロンプトが表示されます。

    充填文字を使用して、マップ内の入力フィールドの空の位置を埋めます。これにより、ユーザーは入力時にフィールドの正確な位置と長さを確認することができます。

  11. 現在のカーソル位置で下線(_)を入力します。

    ENTER キーを押す必要はありません。下線文字を入力すると、メッセージが直ちに非表示になります。

  12. ESC キーを押して、[Attribute Definition]ウィンドウを閉じます。

  13. ENTER キーを押して、[Extended Field Editing]ウィンドウを閉じ、フィールドをマップに格納します。

    注意:
    ENTER キーの代わりに ESC キーを押すと、新しいデータフィールド定義は保存されず、フィールドはマップに格納されません。

  14. 上記の手順と同じ方法で 2 つ目のデータフィールドを追加します。2 つ目のデータフィールドを[End]フィールドの横に配置し、20 文字の長さを定義し、上記と同じ属性定義文字を定義します。

データフィールドの名前の指定

ユーザー定義変数用に新しいデータフィールドを作成すると、Natural によってフィールド名が割り当てられます。このフィールド名には数値が含まれます。新しく作成したフィールドの名前を、プログラムで定義された変数名に調整する必要があります。

同じ名前がプログラムで使用されていることを確認します。#NAME-START および #NAME-END。これらのフィールドの出力(ユーザー入力)は、プログラム内の対応するユーザー定義変数に渡されます。

Start of instruction setデータフィールドの名前を定義するには

  1. 方向キーを使用して、開始名のデータフィールドを選択します。

  2. ESC キーを押すと、メニューが再表示されます。

  3. メニューの[Modify]を選択します。

    Extended Field Editing]ウィンドウが表示されます。

    +-Extended Field Editing-------------------------------------------------------+
    ¦Field : #1                                                                    ¦
    ¦Format: A Len: 20         AL: 20          PM:                  ZP: N  SG: N   ¦
    ¦Rules : 0 Rule Editing: N Array: None     Array Editing: N     Mode:  Undef   ¦
    ¦AD: ILMFHT'_'  CD:        CV:                                  DY: N  HE: N   ¦
    ¦EM:                                                                           ¦
    +------------------------------------------------------------------------------+

    Field]フィールドには、Natural によって割り当てられたフィールド名が含まれています。"#1"。

  4. Field]フィールドに「"#NAME-START"」と入力します。

  5. ENTER キーを押します。

  6. 終了名のデータフィールドについても上記の手順を繰り返し、フィールド名として「"#NAME-END"」と入力します。

システム変数の追加

Natural システム変数には、現在のライブラリ、ユーザー、日時など、現在の Natural セッションに関する情報が含まれます。これらは、Natural プログラム内のどこからでも参照できます。システム変数はすべてアスタリスク(*)で始まります。

日時のシステム変数をマップに追加します。プログラムが実行されると、現在の日時がマップに表示されます。

Start of instruction setシステム変数を追加するには

  1. ESC キーを押すと、メニューが再表示されます。

  2. Create]メニューで、[User Defined]を選択します。

    Extended Field Editing]ウィンドウが表示されます。

  3. 画面の左上隅(行 001、列 001)にカーソルを置き、ENTER キーを押します。

    次のウィンドウが表示されます。

    +---------------------+
    ¦ A Alphanumeric      ¦
    ¦ B Binary            ¦
    ¦ D Date              ¦
    ¦ F Floating Point    ¦
    ¦ I Integer           ¦
    ¦ L Logical           ¦
    ¦ N Numeric           ¦
    ¦ P Packed Numeric    ¦
    ¦ T Time              ¦
    ¦ * System            ¦
    +---------------------+
  4. * System]を選択します。

    次のウィンドウが表示されます。

    +-----------------------------+
    ¦ *APPLIC-ID           A8     ¦
    ¦ *APPLIC-NAME         A32    ¦
    ¦ *COM                 A128   ¦
    ¦ *CONVID              I4     ¦
    ¦ *CPU-TIME            I4     ¦
    ¦ *CURRENT-UNIT        A32    ¦
    ¦ *CURSOR              N6     ¦
    ¦ *CURS-COL            P3     ¦
    ¦ *CURS-LINE           P3     ¦
    ¦ *DAT4D               A10    ¦
    ¦ *DAT4E               A10    ¦
    ¦ *DAT4I               A10    ¦
    ¦ *DAT4J               A7     ¦
    ¦ *DAT4U               A10    ¦
    +-----------------------------+

    DOWN-ARROW または UP-ARROW を使用して、システム変数のリストをスクロールします。

  5. *DAT4I]を選択し、ENTER キーを押します。

    いくつかの "X" 文字が表示されます。

  6. ENTER キーを押して、[Extended Field Editing]ウィンドウを閉じます。

  7. 上記の手順を繰り返し、システム変数 *TIMX を追加します。画面の右上隅(行 001、列 070)に配置します。このシステム変数用に TT:TT:TT が表示されます。ENTER キーを押して、[Extended Field Editing]ウィンドウを閉じることを忘れないでください。

フィールドの再位置決め

追加したフィールドの再位置決めを行います。

Start of instruction setフィールドを移動するには

  1. メニューを表示中に ESC キーを押すと、非表示になります。

  2. 方向キーを使用して、開始名のデータフィールド("X" 文字で示されます)を選択します。

    データフィールドが強調表示されます。

  3. ESC キーを押すと、メニューが再表示されます。

  4. Drag]を選択します。

    メニューが非表示になります。

  5. 方向キーを使用して、強調表示されたフィールドを行の中央に移動します。

  6. ENTER キーを押すと、ドラッグモードが終了します。

  7. 開始名および終了名の残りのテキストフィールドとデータフィールドを、上記の手順で行の中央に移動します。開始名および終了名のフィールド間の空行はそのままにします。

    このセクションの最初に示したようなマップが表示されます。

マップのテスト

マップが意図したとおりに動作するかどうかをテストします。

Start of instruction setマップをテストするには

  1. ESC キーを押してメニューを再表示し、[Ops. Map]メニューで[Test Map]を選択します。

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

    2009-06-30                                                          13:39:55
                                                                                
                                                                                
                               Start  ____________________                      
                                                                                
                                 End  ____________________                      
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
    

    開始名の入力フィールドはマップの最初の入力フィールドであるため、自動的に選択されます。どちらの入力フィールドにも、充填文字が含まれています。

    注意:
    挿入モードで操作する場合、テキストを入力する前に充填文字を削除する必要があります。デフォルトである上書きモードでは、この操作は不要です。

  2. ENTER キーを押して、マップエディタに戻ります。

マップの格納

マップのテストが正常に行われたら、プログラムで検出できるようにするため、マップを格納する必要があります。

Start of instruction setマップを Stow するには

  1. ESC キーを押すと、メニューが再表示されます。

  2. Ops. Map]メニューで、[Stow Map]を選択します。

    次のウィンドウが表示されます。

     +--Stow Map As: ---+ 
     ¦Name...:          ¦ 
     ¦Library: TUTORIAL ¦ 
     +------------------+
  3. マップ名として「"MAP01"」と入力し、ENTER キーを押します。

プログラムからのマップの起動

マップの格納が完了したら、WRITE または INPUT ステートメントを使用して Natural プログラムから起動できます。

Start of instruction setプログラムからマップを起動するには

  1. ESC キーを押してメニューを再表示し、[Quit]を選択します。

    Natural のメインメニューが再表示され、[Direct Command]ウィンドウで入力を求められます。

  2. 次のいずれかを入力して、プログラムエディタに戻ります。

    EDIT PGM01
    E PGM01
  3. 前に定義した INPUT 行を次の行で置き換えます。

    INPUT USING MAP 'MAP01'

    これにより、設計したマップが起動されます。

    マップをユーザー定義変数と区別するため、マップ名を一重引用符で囲む必要があります。

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

    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
    *
    INPUT USING MAP 'MAP01'
    *
    READ EMPLOYEES-VIEW BY NAME
      STARTING FROM #NAME-START
      ENDING AT #NAME-END
    *
      DISPLAY NAME 3X DEPT 3X LEAVE-DUE
    *
    END-READ
    *
    END
  4. プログラムを実行します。

    マップが表示されます。

  5. プログラムエディタに戻るまで繰り返し ENTER キーを押すかMORE プロンプトで「EDIT」と入力します。

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

終了名を常に使用するための操作

プログラムをコーディングしても、終了名が指定されていなければデータは検出されません。

開始名および終了名の初期値を削除すると、これらの名前をユーザーが常に指定する必要があります。ユーザーが終了名を指定しなくても、終了名が常に使用されるようにするため、対応するステートメントを追加します。

Start of instruction set終了名を使用するには

  1. DEFINE DATA ブロックで、フィールド #NAME-START および #NAME-END のデフォルト値(INIT)を削除します。対応する行は次のようになります。

    1 #NAME-START        (A20)
    1 #NAME-END          (A20)
  2. INPUT USING MAP 'MAP01' の下に以下を挿入します。

    IF #NAME-END = ' ' THEN
        MOVE #NAME-START TO #NAME-END
    END-IF

    #NAME-END]フィールドが空白になっている(ユーザーが終了名を入力しなかった)場合は、開始名が自動的に終了名として使用されます。

    注意:
    ステートメント MOVE #NAME-START TO #NAME-END の代わりに、ASSIGN または COMPUTE ステートメントの次の変形を使用することもできます。#NAME-END := #NAME-START

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

    DEFINE DATA
    LOCAL
      1 #NAME-START        (A20)
      1 #NAME-END          (A20)
      1 EMPLOYEES-VIEW VIEW OF EMPLOYEES
        2 FULL-NAME
          3 NAME (A20)
        2 DEPT (A6)
        2 LEAVE-DATA
          3 LEAVE-DUE (N2)
    END-DEFINE
    *
    INPUT USING MAP 'MAP01'
    *
    IF #NAME-END = ' ' THEN
      MOVE #NAME-START TO #NAME-END
    END-IF
    *
    READ EMPLOYEES-VIEW BY NAME
      STARTING FROM #NAME-START
      ENDING AT #NAME-END
    *
      DISPLAY NAME 3X DEPT 3X LEAVE-DUE
    *
    END-READ
    *
    END
  3. プログラムを実行します。

  4. 結果のマップで、開始名の入力を求めるフィールドに「"JONES"」と入力し、ENTER キーを押します。

    結果のリストには、"Jones" という名前の従業員のみが表示されます。

  5. ENTER キーを押して、プログラムエディタに戻ります。

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

次の演習に進みます。ループおよびラベル