データ、つまり出力の開始名と終了名の入力プロンプトをユーザーに対して表示する方法を習得します。
以下の演習を完了すると、サンプルのアプリケーションは次のモジュールで構成されます。
このドキュメントには次の演習が含まれています。
プログラムを修正して、開始名および終了名の入力フィールドが出力に表示されるようにします。これには、INPUT
ステートメントを使用します。
入力フィールドを定義するには
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
プログラムを実行します。
定義したフィールドが出力に表示されます。
Start: ADKINSON End: BENNETT
デフォルト名を使用し、ENTER キーを押します。
従業員のリストが表示されます。
プログラムエディタに戻るまで繰り返し ENTER キーを押すかMORE
プロンプトで「EDIT
」と入力します。
プログラムを格納します。
入力プロンプトをユーザーに表示するさまざまな方法を説明します。マップエディタを使用して、前にプログラムで定義した同じフィールドを含むマップを作成します。マップは別のオブジェクトであり、ユーザーインターフェイスのレイアウトをアプリケーションのビジネスロジックから分離するために使用します。
ここで作成するマップは次のようになります。
XXXXXXXXXX TT:TT:TT Start XXXXXXXXXXXXXXXXXXXX End XXXXXXXXXXXXXXXXXXXX |
マップの最初の行には、現在の日時を示すシステム変数が含まれます。開始名および終了名をユーザーが指定できる 2 つのデータフィールド(入力フィールド)があります。データフィールドの前にはテキストフィールド(ラベル)があります。
上記のマップには、次の手順が必要です。
マップエディタを起動し、マップを設計します。
マップを作成するには
プログラムエディタのコマンド行で、次のいずれかを入力します。
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 つのテキストフィールド(定数またはラベルとも呼ばれる)をマップに追加します。
テキストフィールドを定義するには
[Natural Map Editor]メニューで[ ]を選択し、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 |
方向キーを使用して[ENTER キーを押します。
]を選択し、または:
T キーを押します。
空の画面が表示されます。カーソルを置いてテキストを入力するよう指示するメッセージが表示されます。
4 行目の最初の位置(行および列番号は画面下部に表示されます)にカーソルを移動し、次のように入力します。
Start
まだ ENTER キーを押さないでください。
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 を使用して、フィールド属性とカラー定義との間を切り替えることができます。このチュートリアルでは色は使用しません。
UP-ARROW または DOWN-ARROW を使用して、使用可能な属性をスクロールできます。ウィンドウに "Default" と表示されたら、ENTER キーを押します。"Default" は、フィールドが高輝度表示でなく強調表示でもないことを示します。
これで、フィールドが画面で選択されました。このことは、強調表示された背景によって示されます。
ESC キーを押すと、メニューが再表示されます。
ESC キーは、メニューの表示と非表示を切り替えるために使用されます。定義したテキストフィールドは表示されなくなります。削除されたのではなく、メニューの後ろに消えるだけです。ESC キーをもう一度押すと、メニューが非表示になりフィールドが再表示されます。
最初のテキストフィールドの追加と同じ手順で、2 つ目のテキストフィールドを追加(2 つ目のテキスト定数を定義し、[Default]属性を設定)します。[Start]フィールドの下にある行(行 5)にこのフィールドを配置し、次のように名前を付けます。
End
2 つ目のテキストフィールドを追加したら、ESC キーを押してメニューを再表示します。
新しい[End]フィールドがメニューの真下に表示されます。
2 つのデータフィールドをマップに追加します。これらは、開始名および終了名をユーザーが指定できる入力フィールドです。
データフィールドを定義するには
[
]メニューで、[ ]を選択します。[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) |
[Start]フィールドの後にカーソルを置き(テキストフィールドとデータフィールドの間にスペースを残します)、ENTER キーを押します。
次のウィンドウが表示されます。
+---------------------+ ¦ A Alphanumeric ¦ ¦ B Binary ¦ ¦ D Date ¦ ¦ F Floating Point ¦ ¦ I Integer ¦ ¦ L Logical ¦ ¦ N Numeric ¦ ¦ P Packed Numeric ¦ ¦ T Time ¦ ¦ * System ¦ +---------------------+ |
[A Alphanumeric]を選択します。
選択したフォーマットは、[Extended Field Editing]ウィンドウの [Format]フィールドに表示されます。カーソルは[AL]フィールドに自動的に移動します。
[AL]フィールドに「"20"」を入力します。
これは、データフィールドが長さ 20 文字で定義されることを示します。
TAB キーを押します。
マップでフィールド長が "X" 文字で示されます。
[AD]フィールドが強調表示されるまで、TAB キーを繰り返し押します。
I/O 特性および充填文字を定義します。次の属性定義文字は、[AD]フィールドに現在表示されています。
ILMFHT'_'
I/O 特性は文字 "M" で示されます。充填文字は '_'
で示されます。このチュートリアルでは、これらのデフォルト設定を使用します。次の手順は、この機能の使用方法を単に示しています。この時点で、以下に詳しく説明するように、[Attribute Definition]ウィンドウおよび[Extended Field Editing]ウィンドウも閉じることができます。
注意:
[AD]フィールドにおける属性定義文字の配列順序は変わることがあります。つまり、属性が異なる位置で生じる可能性があります。
PF2 キーを押して、属性定義を編集します。
[Attribute Definition]ウィンドウが表示されます。
+-Attribute Definition--+ ¦Representation ¦ ¦Alignment ¦ ¦I/O Characteristics ¦ ¦Mandatory Characters ¦ ¦Length Characteristics ¦ ¦Upper/Lower Case ¦ ¦Filler Character ¦ +-----------------------+ |
[I/O Characteristics]を選択します。
次のウィンドウが表示されます。
+------------------------+ ¦ A Input, non_protected ¦ ¦ M Output, modifiable ¦ ¦ O Output, protected ¦ +-Esc=Quit, Enter=Toggle-+ |
文字 "M" が[AD]フィールドにすでに表示されている場合は、ESC キーを押してこのウィンドウを終了します。
または:
文字 "M" が[AD]フィールドに表示されていない場合は、[M Output,
modifiable]を選択します。
注意:
同じ属性を何度も選択するとトグル効果が生じ、属性の定義または削除が切り替えられます。
[Attribute Definition]ウィンドウで[Filler Character]を選択します。
新しい充填文字の入力を求めるプロンプトが表示されます。
充填文字を使用して、マップ内の入力フィールドの空の位置を埋めます。これにより、ユーザーは入力時にフィールドの正確な位置と長さを確認することができます。
現在のカーソル位置で下線(_)を入力します。
ENTER キーを押す必要はありません。下線文字を入力すると、メッセージが直ちに非表示になります。
ESC キーを押して、[Attribute Definition]ウィンドウを閉じます。
ENTER キーを押して、[Extended Field Editing]ウィンドウを閉じ、フィールドをマップに格納します。
注意:
ENTER キーの代わりに ESC キーを押すと、新しいデータフィールド定義は保存されず、フィールドはマップに格納されません。
上記の手順と同じ方法で 2 つ目のデータフィールドを追加します。2 つ目のデータフィールドを[End]フィールドの横に配置し、20 文字の長さを定義し、上記と同じ属性定義文字を定義します。
ユーザー定義変数用に新しいデータフィールドを作成すると、Natural によってフィールド名が割り当てられます。このフィールド名には数値が含まれます。新しく作成したフィールドの名前を、プログラムで定義された変数名に調整する必要があります。
同じ名前がプログラムで使用されていることを確認します。#NAME-START
および #NAME-END
。これらのフィールドの出力(ユーザー入力)は、プログラム内の対応するユーザー定義変数に渡されます。
データフィールドの名前を定義するには
方向キーを使用して、開始名のデータフィールドを選択します。
ESC キーを押すと、メニューが再表示されます。
メニューの[
]を選択します。[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"。
[Field]フィールドに「"#NAME-START"」と入力します。
ENTER キーを押します。
終了名のデータフィールドについても上記の手順を繰り返し、フィールド名として「"#NAME-END"」と入力します。
Natural システム変数には、現在のライブラリ、ユーザー、日時など、現在の Natural セッションに関する情報が含まれます。これらは、Natural プログラム内のどこからでも参照できます。システム変数はすべてアスタリスク(*)で始まります。
日時のシステム変数をマップに追加します。プログラムが実行されると、現在の日時がマップに表示されます。
システム変数を追加するには
ESC キーを押すと、メニューが再表示されます。
[
]メニューで、[ ]を選択します。[Extended Field Editing]ウィンドウが表示されます。
画面の左上隅(行 001、列 001)にカーソルを置き、ENTER キーを押します。
次のウィンドウが表示されます。
+---------------------+ ¦ A Alphanumeric ¦ ¦ B Binary ¦ ¦ D Date ¦ ¦ F Floating Point ¦ ¦ I Integer ¦ ¦ L Logical ¦ ¦ N Numeric ¦ ¦ P Packed Numeric ¦ ¦ T Time ¦ ¦ * System ¦ +---------------------+ |
[* 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 を使用して、システム変数のリストをスクロールします。
[*DAT4I]を選択し、ENTER キーを押します。
いくつかの "X" 文字が表示されます。
ENTER キーを押して、[Extended Field Editing]ウィンドウを閉じます。
上記の手順を繰り返し、システム変数 *TIMX を追加します。画面の右上隅(行 001、列 070)に配置します。このシステム変数用に TT:TT:TT が表示されます。ENTER キーを押して、[Extended Field Editing]ウィンドウを閉じることを忘れないでください。
追加したフィールドの再位置決めを行います。
フィールドを移動するには
メニューを表示中に ESC キーを押すと、非表示になります。
方向キーを使用して、開始名のデータフィールド("X" 文字で示されます)を選択します。
データフィールドが強調表示されます。
ESC キーを押すと、メニューが再表示されます。
[
]を選択します。メニューが非表示になります。
方向キーを使用して、強調表示されたフィールドを行の中央に移動します。
ENTER キーを押すと、ドラッグモードが終了します。
開始名および終了名の残りのテキストフィールドとデータフィールドを、上記の手順で行の中央に移動します。開始名および終了名のフィールド間の空行はそのままにします。
このセクションの最初に示したようなマップが表示されます。
マップが意図したとおりに動作するかどうかをテストします。
マップをテストするには
ESC キーを押してメニューを再表示し、[ ]メニューで[ ]を選択します。
次の出力が表示されます。
2009-06-30 13:39:55 Start ____________________ End ____________________ |
開始名の入力フィールドはマップの最初の入力フィールドであるため、自動的に選択されます。どちらの入力フィールドにも、充填文字が含まれています。
注意:
挿入モードで操作する場合、テキストを入力する前に充填文字を削除する必要があります。デフォルトである上書きモードでは、この操作は不要です。
ENTER キーを押して、マップエディタに戻ります。
マップのテストが正常に行われたら、プログラムで検出できるようにするため、マップを格納する必要があります。
マップを Stow するには
ESC キーを押すと、メニューが再表示されます。
[
]メニューで、[ ]を選択します。次のウィンドウが表示されます。
+--Stow Map As: ---+ ¦Name...: ¦ ¦Library: TUTORIAL ¦ +------------------+ |
マップ名として「"MAP01"」と入力し、ENTER キーを押します。
マップの格納が完了したら、WRITE
または INPUT
ステートメントを使用して Natural プログラムから起動できます。
プログラムからマップを起動するには
ESC キーを押してメニューを再表示し、[ ]を選択します。
Natural のメインメニューが再表示され、[Direct Command]ウィンドウで入力を求められます。
次のいずれかを入力して、プログラムエディタに戻ります。
EDIT PGM01
E PGM01
前に定義した 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
プログラムを実行します。
マップが表示されます。
プログラムエディタに戻るまで繰り返し ENTER キーを押すかMORE
プロンプトで「EDIT
」と入力します。
プログラムを格納します。
プログラムをコーディングしても、終了名が指定されていなければデータは検出されません。
開始名および終了名の初期値を削除すると、これらの名前をユーザーが常に指定する必要があります。ユーザーが終了名を指定しなくても、終了名が常に使用されるようにするため、対応するステートメントを追加します。
終了名を使用するには
DEFINE DATA
ブロックで、フィールド #NAME-START
および #NAME-END
のデフォルト値(INIT
)を削除します。対応する行は次のようになります。
1 #NAME-START (A20) 1 #NAME-END (A20)
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
プログラムを実行します。
結果のマップで、開始名の入力を求めるフィールドに「"JONES"」と入力し、ENTER キーを押します。
結果のリストには、"Jones" という名前の従業員のみが表示されます。
ENTER キーを押して、プログラムエディタに戻ります。
プログラムを格納します。
次の演習に進みます。ループおよびラベル