Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

[ Image Removed |../../index.htm#lansa/l4wdev05_0180.htm]
現在地:

...

処理対象ファイル

DEMNACをキーとする物理ファイル「DEMNAME」(氏名と住所の対応ファイル)と、DEMNAMをキーとする論理ビュー「DEMNAMEN」。

フィールド

タイプ

全桁数

説明

DEMNAC

A

7

「氏名と住所」の組に対して与えるコード

DEMNAM

A

25

氏名

DEMAD1

A

25

住所1

DEMAD2

A

25

住所2

DEMAD3

A

25

住所3

DEMPCD

A

4

郵便番号

...

RDMLプログラム/サブルーチン

以下に示すプログラムは「検索」サブルーチンとして働き、他のプログラムから呼び出される形で処理を行います。

ユーザーが直接起動することは想定していません。このプログラムは、顧客の氏名を画面にリスト・ビューします。ユーザーがいずれかを選択すると、

該当するレコードの「コード」と氏名が呼び出し元プログラムに返されるので、これを使ってさらに別の処理を実行できます。

ユーザーはこのとき、画面をスクロールして「次の」ページを表示できるだけでなく、「前の」ページに戻ることもできます。さらに、任意のページに直接「ジャンプ」することも可能です。

     *********

...

* Define work variables and constants
 
DEFINE     #PAGESIZE REFFLD(#LISTCOUNT)

...

 DEFAULT(14)

...


DEFINE     #LISTSIZE REFFLD(#LISTCOUNT)

...


DEFINE     #WORKSIZE REFFLD(#LISTCOUNT)
DEFINE     FIELD(#SEARCHNAM)

...

 REFFLD(#DEMNAM)

...

 
           LABEL('

...

Search for')
DEFINE     FIELD(#TOPPAGNAM)

...

 REFFLD(#DEMNAM)

...

 DEFAULT(X'FF')
DEFINE     FIELD(#BOTPAGNAM)

...

 REFFLD(#DEMNAM)

...

 DEFAULT(*BLANKS)
 
**********

...

 Define identical list to display and list to work with
 
DEF_LIST   NAME(#LIST01)

...

 FIELDS((

...

#SELECTOR 
           *SELECT)(#DEMNAC)(#DEMNAM)(#DEMAD1)(#DEMPCD))

...

 
           COUNTER(#LISTSIZE)
DEF_LIST   NAME(#WORK01)

...

 
           FIELDS((#DEMNAC)(#DEMNAM)(#DEMAD1)(#DEMPCD))

...

 
           COUNTER(#WORKSIZE)

...

 TYPE(*WORKING)

...

 ENTRYS(14)
 
**********

...

 Define a permanent exchange list and file open options

EXCHANGE   FIELDS(#DEMNAC #DEMNAM) OPTION(*ALWAYS)
OPEN       FILE(DEMNAMEN)

...

 USE_OPTION(*ONDEMAND)
 
**********

...

 Process search requests until a name is selected or
**********

...

 function key 24 is used to end the program
 
BEGIN_LOOP
 
   REQUEST    FIELDS((#SEARCHNAM))

...

 BROWSELIST(#LIST01)

...

 
              EXIT_KEY(*NO)

...

 MENU_KEY(*NO)

...

 USER_KEYS((*

...

ROLLUP 
              'Up')(*

...

ROLLDOWN 'Down')

...

 (

...

24 'End'))
 
      CASE       OF_FIELD(#IO$KEY)
 
         WHEN       ('=

...

 UP')            /

...

* Roll up key   */
         EXECUTE    ROLL (UP #BOTPAGNAM)
 
         WHEN       ('=

...

 DN')            /

...

* Roll down key */
         EXECUTE    ROLL (DOWN #TOPPAGNAM)
 
         WHEN       ('=

...

 ''24''')         /

...

* Fnc key 24    */
         CHANGE     FIELD(#DEMNAC)  TO('''?''')
         CHANGE     FIELD(#DEMNAM)  TO(*BLANKS)
         RETURN

...


 
         OTHERWISE                        /* Enter key     */
                SELECTLIST #LIST01 GET_ENTRYS(*SELECT)
                RETURN

...


                ENDSELECT
         EXECUTE    ROLL (UP #SEARCHNAM)
 
      ENDCASE
 
END_LOOP
 
**********     ROLL      :

...

 Roll page backwards/forwards
**********

...

     DIRECTION : Direction to roll (UP/DN)
**********     STARTNAM  :

...

 Name at which to start roll
 
SUBROUTINE ROLL PARMS((#DIRECTION *RECEIVED)
          (#STARTNAM *RECEIVED))
 
DEFINE     FIELD(#DIRECTION)

...

 TYPE(*CHAR)

...

 LENGTH(4)
DEFINE     FIELD(#STARTNAM)  REFFLD(#DEMNAM)
 
CLR_LIST   NAMED(#WORK01)
 
*********

...

  Handle a roll up request
 
IF         COND('

...

#DIRECTION =

...

 UP')
SELECT     FIELDS((#WORK01))

...

 FROM_FILE(DEMNAMEN)

...

 
           WHERE('

...

#WORKSIZE *LT #PAGESIZE') 
           WITH_KEY(#STARTNAM)

...

 OPTIONS(*

...

STARTKEY  
           *ENDWHERE)
ADD_ENTRY  TO_LIST(#WORK01)
ENDSELECT
 
*********

...

  Handle a roll down request
 
ELSE
SELECT     FIELDS((#WORK01))

...

 FROM_FILE(DEMNAMEN)

...

 
           WHERE('

...

#WORKSIZE *LT #PAGESIZE') 
           WITH_KEY(#STARTNAM)

...

 
           OPTIONS(*

...

STARTKEY *

...

ENDWHERE *BACKWARDS)
ADD_ENTRY  TO_LIST(#WORK01)
ENDSELECT
SORT_LIST  NAMED(#WORK01)

...

 BY_FIELDS((#DEMNAM))

...

 /* Important */
ENDIF
 
*********

...

 Map work list to browse list for display
 
CLR_LIST   NAMED(#LIST01)

...


SELECTLIST NAMED(#WORK01)
ADD_ENTRY  TO_LIST(#LIST01)
ENDSELECT
 
*********

...

 Set/save pointers to top and bottom of displayed page

IF         COND('

...

#WORKSIZE =

...

 0')
CHANGE     FIELD(#TOPPAGNAM)

...

 TO(X'FF')
CHANGE     FIELD(#BOTPAGNAM)

...

 TO(*BLANKS)
MESSAGE    MSGTXT('

...

Search request is beyond start or end of names 
           file')
ELSE
GET_ENTRY  NUMBER(1)

...

 FROM_LIST(#WORK01)
CHANGE     FIELD(#TOPPAGNAM)

...

 TO(#DEMNAM)
GET_ENTRY  NUMBER(#WORKSIZE)

...

 FROM_LIST(#WORK01)
CHANGE     FIELD(#BOTPAGNAM)

...

 TO(#DEMNAM)
ENDIF
 
ENDROUTINE
 
The type of RDML program that calls this program would probably include code like this:
*********

...

 Ask user to input a customer name code
 
REQUEST    FIELDS((#DEMNAC)

...

 ....

...

 etc,

...

 etc)
 
*********

...

 Validate name code (with optional search allowed)
 
BEGINCHECK
   IF         COND('

...

#DEMNAC =

...

 ''?''')
   CALL       PROCESS(XXXXXXXXXX)

...

 FUNCTION(YYYYYYY)
   ENDIF
   FILECHECK  FIELD(#DEMNAC)

...

 WITH_FILE(DEMNAME)

...

 
              MSGTXT('No customer with name & address
                      code exists')
ENDCHECK

No customer with name & address                        code exists') ENDCHECK
 
呼び出し元プログラムでは、ユーザーが入力したコード(#DEMNAC)がDEMNAMEファイルに存在するコードかどうか確認し、存在すれば次の処理に進みます。存在しない場合はREQUESTコマンドに制御を戻し、エラー・メッセージを表示します。

ユーザーがコードの代わりに「?」と入力した場合は、上述のファンクションを呼び出しています。画面には顧客リストが現れるので、ユーザーはこの中からいずれかの顧客を選択できます。

実際にユーザーがある氏名を選択すると、対応するコード(DEMNAC)の値が返されます。これをFILECHECKコマンドで確認しています。

一方、ユーザーがどの氏名も選択せず、ファンクション・キー24を押して検索終了を指示した場合は、DEMNACの値として「?」が返されます。この場合、FILECHECKコマンドではレコードが見つからないので、エラー処理が起動されることになります。
[ Image Removed |../../index.htm#lansa/l4wdev05_0180.htm]