7.105.3 SELECT の使用例

例1:明細行ファイル内の、受注番号がフィールド#ODRNUMの値と一致しているすべてのレコードからフィールド#ORDLIN、#PRODUCT、#QUANTITY、および#PRICEを選択して印刷します。

SELECT    FIELDS(#ORDLIN #PRODUCT #QUANTITY #PRICE) FROM_FILE(ORDLIN) WITH_KEY(#ORDNUM)
UPRINT    FIELDS(#ORDLIN #PRODUCT #QUANTITY #PRICE)
ENDSELECT
 

または、以下のように指定しても同じ結果になります。

GROUP_BY  NAME(#ORDERLINE) FIELDS(#ORDLIN #PRODUCT #QUANTITY #PRICE)
 
SELECT    FIELDS(#ORDERLINE) FROM_FILE(ORDLIN) WITH_KEY(#ORDNUM)
UPRINT    FIELDS(#ORDERLINE)
ENDSELECT
 

例2:明細行ファイル内の、#QUANTITY値が10より大きいか#PRICE値が49.99未満のすべてのレコードからフィールド#ORDLIN、#PRODUCT、#QUANTITY、および#PRICEフィールドを選択して印刷します。

SELECT    FIELDS(#ORDLIN #PRODUCT #QUANTITY #PRICE) FROM_FILE(ORDLIN) WHERE('(#QUANTITY *GT 10) *OR (#PRICE *LT 49.99)')
UPRINT    FIELDS(#ORDLIN #PRODUCT #QUANTITY #PRICE)
ENDSELECT
 

または、以下のように指定しても同じ結果になります。

GROUP_BY  NAME(#ORDERLINE) FIELDS(#ORDLIN #PRODUCT #QUANTITY #PRICE)
 
SELECT    FIELDS(#ORDERLINE) FROM_FILE(ORDLIN) WHERE('(#QUANTITY *GT 10) *OR (#PRICE *LT 49.99)')
UPRINT    FIELDS(#ORDERLINE)
ENDSELECT
 

例3:以下のフィールドとデータで構成されるACCOUNTというファイルがあるとします。

会社(#COMP)

部門(#DIV)

課(#DEPT)

支出(#EXPEND)

収入(#REVNU)

01

1

ADM

400

576

"

"

MKT

678

56

"

"

SAL

123

6784

 

 

 

 

 

"

2

ADM

46

52

"

"

SAL

978

456

 

 

 

 

 

"

3

ACC

456

678

"

"

SAL

123

679

 

 

 

 

 

02

1

ACC

843

400

"

"

MKT

23

 

"

"

SAL

876

10

 

 

 

 

 

"

2

ACC

 

43

 

 

また、このファイルではキーとして#COMP、#DIV、および#DEPTが設定されています。SELECTコマンドのNBR_KEYSパラメータを使用して、非常に柔軟なブラウズ・ファンクションを作成します。

DEF_LIST   NAME(#ACCOUNTS)  FIELDS(#COMP #DIV #DEPT #EXPEND #REVNU)
DEFINE     FIELD(#NBRKEYS) TYPE(*DEC) LENGTH(1) DECIMALS(0)
 
BEGIN_LOOP
 
CHANGE     (#COMP #DIV #DEPT) *NULL
REQUEST    FIELDS(#COMP #DIV #DEPT)
 
IF_NULL    FIELD(#COMP #DIV #DEPT)
CHANGE     #NBRKEYS 0
ELSE
IF_NULL    FIELD(#DIV #DEPT)
CHANGE     #NBRKEYS 1
ELSE
IF_NULL    FIELD(#DEPT)
CHANGE     #NBRKEYS 2
ELSE
CHANGE     #NBRKEYS 3
ENDIF
ENDIF
ENDIF
CLR_LIST   NAMED(#ACCOUNTS)
SELECT     FIELDS(#ACCOUNTS) FROM_FILE(ACCOUNT) WITH_KEY(#COMP #DIV #DEPT) NBR_KEYS(#NBRKEYS)
ADD_ENTRY  TO_LIST(#ACCOUNTS)
ENDSELECT
 
DISPLAY    BROWSELIST(#ACCOUNTS)
 
END_LOOP
 

ユーザーがREQUESTコマンドで値を何も入力しない場合、SELECTコマンド実行時の#NBRKEYSの値は0になるため、実質的には、以下のようなSELECTコマンドが実行されることになります。

SELECT     FIELDS(#ACCOUNTS) FROM_FILE(ACCOUNT)
 

この場合、ファイル内のすべてのレコードが表示されます。

ユーザーがREQUESTコマンドで#COMPの値を入力した場合、SELECTコマンド実行時の#NBRKEYSの値は1になり、実質的には、以下のようなSELECTコマンドが実行されることになります。

SELECT  FIELDS(#ACCOUNTS) FROM_FILE(ACCOUNT) WITH_KEY(#COMP)
 

この場合、ファイル内の、要求された会社番号を持つすべてのレコードが表示されます。

ユーザーがREQUESTコマンドで#COMPの値と#DIVの値を入力した場合、SELECTコマンド実行時の#NBRKEYSの値は2になり、実質的には、以下のようなSELECTコマンドが実行されることになります。

SELECT  FIELDS(#ACCOUNTS) FROM_FILE(ACCOUNT) WITH_KEY(#COMP #DIV)
 

この場合、ファイル内の、要求された会社番号と部門番号を持つすべてのレコードが表示されます。

ユーザーがREQUESTコマンドで#COMPの値、#DIVの値、および#DEPTの値を入力した場合、SELECTコマンド実行時の#NBRKEYSの値は3になり、実質的には、以下のようなSELECTコマンドが実行されることになります。

SELECT   FIELDS(#ACCOUNTS) FROM_FILE(ACCOUNT) WITH_KEY(#COMP #DIV #DEPT)
 

この場合、ファイル内の、要求された会社番号、部門番号、および課番号を持つすべてのレコードが表示されます。このとき、指定されたデータに対して表示されるレコードは1つのみです。

例4:NBR_KEYS(*COMPUTE)パラメータを使用して、例3と機能的に同じソリューションを作成します。

DEF_LIST   NAME(#ACCOUNTS)  FIELDS(#COMP #DIV #DEPT #EXPEND #REVNU)
 
BEGIN_LOOP
CHANGE     (#COMP #DIV #DEPT) *NULL
REQUEST    FIELDS(#COMP #DIV #DEPT)
CLR_LIST   NAMED(#ACCOUNTS)
SELECT     FIELDS(#ACCOUNTS) FROM_FILE(ACCOUNT) WITH_KEY(#COMP #DIV #DEPT) NBR_KEYS(*COMPUTE)
ADD_ENTRY  TO_LIST(#ACCOUNTS)
ENDSELECT
DISPLAY    BROWSELIST(#ACCOUNTS)
END_LOOP
 

例5:明細行ファイル内の、受注番号がフィールド#ODRNUMの値と一致しているすべてのレコードからフィールド#ORDLIN、#PRODUCT、#QUANTITY、および#PRICEを選択して印刷します。情報を逆の順序で(すなわち、行番号が大きいものから)印刷します。

GROUP_BY  NAME(#ORDERLINE) FIELDS(#ORDLIN #PRODUCT #QUANTITY #PRICE)
 
SELECT    FIELDS(#ORDERLINE) FROM_FILE(ORDLIN)  WITH_KEY(#ORDNUM) OPTIONS(*BACKWARDS)
UPRINT    FIELDS(#ORDERLINE)
ENDSELECT
 

例6:例5とまったく同じロジックを使用し、印刷される行を3行までにします。

GROUP_BY  NAME(#ORDERLINE) FIELDS(#ORDLIN #PRODUCT #QUANTITY #PRICE)
 
CHANGE    FIELD(#COUNTER) TO(0)
SELECT    FIELDS(#ORDERLINE) FROM_FILE(ORDLIN) WITH_KEY(#ORDNUM) WHERE('#COUNTER *LT 3') OPTIONS(*BACKWARDS *ENDWHERE)
UPRINT    FIELDS(#ORDERLINE)
CHANGE    FIELD(#COUNTER) TO('#COUNTER + 1')
ENDSELECT
 

例7:顧客名を入力するようユーザーに要求します。次に、名前/住所ファイルから、指定された名前に「最も近い」ものから10個の名前を選択し、その詳細を表示します。

DEF_LIST  NAME(#CUSTOMER) FIELDS(#NAME #CUSTNO #ADDR1 #POSTCODE) COUNTER(#NUMCUSTS)
 
REQUEST   FIELDS(#NAME)
CLR_LIST  NAMED(#CUSTOMER)
SELECT    FIELDS(#CUSTOMER) FROM_FILE(NAMES) WITH_KEY(#NAME) WHERE('#NUMCUSTS *LT 10') OPTIONS(*STARTKEY *ENDWHERE)
ADD_ENTRY TO_LIST(#CUSTOMER)
ENDSELECT
DISPLAY   BROWSELIST(#CUSTOMER)
 

例8:現在アクティブなバージョンのファイルORDLINからすべてのフィールドを選択し、このファイルのすべてのフィールドについてさまざまな計算を実行し、選択された各レコードの結果を印刷します。

SELECT    FIELDS(*ALL) FROM_FILE(ORDLIN) WITH_KEY(#ORDNUM)    
.......
.......
.......
 
UPRINT    FIELDS(#RESULT1 #RESULT2 #RESULT3)