7.83.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 |
0 |
" |
" |
SAL |
876 |
10 |
|
|
|
|
|
" |
2 |
ACC |
0 |
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)