ORDAでは複数のエンティティセレクションを同時に扱うことができるため、プロジェクトメソッドやORDAデータモデルクラスの関数にパラメータとしてエンティティセレクションを渡すことで、これを利用することができると思います。
オブジェクト指向プログラミングで、できるだけ少ないコード行数で効率的に作業するためには、堅牢で最適化された関数が必要です。そのため、4D v19 R3では、entitySelectionオブジェクトで利用できる新しい関数 selected()関数です。
そのおかげで、2つのエンティティセレクションを検査したり比較したりすることができます。それでは、詳細をご覧ください。
新しい関数 selected()
2つのエンティティセレクションentitySel1 と entitySel2 が与えられたとき、この関数は entitySel1 の中にある entitySel2 のエンティティのインデックスを返します。
わかりましたか?以下はその例です。
var $invoices
; : . : := . . := . . ("payment = :1"; "Cash") $selection csInvoicesSelection
var $result Object$invoicesdsInvoicesall()
$selectiondsInvoicesquery
$result := . ($invoicesselected$selection
)
// $result = {ranges:[{start:1,end:1},{start:9,end:12},{start:18,end:18},{start:21,end:25}]}
この selected()関数は、オブジェクトのコレクションであるranges プロパティを持つオブジェクトを返します。
これらのオブジェクトは、エンティティの範囲(開始 # 終了)または単一のエンティティ(開始 = 終了)を指定する。
全請求書のうち、payment = “Cash “を持つInvoices のエンティティは、インデックスを持つエンティティです。
- 1
- 9から12
- 18
- 21から25
具体的な使用例
さまざまなテーマ(歴史、芸術、科学、…)の本がある図書館を想像してください。ここに「本」テーブルがあります。
HTML ページでは、特定の主題に関する書籍をハイライト表示したい。
そのために、highlight プロジェクトメソッドを subject パラメータを持つ4DACTIONとして呼び出します。
highlight プロジェクトメソッドコード
var $index :Integer
var $subject ;$text:Text
var $onSubject :cs.BooksSelection
var $indices//Get the subject;$range:Object
var $titles :Collection
var $i :Integer
ARRAY TEXT ($anames; 0 )
ARRAY TEXT ($avalues; 0
WEB GET VARIABLES $anames ;$avalues)
$index :=Find in array($anames; "subject")
$subject :=$avalues{$index}
//Search books about the given $subject
$onSubject:=ds.Books.query("subject = :1";$subject)
//Get ranges of books about the subject
$indices :=ds.Books
.all().selected($onSubject)
//Build a collection with all the titles
$titles :=ds.Books.all().title
// Loop on the $indices.ranges collection of objects // $indices.ranges is [{start:0,end:0},{start:2,end:4},{start:7,end:9},{start:11,end:11}] For each ($range;$indices.ranges)
For ($i;$range.start;$range.end
)
$titles [$i]:="<b>"+$titles[$i]+"</b>"
End for
End for each
// Build a text with carriage returns $text :=$titles.join("<br/>")
WEB SEND TEXT (
$text)
では、ブラウザで4DACTION/highlight?subject=Historyを実行してみましょう。
その結果がこちらです。
それでは、エンティティ選択で最適化されたコードを書いてみましょう!