Versions Compared

Key

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

指定した条件に名前が合致する顧客をすべて表示するファンクションを作成します。その中から特定の顧客を選択し、詳細情報を表示することができます。

処理対象ファイル

物理ファイル「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フィールドが入力を受け付ける状態であることを表します。