前のブログ投稿で、ORDA クエリーの中で式を適用して、洗練された複雑な検索条件をどのように構築するかを説明しました。さらに完全で強力な開発ツールを使って提供できるのが、新しいORDA メソッドのorderByFomula() です。formulas の助けによって、プロジェクト・メソッドあるいは4D式の中で複雑な条件を使ってエンティティ・セレクションのソートができます。
ソート条件は、式がストリングあるいは Formula オブジェクトとしてorderByFormula() メソッドに与えられた時に評価されます。
Stringとして式をソートする
ここにデータクラス、Companiesがあります。これからこの企業を収益(収益 = 収入 - 支出)を基にソートします。
エンティティはThis コマンドでアクセスすることに注意しましょう。
C_OBJECT($companies;$orderedCompanies;$formula)
$formula:= Formula(This.revenue - This.costs)
$companies:=ds.Companies.all()
$orderedCompanies:=$companies.orderByFormula ($formula;dk descending)
Formulaオブジェクトを使ったソート
では同じ条件を使って企業をソートしますが、ストリングの代わりに、Formula オブジェクトを使い、降順でソートします。
C_OBJECT($companies;$orderedCompanies;$formula)
$formula:= Formula(This.revenue - This.costs)
$companies:=ds.Companies.all()
$orderedCompanies:=$companies.orderByFormula ($formula;dk descending)
Formula オブジェクトを使うことで、式をストリングとして使うよりもいくつかの利点(自動補完、コードエディター内の色指定、など)があります。
orderByFomula() メソッドはさらに多くのオプションがあります。詳しくはドキュメントをチェックし、上記のサンプルデータベース (HDI)をダウンロードしてください。
エンティティ・セレクションのソートについて
query() メンバーメソッド自体の内部にorder by ステートメントを挿入することができます。これはクラアント/サーバー・モードで使う場合には大きな利点で、クエリーとソートアクションを同じリクエスト中に組み合わせることができ、サーバーとネットワークトラフィックに送られるリクエストの数を減らします。
C_OBJECT($companies)
$companies:=ds.Companies.query("revenue> :1 order by costs desc";5000)