バージョン 6.3.3
 —  ファーストステップ  —

ユーザー入力

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

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

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. プログラムを実行します。

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

    Output

  3. デフォルト名を使用し、Enter キーを押します。

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

  4. プログラムエディタに戻るまで繰り返し Enter キーを押すか、Esc キーを押します。。

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

Top of page

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

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

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

Map

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

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

マップの作成

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

プログラムエディタをバックグラウンドで開いたままにします。

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

  1. ライブラリワークスペースで、プログラムも含まれているライブラリ(TUTORIAL ノード)を選択します。

  2. コンテキストメニューから、[新規作成]>[マップ]を選択します。

    または:
    次のツールバーボタンを選択します。

    Map

    空のマップエディタウィンドウが表示されます。

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

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

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

  1. [挿入]メニューの[テキスト定数]を選択します。

    注意:
    マップエディタがアクティブの場合、メニューバーに異なるメニューが表示されます。 (プログラムエディタがアクティブのときに表示される[プログラム]メニューの代わりに)[挿入][フィールド]、および[マップ]メニューが表示されます。

    または:
    次のツールバーボタンを選択します。

    Text constant

    注意:
    デフォルトでは、このボタンを含むツールバーは、マップエディタウィンドウの右側で縦に表示されます。 プログラムエディタがアクティブのときは、異なるツールバーがここに表示されていました。

  2. マップエディタウィンドウでテキスト定数を挿入する位置にマウスを移動します。

    マウスポインタの表示が十字およびテキスト定数シンボルに変わります。

  3. マウスボタンを押し続けます。

  4. フィールドが希望の長さになるまでマウスを右にドラッグします。 ここでは、フィールド長は約 10 文字で十分です。

    マウスをドラッグすると、現在の長さがアプリケーションウィンドウのステータスバーに表示されます。 フォーマットおよびマップにおける位置もステータスバーに表示されます。 テキストフィールドは常にフォーマット A(英数字)になります。

  5. マウスボタンを放します。

    デフォルトのラベルを持つテキストフィールドが表示されます。 ハンドルは、テキストフィールドが選択されていることを示します。 マウスポインタには引き続き十字およびテキスト定数シンボルが表示され、別のテキストフィールドを直ちに描画できます。

    注意:
    このモードを終了するには、マップエディタ内の他の位置をクリックします。

  6. 最初のテキストフィールドの下に 2 つ目のテキストフィールドを描画します。

    フィールドの開始列に誤りがある場合は、そのフィールドにマウスポインタを置き、マウスボタンを押し続けて目的の位置にドラッグすると、フィールドを移動できます。 マウスボタンを放すと、通常のマウスポインタが再表示されます。

テキストフィールドのラベルの指定

挿入したテキストフィールドには、正しいラベルがまだ付いていません。 ここで、ラベルを指定します。

Start of instruction setラベルを指定するには

  1. 最初のテキストフィールドを選択し、コンテキストメニューから[定義]を選択します。

    または:
    テキストフィールドをダブルクリックします。

    既存のテキストが選択されます。

  2. 最初のテキストフィールドのラベルに「Start:」と入力し、Enter キーを押します。

    テキストフィールド(長さが 10 文字で定義済み)が、この文字列の長さに自動的にサイズ変更されます。

  3. 上記の手順を繰り返し、2 つ目のテキストフィールドのラベルに「End:」と入力します。

データフィールドの定義

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

データフィールドは 2 つの方法で定義できます。[データフィールド]コマンドでは、データフィールドに正しいフォーマットと長さを定義する必要があります。または、[インポート]>[データフィールド]コマンドでは、データフィールドをリストから選択するだけで、正しいフォーマットと長さが自動的に使用されます。 これらの 2 つの方法について、以下で説明します。

Start of instruction set長さを指定する必要のあるデータフィールドを定義するには

  1. [挿入]メニューの[データフィールド]を選択します。

    または:
    次のツールバーボタンを選択します。

    Insert data field

  2. 開始名用として前に挿入したテキストフィールドの右に、データフィールドを描画します。 テキストフィールドと同じように描画します。 データフィールドには 20 文字の長さが必要です(フィールド長が短すぎるまたは長すぎる場合、後述の演習で長さを修正する方法を示します)。 データフィールドは、"X" 文字で自動的に埋められます。

Start of instruction setデータフィールドをインポートするには

  1. [挿入]メニューの[インポート]>[データフィールド]を選択します。

    [データフィールドのインポート]ダイアログボックスが表示されます。

  2. [ライブラリ]ドロップダウンリストボックスから[TUTORIAL]を選択します。

  3. [プログラム]オプションボタンを選択します。

    ライブラリで現在定義されているすべてのプログラムが、[オブジェクト]リストボックスに表示されます。

  4. PGM01 という名前のプログラムを選択します。

    インポートできるデータフィールドがダイアログボックスの下部に表示されます。

    Import data field

  5. フィールド #NAME-END を選択し、[インポート]ボタンを選択します。

    [データフィールドのインポート]ダイアログボックスの[キャンセル]ボタンのラベルが[終了]になります。

  6. [終了]ボタンを選択して、[データフィールドのインポート]ダイアログボックスを閉じます。

    データフィールドがマップの左上に表示されます。 データフィールドは "X" 文字で埋められます。 ハンドルは、データフィールドが選択されていることを示します。

  7. 終了名用として前に定義したテキストフィールドの右に、データフィールドを移動します。 これを行うには、データフィールドにマウスポインタを置き、マウスボタンを押し続けてマウスを目的の位置にドラッグしてから、マウスボタンを放します。

