version 11 (Modified)
ORDER BY ({aTable}{; aField}{; > または <}{; aField2; > または <2; ...; aFieldN; > または <N}{; *})
| 引数 | 型 | 説明 | |
| aTable | テーブル | セレクションをソートするテーブル, または | |
| 省略した場合、デフォルトテーブル | |||
| aField | フィールド | 各レベルのソートするフィールド | |
| > または < | 各レベルのソート方向: | ||
| >: 昇順, または | |||
| <: 降順 | |||
| * | ソート継続フラグ |
説明
ORDER BYは、カレントプロセスのaTableのカレントレコードセレクションをソートします。ソートが終了すると、セレクションの先頭レコードがカレントレコードとなります。
aTable引数を省略した場合、デフォルトテーブルがソートされます。デフォルトテーブルが設定されていない場合には、エラーが発生します。
aField、 > または <、 * 引数を指定しない場合、ORDER BYコマンドはaTableを対象とした並び替えエディタを表示します:
並び替えエディタの使用に関する詳細は、4D Design Referenceを参照してください。
ユーザはソートを組み立て、並び替えボタンをクリックしてソートを実行します。ソートが中断されずに実行されると、システム変数OKに1がセットされます。ユーザがキャンセルボタンをクリックすると、ORDER BYは中止されてソートは実行されず、システム変数OKには0がセットされます。
例題
1. 以下の例は[Products]テーブルを対象とした並び替えエディタを表示します:
ORDER BY([Products])
2. 以下の例は、デフォルトテーブルを対象とした並び替えエディタを表示します (デフォルトテーブルが設定されていれば):
ORDER BY
aFieldや> または < を指定すると、標準の並び替えエディタは表示されず、ソートはプログラムで定義されることになります。1つのレベル、または複数のレベルを用いてセレクションのソートを実行することができます。ソートレベルごとに、aFieldにフィールドを、ソート方向として > または < を指定します。> は昇順を、< は降順を意味します。
例題
3. 以下の例は[Products]テーブルのカレントセレクションをnameフィールドで昇順に並べ替えます:
ORDER BY([Products];[Products]Name;>)
4. 以下の例は[Products]テーブルのカレントセレクションをnameフィールドで降順に並べ替えます:
ORDER BY([Products];[Products]Name;<)
5. 以下の例は[Products]テーブルのカレントセレクションをtypeとpriceフィールドで、両レベルとも昇順に並べ替えます:
ORDER BY([Products];[Products]Type;>;[Products]Price;>)
6. 以下の例は[Products]テーブルのカレントセレクションをtypeとpriceフィールドで、両レベルとも降順に並べ替えます:
ORDER BY([Products];[Products]Type;<;[Products]Price;<)
7. 以下の例は[Products]テーブルのカレントセレクションをtypeの昇順およびpriceの降順で並べ替えます:
ORDER BY([Products];[Products]Type;>;[Products]Price;<)
8. 以下の例は[Products]テーブルのカレントセレクションをtypeの降順およびpriceの昇順で並べ替えます:
ORDER BY([Products];[Products]Type;<;[Products]Price;>)
ソート方向引数 > または < を省略すると、デフォルトで昇順が使用されます。
例題
9. 以下の例は[Products]テーブルをnameフィールドで昇順にソートします:
ORDER BY([Products];[Products]Name)
1つのフィールドのみの指定 (1レベルのソート) で、そのフィールドにインデックスが設定されている場合、インデックスを使用してソートします。インデックスが設定されていなかったり、複数のフィールドを指定した場合には、(複合インデックスの場合を除き) ソート処理はシーケンシャルに行われます。フィールドは、並び替えが行われるテーブルに属しているか、aTableへの自動リレートまたはマニュアルリレートが設定された1テーブルに属しています。この場合、ソート処理は常にシーケンシャルに行われます。
ソートされるフィールドの組が複合インデックスである場合、ORDER BYはそのインデックスを使用します
例題
10. 以下の例は、[Products]Nameフィールドにインデックスが設定されている場合は、インデックスソートを実行します:
ORDER BY([Products];[Products]Name;>)
11. 以下の例は、フィールドにインデックスが設定されていてもいなくても、シーケンシャルソートを実行します:
ORDER BY([Products];[Products]type;>;[Products]Price;>)
12. 以下の例は、リレートフィールドを使用してシーケンシャルソートを実行します:
ORDER BY([Invoices];[Companies]Name;>) ` InvoicesはCompaniesーブルのnameフィールドを使用しソートされる
13. データベースに[Contacts]LastName + [Contacts]FirstNameの複合インデックスが設定されている場合、以下の例題は2レベルのソートをインデックスを使用して行います:
ORDER BY([Contacts];[Contacts]LastName ;> ;[Contacts]FirstName ;>)
マルチソート (複数のフィールドによるソート) を実行するために、オプション引数 * を指定してORDER BYを何度も必要なだけ呼び出すことができます。実際のソートを始める最後のORDER BYにはこの引数を渡しません。この設定は、カスタマイズされたユーザインタフェースでの複数キーのソート管理に役立ちます。
警告: このシンタックスを利用した場合はORDER BYのコールごとに1つのソートレベル (フィールド) だけを渡すことができます。
例題
14. アプリケーションモードで表示される出力フォームで、ユーザが列ヘッダをクリックすると昇順にソートが行われるようにします。
Shiftキーを押しながら他の縦の列ヘッダをクリックすると、複数レベルでソートが実行されます:
各列ヘッダには、以下のオブジェクトメソッドが記述されたハイライトボタンが置かれています:
MULTILEVEL (->[CDs]Title) `Title column header button
各ボタンは、列フィールドに対応するポインタを引数に、MULTILEVELプロジェクトメソッドを呼び出します。MULTILEVELプロジェクトメソッドは、以下の通りです:
` MULTILEVEL Project Method
` MULTILEVEL (Pointer)
` MULTILEVEL (->[ーブル]フィールド)
C_POINTER($1) `ソートレベル (フィールド)
C_LONGINT($lLevelNb)
`ソートレベルを取得
If (Not(Shift down)) `1レベルのソート
ARRAY POINTER(aPtrSortField;1)
aPtrSortField{1}:=$1
Else
$lLevelNb:=Find in array(aPtrSortField;$1) `このフィールドは既にソートされいるか?
If ($lLevelNb<0) `されいなければ
INSERT IN ARRAY(aPtrSortField;Size of array(aPtrSortField)+1;1)
aPtrSortField{Size of array(aPtrSortField)}:=$1
End if
End if
`ソートを実行
$lLevelNb:=Size of 配列(aPtrSortField)
If ($lLevelNb>0) `最低1つのソートレベルがある
For ($i;1;$lLevelNb)
ORDER BY([CDs];(aPtrSortField{$i})->;>;*) `ソート定義を構築
End for
ORDER BY([CDs]) `* を省略し、実際のソートを実行する
End if
ソートの定義方法に関係なく、実際のソート処理に時間がかかる場合は、4Dは自動的にサーモメータで進捗状況のメッセージを表示します。MESSAGES ONコマンドとMESSAGES OFFコマンドを使用して、メッセージを表示または非表示にすることができます。進捗サーモメータが表示された場合、ユーザは中止ボタンをクリックしてソートを中止することができます。ソートが正常に終了すると、システム変数OKには1がセットされ、それ以外の場合には0がセットされます。
参照