For Each グループ内のフィルタやグリッドの条件は、テーブル間のナビゲーションを向上させ、記述するコードを簡素化します。
これにより、開発者はデータベース構造を気にせず、検索結果をより早く効率的に取得して、クエリをより直観的に解決できます。
次の例では、データベースにはログのエントリーがあります。各ログには、さまざまな言語に翻訳可能なメッセージが関連付けられています。
MessagesByLanguage Transaction
MessageId*
LanguageId*
MessageText
LogEntries Transaction
LogEntryId*
MessageId
任意の言語で LogEntryId、MessageId、および MessageText を表示するレポートが必要であるとします。例:
Log |
Entry Message |
007 |
ATM Deposit |
005 |
Cashier Deposit |
001 |
Cashier Withdraw |
Código |
Mensaje |
007 |
Depósito en Cajero Automático |
005 |
Depósito en Caja Banco |
001 |
Retiro en Caja Banco |
これらの項目属性すべてを単一の For each グループまたはグリッド内で参照すると、項目属性間に関係がないという内容のエラーが表示されます。これは、想定されることです。というのは、1 つのログエントリーに [ MessageText ] が 1 つだけではないためです (この場合、2 つのテーブルは関連していません。また、N-1 の関係が成立していても同じです)。
このクエリに対して、たとえば、LanguageId = "ENG" または LanguageId = &LanguageId などのように特定の言語を指定する場合は状況が異なります。このとき、ナビゲーションを決定するフィルタの改善により、2 つのテーブルの関係が解決されます。新しいフィルタにより、これら両方のテーブルは同じ拡張テーブルに属しているように表示され (LogEntry に対してメッセージは 1 つのみ)、1 つの手順だけでクエリを解決できます。
利点:
より直観的なクエリ設計: 以前の GeneXus バージョンで上記のクエリの解決に必要なコードは、次のとおりでした:
For Each
defined by LogEntryId, MessageId
For Each
where LanguageId = &LanguageId
defined by MessageText
EndFor
Endfor
現在のコードは次のとおりです:
For Each
where LanguageId = &LanguageId
defined by LogEntryId, MessageId, MessageText
Endfor
より効率的な SQL コードを生成します。テーブル間の結合により、クエリは、Select 文 2 つではなく、SQL 文 1 つのみで解決されます。
データベースの構造および関係についての知識は、開発者にそれほど必要ありません。
For Each の Where 節またはグリッド条件においてフィルタを指定する必要があります。Reports、Procedures、Work Panels、および Web Panels の全般的な条件は、この機能に対応していません (全般的な条件はすべてのグループには適用されない場合があります)。
フィルタが属す条件には NOT および OR 演算子を含めることはできません。また、フィルタは「=」演算子のみと比較されます。ほかの場合にフィルタは適用されません。たとえば、「LanguageId = &LanguageId and LogEntryId > &LogEntryIdStart」は LanguageId のインスタンスを作成するために有効な条件ですが、「LanguageId = &LanguageId OR LogEntryId > &LogEntryIdStart」は有効ではありません。
次のナビゲーションダイアグラムはこの機能によりアクセスしたテーブルを表示しており、この結果で使用されている値 (この例では &LanguageId) を示しています。
この機能は、SQL によってデータベースにアクセスするジェネレーターでのみサポートされています。
オブジェクト: Procedure、Web Panel、Work Panel
言語: Java、Ruby、.NET、.NET Mobile
インターフェース: Web、Win
|