データ、つまり出力の開始名と終了名の入力プロンプトをユーザーに対して表示する方法を習得します。
以下の演習を完了すると、サンプルのアプリケーションは次のモジュールで構成されます。
このドキュメントには次の演習が含まれています。
プログラムを修正して、開始名および終了名の入力フィールドが出力に表示されるようにします。 これには、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 キーを押すか、Esc MORE
プロンプトで「EDIT
」と入力します。
プログラムを格納します。
入力プロンプトをユーザーに表示するさまざまな方法を説明します。 マップエディタを使用して、前にプログラムで定義した同じフィールドを含むマップを作成します。 マップは別のオブジェクトであり、ユーザーインターフェイスのレイアウトをアプリケーションのビジネスロジックから分離するために使用します。
ここで作成するマップは次のようになります。
Ob _ Ob D CLS ATT DEL CLS ATT DEL . . T D Blnk T I ? . . A D _ A I ) . . A N ^ M D & . . M I : O D + . . O I ( . . 001 --010---+----+----+---030---+----+----+---050---+----+----+---070---+---- (XXXXXXXXXX (XXXXXXXX Start :XXXXXXXXXXXXXXXXXXXX End :XXXXXXXXXXXXXXXXXXXX Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Mset Exit Test Edit -- - + Full < > Let |
マップの最初の行には、現在の日時を示すシステム変数が含まれます。 開始名および終了名をユーザーが指定できる 2 つのデータフィールド(入力フィールド)があります。 データフィールドの前にはテキストフィールド(ラベル)があります。
フィールドの長さは "X" 文字の数で示されます。 デリミタは異なるタイプのフィールドを区別するために使用されます。 サンプルマップでは、次のデフォルトデリミタを使用します。
デリミタ | フィールドタイプ |
---|---|
( | システム変数。 |
: | データフィールド |
上記のマップには、次の手順が必要です。
マップエディタを起動し、マップを設計します。 マップエディタには、[Edit Map]メニューを使用してアクセスします。
[Edit Map]メニューにアクセスするには
プログラムエディタのコマンド行で「.」(ピリオド)を入力して、[Development Functions]メニューに戻ります。
[Development Functions]メニューの下部で、次の情報を入力して Enter キーを押します。
Code .. E Type .. M Name .. ________________________________ Command ===> Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Menu Exit Canc |
"E" は[Edit Object]機能、"M" はオブジェクトタイプマップを示します。
注意:
[Create Object]用のコード「C」を入力することもできます。 ただし、この場合は、オブジェクト名の入力プロンプトが表示されます。
[Edit Map]メニューが表示されます。
16:43:41 ***** NATURAL MAP EDITOR ***** 2007-03-20 User SAG - Edit Map - Library TUTORIAL Code Function ---- --------------------------------- D Field and Variable Definitions E Edit Map I Initialize new Map H Initialize a new Help Map M Maintenance of Profiles & Devices S Save Map T Test Map W Stow Map ? Help . Exit Code .. I Name .. ________ Profile .. SYSPROF_ Command ===> Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Exit Test Edit |
新しいマップを初期化するには
[Edit Map]メニューの下部で、次の情報を入力して Enter キーを押します。
Code .. I Name .. MAP01___ Profile .. SYSPROF_ Command ===> Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Exit Test Edit |
[Define Map Settings]画面が表示されます。
16:43:42 Define Map Settings for MAP 2007-03-20 Delimiters Format Context ----------------- --------------------------- -------------------------- Cls Att CD Del Page Size ...... 23 Device Check .... ________ T D BLANK Line Size ...... 79 WRITE Statement _ T I ? Column Shift ... 0 (0/1) INPUT Statement X A D _ Layout ......... ________ Help ____________________ A I ) dynamic ....... N (Y/N) as field default N (Y/N) A N ^ Zero Print ..... N (Y/N) M D & Case Default ... UC (UC/LC) M I : Manual Skip .... N (Y/N) Automatic Rule Rank 1 O D + Decimal Char ... . Profile Name .... SYSPROF O I ( Standard Keys .. N (Y/N) Justification .. L (L/R) Filler Characters Print Mode ..... __ ------------------------ Optional, Partial .... Control Var .... ________ Required, Partial .... Optional, Complete ... Required, Complete ... Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Exit Let |
この画面で、マップのデフォルト設定(マップのサイズなど)を定義します。 この画面ではデリミタ文字を変更できます。 ただし、このチュートリアルではデフォルトのデリミタ文字を使用します。 充填文字のみを定義します(次の手順を参照)。
デリミタ文字は、フィールドに割り当てられたクラスと属性の組み合わせを示します。 このチュートリアルでは、太字で示すデリミタを使用します。
Delimiters ----------------- Cls Att CD Del T D BLANK T I ? A D _ A I ) A N ^ M D & M I : O D + O I ( |
コロンは、変更可能な入力および出力フィールド(Cls 列の "M")および高輝度フィールド(Att 列の "I")を示します。
左カッコは、出力専用フィールド(Cls 列の "O")および高輝度フィールド(Att 列の "I")を示します。
デリミタ文字を使用しない(画面に "BLANK" と表示される)と、フィールドがデフォルト属性(Att 列の "D")を持つテキスト定数(Cls 列の "T")であるとみなされます。
次に示すように、充填文字オプションごとに下線(_)を入力します。
Filler Characters ------------------------ Optional, Partial .... _ Required, Partial .... _ Optional, Complete ... _ Required, Complete ... _ |
充填文字は、マップ内の入力フィールドの空の位置を埋めるために使用されます。これにより、ユーザーは入力時にフィールドの正確な位置と長さを確認することができます。
Enter キーを押して、変更内容を保存します。
Enter キーをもう一度押して、マップ編集エリアを呼び出します。
マップ編集エリアは、画面分割モードで表示されます。
Ob _ Ob D CLS ATT DEL CLS ATT DEL . . T D Blnk T I ? . . A D _ A I ) . . A N ^ M D & . . M I : O D + . . O I ( . . 001 --010---+----+----+---030---+----+----+---050---+----+----+---070---+---- Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Mset Exit Test Edit -- - + Full < > Let |
注意:
[Define Map Settings]画面は、新しいマップを初期化する場合にのみ表示されます。 マップを編集しているときにマップ編集エリアで PF2(Mset)キーを押すと、[Define Map Settings]画面が呼び出されます。
画面分割モードでは、画面の上半分に有効なデリミタ文字が表示されます。 画面の下半分は、マップを作成するための編集エリアです。
プログラムエディタおよびデータエリアエディタ(このチュートリアルで後述)と異なり、マップエディタには Natural システムコマンドを入力できるコマンド行またはコマンドプロンプトはありません。 マップエディタの多くの機能は、行コマンドまたはフィールドコマンドを使用して(以下を参照)、または PF キーを使用して実行されます。
PF9 キーを押すと、画面分割モードとフルスクリーンモード(編集エリアをフルサイズで表示)を切り替えることができます。
2 つのテキストフィールド(定数またはラベルとも呼ばれる)をマップに追加します。
テキストフィールドを定義するには
マップ編集エリアで、4 行目の最初の位置にカーソルを移動し、次のように入力します。
Start
次の行の最初の位置にカーソルを移動し、次のように入力します。
End
マップは次のようになります。
Ob _ Ob D CLS ATT DEL CLS ATT DEL . . T D Blnk T I ? . . A D _ A I ) . . A N ^ M D & . . M I : O D + . . O I ( . . 001 --010---+----+----+---030---+----+----+---050---+----+----+---070---+---- Start End Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Mset Exit Test Edit -- - + Full < > Let |
注意:
最後の変更を取り消すには、Enter キーを押す前に PF12 キーを押します。
2 つのデータフィールドをマップに追加します。 これらは、開始名および終了名をユーザーが指定できる入力フィールドです。
データフィールドは 2 つの方法で定義できます。従来の方法であるデータフィールドに正しい長さを定義する必要があります。または、ユーザーフレンドリなデータフィールドをリストから選択するだけで、正しい長さが自動的に使用されます。 これらの 2 つの方法について、以下で説明します。
長さを指定する必要のあるデータフィールドを定義するには
Start テキストフィールドの後に次のように入力します(テキストフィールドとデータフィールドの間にスペースを残します)。
:X(20)
コロン(:)はデリミタ文字であり、データフィールドが変更可能で、強化されていることを示します。 データフィールドの長さは 20 文字で定義されています。 フィールドの長さは "X" 文字で示されています。
Enter キーを押します。
マップは次のようになります。
Ob _ Ob D CLS ATT DEL CLS ATT DEL . . T D Blnk T I ? . . A D _ A I ) . . A N ^ M D & . . M I : O D + . . O I ( . . 001 --010---+----+----+---030---+----+----+---050---+----+----+---070---+---- Start :XXXXXXXXXXXXXXXXXXXX End Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Mset Exit Test Edit -- - + Full < > Let |
データフィールドをリストから選択するには
画面の左上にある[Ob]フィールドで次のように入力し、Enter キーを押します。
P PGM01
プログラム PGM01
で現在使用しているデータフィールドが画面に表示されます。 マップで使用できるフィールドの前には、番号が付きます。
Ob P PGM01 Ob D CLS ATT DEL CLS ATT DEL 1 #NAME-START A20 . T D Blnk T I ? 2 #NAME-END A20 . A D _ A I ) . EMPLOYEES-VIEW *V1 . A N ^ M D & . FULL-NAME *2 . M I : O D + 3 NAME A20 . O I ( 4 DEPT A6 . 001 --010---+----+----+---030---+----+----+---050---+----+----+---070---+---- Start :XXXXXXXXXXXXXXXXXXXX End Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Mset Exit Test Edit -- - + Full < > Let |
PGM01
で定義されているすべてのデータフィールドが画面に表示されるわけではありません。 データフィールドリストのページをスクロールするには、[Ob]フィールド(文字 "P" が現在含まれているフィールド)で次のいずれかの配置コマンドを入力します。
コマンド | 説明 |
---|---|
+ |
リストの次のページに進みます。 |
- |
リストの前のページに進みます。 |
++ |
リストの最後にジャンプします。 |
-- |
リストの先頭にジャンプします。 |
End テキストフィールドの後に次のように入力し(テキストフィールドとデータフィールドの間にスペースを残します)、Enter キーを押します。
:2
コロン(:)はデリミタ文字であり、データフィールドが変更可能で、強化されていることを示します。 2 は #NAME-END
に割り当てられた番号です。
正しい長さ(この場合は 20 文字)でデータフィールドが自動的に定義されます。 フィールドの長さは "X" 文字で示されています。
次の説明は、手動で定義した開始名のデータフィールドに対してのみ適用されます。 リストから選択した終了名のデータフィールドには適用されません。ユーザー定義変数用に新しいデータフィールドを作成すると、Natural によってフィールド名が割り当てられます。 このフィールド名には数値が含まれます。 新しく作成したフィールドの名前を、プログラムで定義された変数名に調整する必要があります。
同じ名前 #NAME-START
および #NAME-END
がプログラムで使用されていることを確認します。 これらのフィールドの出力(ユーザー入力)は、プログラム内の対応するユーザー定義変数に渡されます。
データフィールドの名前を定義するには
開始名のデータフィールドの最初の位置から開始して、次のように入力し、Enter キーを押します。
.E
または:
データフィールド内の任意の場所にカーソルを置き、PF5 を押します。
指定したフィールドに対する拡張フィールド編集セクションが表示されます。
Fld #001 Fmt A20 ------------------------------------------------------------------------------- AD= MIT'_'____ ZP= SG= HE= _____________________ Rls 0 AL= _____ CD= __ CV= ________________________________ Mod Undef PM= __ DF= DY= ______________________________ EM= __________________________ SB= ________________________________ 001 --010---+----+----+---030---+----+----+---050---+----+----+---070---+---- Start .EXXXXXXXXXXXXXXXXXXX End :XXXXXXXXXXXXXXXXXXXX Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- HELP Mset Exit <--- ---> -- - + < > Let |
画面の左上隅にある[Fld]フィールドに、Natural によって割り当てられたフィールド名 "#001" が表示されます。
[Fld]フィールドに「#NAME-START」と入力します。
拡張フィールド編集セクションを終了するには、PF3 を押します。
終了値のデータフィールドは前の演習でリストから選択されているため、終了名について上記の手順を繰り返す必要はありません。 この場合、#NAME-END
は定義済みです。 必要に応じて、上記で説明したように、行コマンド .E
を使用してこれをチェックできます。
注意:#NAME-END
には、#NAME-START
で定義されなかった追加の値 "L" がセッションパラメータ AD
に存在します。 "L" は、フィールドの値が左揃えで表示されることを示します。 これは英数字フィールドのデフォルト値であるため、#NAME-START
に対して定義する必要はありません。
Natural システム変数には、現在のライブラリ、ユーザー、日時など、現在の Natural セッションに関する情報が含まれます。 これらは、Natural プログラム内のどこからでも参照できます。 システム変数はすべてアスタリスク(*)で始まります。
日時のシステム変数をマップに追加します。 プログラムが実行されると、現在の日時がマップに表示されます。
システム変数を追加するには
先頭行の最初の位置にカーソルを移動し、次のように入力します。
(*DAT4I
左カッコは、出力専用および強調表示としてシステム変数を識別するデリミタ文字です。
2 番目の行の最初の位置にカーソルを移動し、次のように入力します。
(*TIMX
マップは次のようになります。
001 --010---+----+----+---030---+----+----+---050---+----+----+---070---+---- (*DAT4I (*TIMX Start :XXXXXXXXXXXXXXXXXXXX End :XXXXXXXXXXXXXXXXXXXX |
Enter キーを押します。
システム変数名の代わりに "X" 文字が表示されます。
行コマンドおよびフィールドコマンドを使用して、追加したフィールドの再位置決めを行います。
1 つのフィールドを移動するには
2 行目のシステム変数の最初の位置から開始して、次のフィールドコマンドを入力します。
.M
例:
001 --010---+----+----+---030---+----+----+---050---+----+----+---070---+---- (XXXXXXXXXX .MXXXXXXX Start :XXXXXXXXXXXXXXXXXXXX End :XXXXXXXXXXXXXXXXXXXX |
フィールドの先頭からフィールドコマンドが入力されています。 これは、入力するフィールドに対してのみ適用されます。
システム変数の移動先となる位置(先頭行の列 70)にカーソルを移動します。
Enter キーを押します。
システム変数がカーソル位置に移動されます。
空行を挿入するには
4 行目(開始名)の最初の位置から開始して、次の行コマンドを入力します。
..I(1)
例:
001 --010---+----+----+---030---+----+----+---050---+----+----+---070---+---- (XXXXXXXXXX (XXXXXXXX ..I(1):XXXXXXXXXXXXXXXXXXXX End :XXXXXXXXXXXXXXXXXXXX |
行の先頭から行コマンドが入力されています。 これは、入力する行全体に対して適用されます。
Enter キーを押します。
行コマンドを入力した行の下に空行が挿入されます。
行を中央揃えにするには
4 行目(開始名)の最初の位置から開始して、次の行コマンドを入力します。
..C
例:
001 --010---+----+----+---030---+----+----+---050---+----+----+---070---+---- (XXXXXXXXXX (XXXXXXXX ..Crt :XXXXXXXXXXXXXXXXXXXX End :XXXXXXXXXXXXXXXXXXXX |
Enter キーを押します。
行が中央揃えになります。
複数のフィールドを移動するには
6 行目(End)のテキストフィールドの最初の位置およびこの行のデータフィールドの最初の位置から開始して、次のフィールドコマンドを入力します。
.M
例:
001 --010---+----+----+---030---+----+----+---050---+----+----+---070---+---- (XXXXXXXXXX (XXXXXXXX Start :XXXXXXXXXXXXXXXXXXXX .Md .MXXXXXXXXXXXXXXXXXXX |
テキストフィールドの開始位置(6 行目の列 30)にカーソルを移動します。
Enter キーを押します。
両方のフィールドが移動します。
このセクションの最初に示したようなマップが表示されます。
マップが意図したとおりに動作するかどうかをテストします。
マップをテストするには
PF4 キーを押します。
次の出力が表示されます。
2007-03-20 13:39:55 Start ____________________ End ____________________ |
開始名の入力フィールドはマップの最初の入力フィールドであるため、自動的に選択されます。 どちらの入力フィールドにも、充填文字が含まれています。
注意:
挿入モードで操作する場合、テキストを入力する前に充填文字を削除する必要があります。 デフォルトである上書きモードでは、この操作は不要です。
Enter キーを押して、マップエディタに戻ります。
マップのテストが正常に行われたら、プログラムで検出できるようにするため、マップを格納する必要があります。
マップを Stow するには
PF3 を押して[Edit Map]メニューに戻ります。
[Code]フィールドに次のように入力し、Enter キーを押します。
W
マップの格納が完了したら、WRITE
または INPUT
ステートメントを使用して Natural プログラムから起動できます。
プログラムからマップを起動するには
[Edit Map]メニューのコマンド行で次のいずれかを入力して、プログラムエディタに戻ります。
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 キーを押すか、Esc 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 キーを押して、プログラムエディタに戻ります。
プログラムを格納します。
次の演習「ループおよびラベル」に進みます。