Page History
指定した条件に名前が合致する顧客をすべて表示するファンクションを作成します。その中から特定の顧客を選択し、詳細情報を表示することができます。
処理対象ファイル
物理ファイル「CUSMST」(顧客マスター)、論理ファイル「CUSMSTV1」(顧客マスターを顧客名で整列したもの)
バージョン1
GROUP_BY NAME(#CUSTOMER)
...
FIELDS(#CUSTNO #NAME #ADDL1
#ADDL2 #ADDL3)
DEF_LIST NAME(#BROWCUST)
...
FIELDS((
...
#CHOOSE *SELECT)
...
#CUSTNO #NAME) COUNTER(#NUMCUSTS)
BEGIN_LOOP
...
<< Get the customer name >>
REQUEST FIELD(#NAME)
...
<< Build up list of customers with same generic name >>
CLR_LIST NAMED(#BROWCUST)
SELECT FIELDS(#BROWCUST)
...
FROM_FILE(CUSMSTV1)
...
WITH_KEY(#NAME)
...
GENERIC(*YES)
ADD_ENTRY TO_LIST(#BROWCUST)
ENDSELECT
...
<< If none found issue message >>
IF COND('
...
#NUMCUSTS =
...
0')
MESSAGE MSGTXT('
...
No customers found with this name')
ELSE
...
<< else display list for selection >>
DISPLAY BROWSELIST(#BROWCUST)
...
<< process selected customers and display in detail >>
SELECTLIST NAMED
...
(#BROWCUST)...
GET_ENTRYS(*SELECT)
FETCH FIELDS(#CUSTOMER)
...
FROM_FILE(CUSMST)
...
WITH_KEY(#CUSTNO)
DISPLAY FIELDS(#CUSTOMER)
ENDSELECT
ENDIF
END_LOOP
着目点:
GENERIC(*YES)というオプションがあるので、顧客名(#NAME)による一般的な検索処理が自動的に組み込まれます。
バージョン2
GROUP_BY NAME(#CUSTOMER)
...
FIELDS(#CUSTNO #NAME #ADDL1
#ADDL2 #ADDL3)
DEF_LIST NAME(#BROWCUST)
...
FIELDS((
...
#CHOOSE *SELECT)
...
#CUSTNO #NAME) COUNTER(#NUMCUSTS)
DEFINE FIELD(#GENNAME)
...
REFFLD(#NAME)
BEGIN_LOOP
...
<< Display the list - empty on first cycle >>
DISPLAY FIELD((
...
#GENNAME *INPUT))
...
BROWSELIST(#BROWCUST)
...
<< Process any selected entries - none in first cycle >>
CHANGE FIELD(#TOTSELECT)
...
TO(0)
...
SELECTLIST NAMED(#BROWCUST)
...
GET_ENTRYS(*SELECT)
CHANGE FIELD(#TOTSELECT)
...
TO('
...
#TOTSELECT +
...
1')
FETCH FIELDS(#CUSTOMER)
...
FROM_FILE(CUSTMST)
...
WITH_KEY(#CUSTNO)
DISPLAY FIELDS(#CUSTOMER)
...
ENDSELECT
<< If none selected build a new list >>
IF COND('
...
#TOTSELECT =
...
0')
CLR_LIST NAMED(#BROWCUST)
SELECT FIELDS(#BROWCUST)
...
FROM_FILE(CUSMSTV1)
...
WITH_KEY(#GENNAME)
...
GENERIC(*YES)
ADD_ENTRY TO_LIST(#BROWCUST)
ENDSELECT
IF COND('
...
#NUMCUSTS =
...
0')
MESSAGE MSGTXT('
...
No customers found with this name')
ENDIF
ENDIF
END_LOOP
着目点:
BEGIN_LOOP~END_LOOPブロックの先頭にはDISPLAYコマンドがありますが、ループの初回はリストが空なので、何も表示されません。同様にSELECTLISTループでも何も実行されないので、顧客のために検索がなされます。
BEGIN_LOOP~END_LOOPループの2回目以降も、選択状態の顧客名がなければ、顧客名リストを取得し直すことになります。
2通りのプログラムを挙げましたが、「その2」の最大の特徴は、顧客名の検索条件問い合わせ、顧客名リストの表示に、同じ画面フォーマットを使っている、という点です。これに対して「その1」では、別々にフォーマットを設定していました。
#GENNAMEフィールドに設定された*INPUT属性にも注意してください。これは、画面の処理モードにかかわらず、常に#GENNAMEフィールドが入力を受け付ける状態であることを表します。