データ、つまり出力の開始名と終了名の入力プロンプトをユーザーに対して表示する方法を習得します。
以下の演習を完了すると、サンプルのアプリケーションは次のモジュールで構成されます。
このドキュメントには次の演習が含まれています。
プログラムを修正して、開始名および終了名の入力フィールドが出力に表示されるようにします。 これには、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
プログラムを実行します。
定義したフィールドが出力に表示されます。
デフォルト名を使用し、Enter キーを押します。
従業員のリストが表示されます。
プログラムエディタに戻るまで繰り返し Enter キーを押すか、Esc キーを押します。。
プログラムを格納します。
入力プロンプトをユーザーに表示するさまざまな方法を説明します。 マップエディタを使用して、前にプログラムで定義した同じフィールドを含むマップを作成します。 マップは別のオブジェクトであり、ユーザーインターフェイスのレイアウトをアプリケーションのビジネスロジックから分離するために使用します。
ここで作成するマップは次のようになります。
マップの最初の行には、現在の日時を示すシステム変数が含まれます。 開始名および終了名をユーザーが指定できる 2 つのデータフィールド(入力フィールド)があります。 データフィールドの前にはテキストフィールド(ラベル)があります。
上記のマップには、次の手順が必要です。
マップエディタを起動し、マップを設計します。
プログラムエディタをバックグラウンドで開いたままにします。
マップを作成するには
ライブラリワークスペースで、プログラムも含まれているライブラリ(TUTORIAL ノード)を選択します。
コンテキストメニューから、
を選択します。または:
次のツールバーボタンを選択します。
空のマップエディタウィンドウが表示されます。
2 つのテキストフィールド(定数またはラベルとも呼ばれる)をマップに追加します。
テキストフィールドを定義するには
メニューの を選択します。
注意:
マップエディタがアクティブの場合、メニューバーに異なるメニューが表示されます。 (プログラムエディタがアクティブのときに表示される メニューの代わりに) 、 、および メニューが表示されます。
または:
次のツールバーボタンを選択します。
注意:
デフォルトでは、このボタンを含むツールバーは、マップエディタウィンドウの右側で縦に表示されます。 プログラムエディタがアクティブのときは、異なるツールバーがここに表示されていました。
マップエディタウィンドウでテキスト定数を挿入する位置にマウスを移動します。
マウスポインタの表示が十字およびテキスト定数シンボルに変わります。
マウスボタンを押し続けます。
フィールドが希望の長さになるまでマウスを右にドラッグします。 ここでは、フィールド長は約 10 文字で十分です。
マウスをドラッグすると、現在の長さがアプリケーションウィンドウのステータスバーに表示されます。 フォーマットおよびマップにおける位置もステータスバーに表示されます。 テキストフィールドは常にフォーマット A
(英数字)になります。
マウスボタンを放します。
デフォルトのラベルを持つテキストフィールドが表示されます。 ハンドルは、テキストフィールドが選択されていることを示します。 マウスポインタには引き続き十字およびテキスト定数シンボルが表示され、別のテキストフィールドを直ちに描画できます。
注意:
このモードを終了するには、マップエディタ内の他の位置をクリックします。
最初のテキストフィールドの下に 2 つ目のテキストフィールドを描画します。
フィールドの開始列に誤りがある場合は、そのフィールドにマウスポインタを置き、マウスボタンを押し続けて目的の位置にドラッグすると、フィールドを移動できます。 マウスボタンを放すと、通常のマウスポインタが再表示されます。
挿入したテキストフィールドには、正しいラベルがまだ付いていません。 ここで、ラベルを指定します。
ラベルを指定するには
最初のテキストフィールドを選択し、コンテキストメニューから
を選択します。または:
テキストフィールドをダブルクリックします。
既存のテキストが選択されます。
最初のテキストフィールドのラベルに「Start:」と入力し、Enter キーを押します。
テキストフィールド(長さが 10 文字で定義済み)が、この文字列の長さに自動的にサイズ変更されます。
上記の手順を繰り返し、2 つ目のテキストフィールドのラベルに「End:」と入力します。
2 つのデータフィールドをマップに追加します。 これらは、開始名および終了名をユーザーが指定できる入力フィールドです。
データフィールドは 2 つの方法で定義できます。
コマンドでは、データフィールドに正しいフォーマットと長さを定義する必要があります。または、 コマンドでは、データフィールドをリストから選択するだけで、正しいフォーマットと長さが自動的に使用されます。 これらの 2 つの方法について、以下で説明します。長さを指定する必要のあるデータフィールドを定義するには
メニューの を選択します。
または:
次のツールバーボタンを選択します。
開始名用として前に挿入したテキストフィールドの右に、データフィールドを描画します。 テキストフィールドと同じように描画します。 データフィールドには 20 文字の長さが必要です(フィールド長が短すぎるまたは長すぎる場合、後述の演習で長さを修正する方法を示します)。 データフィールドは、"X" 文字で自動的に埋められます。
データフィールドをインポートするには
メニューの を選択します。
[データフィールドのインポート]ダイアログボックスが表示されます。
[ライブラリ]ドロップダウンリストボックスから[TUTORIAL]を選択します。
[プログラム]オプションボタンを選択します。
ライブラリで現在定義されているすべてのプログラムが、[オブジェクト]リストボックスに表示されます。
PGM01
という名前のプログラムを選択します。
インポートできるデータフィールドがダイアログボックスの下部に表示されます。
フィールド #NAME-END
を選択し、 ボタンを選択します。
[データフィールドのインポート]ダイアログボックスの ボタンのラベルが になります。
[データフィールドのインポート]ダイアログボックスを閉じます。
ボタンを選択して、データフィールドがマップの左上に表示されます。 データフィールドは "X" 文字で埋められます。 ハンドルは、データフィールドが選択されていることを示します。
終了名用として前に定義したテキストフィールドの右に、データフィールドを移動します。 これを行うには、データフィールドにマウスポインタを置き、マウスボタンを押し続けてマウスを目的の位置にドラッグしてから、マウスボタンを放します。
次の説明は、手動で定義した開始名のデータフィールドに対してのみ適用されます。 インポートした終了名のデータフィールドには適用されません。ユーザー定義変数用に新しいデータフィールドを作成すると、Natural によってフィールド名が割り当てられます。 このフィールド名には数値が含まれます。 新しく作成したフィールドの名前を、プログラムで定義された変数名に調整する必要があります。
同じ名前 #NAME-START
および #NAME-END
がプログラムで使用されていることを確認します。 これらのフィールドの出力(ユーザー入力)は、プログラム内の対応するユーザー定義変数に渡されます。
また、#NAME-START
および #NAME-END
の両方に同じ属性が定義されていることも確認します。
データフィールドの名前と属性を定義するには
開始名のデータフィールドを選択し、コンテキストメニューから
を選択します。または:
データフィールドをダブルクリックします。
[フィールドの定義]ダイアログボックスが表示されます。
[フィールド]テキストボックスに、Natural によって割り当てられたフィールド名 #FIELD_#1
が表示されます。
[フィールド]テキストボックスに「#NAME-START」と入力します。
フォーマットは A である必要があります。 これは、デフォルトで選択されています。
[長さ]テキストボックスに、「20」と入力します(フィールドの長さが異なる場合)。
ボタンを選択します。
[属性の定義]ダイアログボックスが表示されます。
[I/O 特性]ドロップダウンリストボックスで[出力(変更可)]が選択されていることを確認します。
これにより、変更可能な出力フィールドとしてフィールドが定義されます。
[大文字/小文字]ドロップダウンリストボックスで[英大文字に変換]が選択されていることを確認します。
これにより、ユーザーが名前を小文字で入力できるようになります。 これまでは、名前をすべて大文字で指定した場合にのみ、デモデータベースで検出されていました。
[フィラー文字]テキストボックスに、下線(_)文字を入力します。
空白文字がデフォルトの充填文字として定義されます。 したがって、このフィールドに下線を入力する前に、空白を削除する必要があります。
充填文字を使用して、マップ内の入力フィールドの空の位置を埋めます。これにより、ユーザーは入力時にフィールドの正確な位置と長さを確認することができます。
[属性の定義]ダイアログボックスを閉じます。
ボタンを選択して、[フィールドの定義]ダイアログボックスを閉じます。
ボタンを選択して、終了名のデータフィールドについても、上記の手順を繰り返します。 フィールド名(#NAME-END
)、フォーマット(A)、長さ(20)が正しく定義されていることを確認します。 #NAME-START
と同じ属性が使用されていることを確認します。
Natural システム変数には、現在のライブラリ、ユーザー、日時など、現在の Natural セッションに関する情報が含まれます。 これらは、Natural プログラム内のどこからでも参照できます。 システム変数はすべてアスタリスク(*)で始まります。
日時のシステム変数をマップに追加します。 プログラムが実行されると、現在の日時がマップに表示されます。
システム変数を追加するには
メニューの を選択します。
または:
次のツールバーボタンを選択します。
[システム変数のインポート]ダイアログボックスが表示されます。
*DAT4I
までスクロールして選択します。
*TIMX
までスクロールし、Ctrl キーを押して選択します。
ボタンを選択して、選択した変数をインポートします。
[システム変数のインポート]ダイアログボックスの ボタンのラベルが になります。
ボタンを選択して、ダイアログボックスを閉じます。
両方のシステム変数が、マップの左上に配置されました。
TT:TT:TT(時刻のシステム変数)を選択し、先頭行の最後に移動します。
注意:
行の最後を表示するには、マップエディタウィンドウのサイズを変更する必要がある場合があります。
マップが意図したとおりに動作するかどうかをテストします。
マップをテストするには
メニューの を選択します。
または:
次のツールバーボタンを選択します。
次の出力が表示されます。
注意:
右上にある時刻を表示するため、出力ウィンドウのサイズを変更する必要がある場合があります。
開始名の入力フィールドはマップの最初の入力フィールドであるため、自動的に選択されます。 どちらの入力フィールドにも、充填文字が含まれています。
注意:
挿入モードで操作する場合、テキストを入力する前に充填文字を削除する必要があります。 上書きモードでは、この操作は不要です。
Enter キーを押して、マップエディタに戻ります。
マップのテストが正常に行われたら、プログラムで検出できるようにするため、マップを格納する必要があります。
マップを Stow するには
マップの格納はプログラムの場合と同じ方法で行います。
マップ名の指定を求められたら、「MAP01」と入力します。
ライブラリワークスペースで、Maps という名前の新しいノードが TUTORIAL ノードの下に表示されます。 このノードには、格納したマップが含まれています。
後で修正を加えるために、マップエディタを開いたままにしておきます。
マップの格納が完了したら、WRITE
または INPUT
ステートメントを使用して Natural プログラムから起動できます。
プログラムからマップを起動するには
プログラムエディタに戻ります。
(マップエディタウィンドウを前に最大表示したなどの理由で)プログラムエディタが表示されない場合は、PGM01
に対応するコマンドを選択することにより、開いているプログラムエディタウィンドウに戻ることができます。
また、ライブラリワークスペースでプログラム PGM01
をダブルクリックする(キーボードで操作している場合は、プログラムを選択して Enter キーを押す)こともできます。 プログラムが前に閉じられている場合は、再び開きます。 プログラムがバックグラウンドで開いたままになっている場合は、エディタウィンドウが手前に表示されます。
前に定義した 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 キーを押すか、Esc キーを押します。。
プログラムを格納します。
プログラムをコーディングしても、終了名が指定されていなければデータは検出されません。
開始名および終了名の初期値を削除すると、これらの名前をユーザーが常に指定する必要があります。 ユーザーが終了名を指定しなくても、終了名が常に使用されるようにするため、対応するステートメントを追加します。
終了名を使用するには
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 キーを押して、プログラムエディタに戻ります。
プログラムを格納します。
次の演習「ループおよびラベル」に進みます。