ORDAのクエリは軽くて読みやすいだけでなく、オブジェクト指向の概念を用いてデータモデル全体を簡単に操作できることに、もうお気づきでしょう!?このブログ記事では、強力でメンテナンスが簡単なクエリを書く方法を紹介しました。その中で、クエリと値を別々にプレースホルダーで提供する方法が推奨されていました。4D v17 R5では、プレースホルダーをさらに進化させ、一般的なORDAクエリを記述できるようになりました:値の名前付きプレースホルダーをよろしくお願いします。
HDI: ORDAクエリにおける値の名前付きプレースホルダーの例
これらの新しいプレースホルダーは、クエリ設定においてオブジェクトパラメータとして提供されます。オブジェクトはキーと値のマップなので、クエリで使用するのは非常に簡単です。
百聞は一見に如かず
ここでは、Charlieという 名前のクライアントをLoyal clientというコメント付きで取得するクエリを紹介します。何か思い当たる節があるでしょうか?もしそうでなければ、この投稿を読んで記憶を呼び覚ましてください。
C_OBJECT($clients)
$clients :=ds.Clients.query("name =:1and comment =:2"; "Charlie@"; "Loyal client")
このクエリは、次のようにも書けます。
C_OBJECT($settings;$clients)
)と書くこともできます。
$settings :=New object
$settings .parameters:=New object("givenName"; "Charlie@"; "givenComment"; "Loyal client")
$clients :=ds.Clients.query("name =:givenNameand comment =:givenComment";$settings
プレースホルダーは、名前の前に “:” をつけて使うだけです。
あなたのコードは簡単に読めて保守しやすいものですが、さらに大きな利点は、値のパラメータが異なるソース (ユーザーインターフェイスやリクエスト) から来るかもしれない汎用的なクエリを書くことができることです。
このようなパターンはどうでしょうか?
ユーザーが検索条件や適用する値を選択できるようなクエリインターフェイスを提供することもできます。
以下のコードは、営業担当者が顧客のリストを閲覧できるようにするためのインターフェースです。これは、営業担当者の ID に従ってフィルタリングされたコンテンツを返します。
C_OBJECT
$settingsparameters($formData;$settings;$clients)
C_TEXT ($queryString)
$formData :=New object
DIALOG ("QueryEditor";$formData)
CLOSE WINDOW if (OK=1) //The logged sales person can only browse their clients
$queryString :="salesPersonUserId = :givenUserId"
//The $formData object comes from the user's interface with search criteria filled
//It contains the sales person's user id and some additional search criterias (name and city)
$settings :=New object
$settings .parameters:=$formData
If ( xml-ph-0034@deepl.in )givenName
#Null)
$queryString :=$queryString+" and name = :givenName"
End if
If ($settings.parameters.givenCity#Null)
$queryString :=$queryString+" and city.name = :givenCity"
End if $clients :=ds.Clients.query($queryString;$settings、 )
end if
上の例はdataClassに対するクエリですが、ドキュメントを見ると、コレクションにも適用できることがわかりますね。
このように、クエリを動的に作成するのは簡単です。HDIをダウンロードし、実行してみてください。