データフィールドの名前および属性の指定

次の説明は、手動で定義した開始名のデータフィールドに対してのみ適用されます。 インポートした終了名のデータフィールドには適用されません。ユーザー定義変数用に新しいデータフィールドを作成すると、Natural によってフィールド名が割り当てられます。 このフィールド名には数値が含まれます。 新しく作成したフィールドの名前を、プログラムで定義された変数名に調整する必要があります。

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

また、#NAME-START および #NAME-END の両方に同じ属性が定義されていることも確認します。

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

  1. 開始名のデータフィールドを選択し、コンテキストメニューから[定義]を選択します。

    または:
    データフィールドをダブルクリックします。

    [フィールドの定義]ダイアログボックスが表示されます。

    Field definition

    [フィールド]テキストボックスに、Natural によって割り当てられたフィールド名 #FIELD_#1 が表示されます。

  2. [フィールド]テキストボックスに「#NAME-START」と入力します。

    フォーマットは A である必要があります。 これは、デフォルトで選択されています。

  3. [長さ]テキストボックスに、「20」と入力します(フィールドの長さが異なる場合)。

  4. [属性]ボタンを選択します。

    [属性の定義]ダイアログボックスが表示されます。

    Attribute definitions

  5. [I/O 特性]ドロップダウンリストボックスで[出力(変更可)]が選択されていることを確認します。

    これにより、変更可能な出力フィールドとしてフィールドが定義されます。

  6. [大文字/小文字]ドロップダウンリストボックスで[英大文字に変換]が選択されていることを確認します。

    これにより、ユーザーが名前を小文字で入力できるようになります。 これまでは、名前をすべて大文字で指定した場合にのみ、デモデータベースで検出されていました。

  7. [フィラー文字]テキストボックスに、下線(_)文字を入力します。

    空白文字がデフォルトの充填文字として定義されます。 したがって、このフィールドに下線を入力する前に、空白を削除する必要があります。

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

  8. [OK]ボタンを選択して、[属性の定義]ダイアログボックスを閉じます。

  9. [OK]ボタンを選択して、[フィールドの定義]ダイアログボックスを閉じます。

  10. 終了名のデータフィールドについても、上記の手順を繰り返します。 フィールド名(#NAME-END)、フォーマット(A)、長さ(20)が正しく定義されていることを確認します。 #NAME-START と同じ属性が使用されていることを確認します。

システム変数の追加

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

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

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

  1. [挿入]メニューの[インポート]>[システム変数]を選択します。

    または:
    次のツールバーボタンを選択します。

    Import system variable

    [システム変数のインポート]ダイアログボックスが表示されます。

    Import system variable

  2. *DAT4I までスクロールして選択します。

  3. *TIMX までスクロールし、Ctrl キーを押して選択します。

  4. [インポート]ボタンを選択して、選択した変数をインポートします。

    [システム変数のインポート]ダイアログボックスの[キャンセル]ボタンのラベルが[終了]になります。

  5. [終了]ボタンを選択して、ダイアログボックスを閉じます。

    両方のシステム変数が、マップの左上に配置されました。

  6. TT:TT:TT(時刻のシステム変数)を選択し、先頭行の最後に移動します。

    注意:
    行の最後を表示するには、マップエディタウィンドウのサイズを変更する必要がある場合があります。

マップのテスト

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

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

  1. [オブジェクト]メニューの[Run]を選択します。

    または:
    次のツールバーボタンを選択します。

    Test

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

    Test

    注意:
    右上にある時刻を表示するため、出力ウィンドウのサイズを変更する必要がある場合があります。

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

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

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

マップの格納

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

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

  1. マップの格納はプログラムの場合と同じ方法で行います。

  2. マップ名の指定を求められたら、「MAP01」と入力します。

    ライブラリワークスペースで、Maps という名前の新しいノードが TUTORIAL ノードの下に表示されます。 このノードには、格納したマップが含まれています。

    後で修正を加えるために、マップエディタを開いたままにしておきます。

Top of page

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

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

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

  1. プログラムエディタに戻ります。

    (マップエディタウィンドウを前に最大表示したなどの理由で)プログラムエディタが表示されない場合は、[ウィンドウ]メニュー下部にある PGM01 に対応するコマンドを選択することにより、開いているプログラムエディタウィンドウに戻ることができます。

    また、ライブラリワークスペースでプログラム PGM01 をダブルクリックする(キーボードで操作している場合は、プログラムを選択して Enter キーを押す)こともできます。 プログラムが前に閉じられている場合は、再び開きます。 プログラムがバックグラウンドで開いたままになっている場合は、エディタウィンドウが手前に表示されます。

  2. 前に定義した 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
    
  3. プログラムを実行します。

    マップが表示されます。

  4. プログラムエディタに戻るまで繰り返し Enter キーを押すか、Esc キーを押します。。

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

Top of page

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

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

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

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. プログラムを格納します。

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

Top of page