最近のアクセス:
条件付きフィルタと順序

GeneXus では、オブジェクトやグリッドコントロールで WHEN 節を使用して、フィルタに条件 (制約ともいいます) と順序を付けることができます。
条件と順序を決めると、複数の検索基準を持つクエリのパフォーマンスが向上します。これは、検索する順序が状況に合わせて調節されるからです。
説明
フィルタの条件

オブジェクトまたはグリッドの全般的なフィルタの条件は、For Each コマンドレベルで指定します。この条件で指定した制約が満たされた場合に、フィルタが適用されます。制約が満たされなかった場合は、フィルタは適用されません。
GeneXus で条件を指定する構文 (Where など) は、次のとおりです:
Condition  [ WHEN <Constraint> ] ;
入力値の説明:

Condition は、GeneXus の条件です。
Constraint は、条件を有効にする制約です。

条件付きフィルタには AND 条件があります。対応するすべての条件が False の場合、いずれの制約も適用されません。
条件付きの制限を生成するには、クライアント/サーバーアーキテクチャで作業し、使用する DBMS で条件を「評価」できる必要があります。つまり、GeneXus が、使用する DBMS の言語で条件を記述できなければなりません。

制約付き条件を生成できない場合 (ジェネレーターがサポートしていない場合や DBMS の言語で条件を記述できない場合) は、WHEN を OR に置き換えることにより、標準のフィルタに変換されます。  このとき、ナビゲーションレポートに次のコードメッセージが生成されます: spc0053 -‘対応されていない条件付きの制限 %1 が、標準の制限 %2 に変更されました。'-
 
ナビゲーションリスト 

条件付きフィルタを定義すると、ナビゲーションレポートには、Start from フィルタや Loop while フィルタの決定とは関係のない、条件の制約 (Constraints) として表示されます。

例:

イメージ:12567.jpg
生成されるステートメント

生成される条件付きフィルタのステートメントは、標準のフィルタ (WHEN 節なし) とよく似ています。主な違いは、選択可能なすべての文字列の後ろに、指定した条件に対応するものだけが連結されることです。また、変数の値がインスタンス化されます。

例:
 
  • CusAddr >= &CusAddr or not null(&CusAddr) というフィルタから、次のステートメントが生成されます。
    SELECT CusAddr, CusNam, CusId FROM CUSTOMERS (NOLOCK) WHERE CusAddr = ? or   (?=' ') ORDER BY CusId
  • このフィルタが次のような条件付きになると: CusAddr >= &CusAddr WHEN not null(&CusAddr) 次のステートメントが生成されます:
    • &CusAddr 変数が Null の場合:
      SELECT CusAddr, CusNam, CusId FROM CUSTOMERS (NOLOCK) ORDER BY CusId
    • &CusAddr 変数に値がある場合:
      SELECT CusAddr, CusNam, CusId FROM CUSTOMERS FROM CLIENTES (NOLOCK) WHERE CusAddr = 'Miguelete 1234' ORDER BY CliId
 
集計式は条件付きフィルタをサポートしません。
条件付き順序

アプリケーションで必要な場合は、異なる制約を持つナビゲーションの順序を複数指定します。構文は、次のとおりです: 
 [ ORDER ]  <OrderAttList>  [ WHEN <Constraint1> ] 
 [ ORDER ]  <OrderAttList1>  [ WHEN <Constraint2> ] 
...
<OrderAttListX> は、複数の項目属性を、ナビゲートする順序に従って空白かコンマで区切って並べたリストです。項目属性が降順でナビゲートされるようにするには、括弧で囲みます。
<ConstraintX> は、対応する <OrderAttListX> を有効にする制約です。

どの制約も True にならず、条件なしの順序 (WHEN 節なし) を指定していない場合は、ナビゲーションの順序が未定義になります。この場合は、ナビゲーションの順序は DBMS によって異なります (逐次実行の順序も異なります)。
複数の制約が True になった場合は、先にある ORDER 節で定義されている順序が使われます。そのため、ORDER 節を複数指定するときは、優先度の高いものから順に指定してください。

条件付き順序を指定したにもかかわらず、ジェネレーターでサポートされていない場合は、ナビゲーションの順序は、条件なしで指定したものになります。条件なし順序が指定されていない場合は、グループのベーステーブルの主キーが使われます。このとき、ナビゲーションレポートに次のコードメッセージが生成されます: spc0054 -‘ 対応されていない条件付き順序 %2。%1 の既定の順序を使用します。’-

条件付き順序は、ブレークとともに指定することはできません。ナビゲーションレポートに次のコードメッセージが生成されます: spc0055 -‘ 行 %1 から開始するグループの条件付き順序は許可されていません (ブレークグループ)。’-

全般的な注意事項
 
  • データベースに SQL でアクセスするジェネレーターだけで使用できます。
  • 制約に項目属性がある場合は、インスタンス化されていると見なされます。つまり、ナビゲーションを開始する前に制約が評価され、ナビゲーション中に変更されることはありません。 
パフォーマンス
使用される実装方法を考慮に入れ、条件付き順序やフィルタのあるグループは、頻繁に実行されるループ内で使用するように設計されていません。このような状況では、SQL 文が動的にビルドされ、実行のたびに DBMS で行われる「分析」に長時間かかるため、パフォーマンスが低下することがあります。この点を除けば、適切な条件とフィルタを検索順序と組み合わせることで、「どのようなデータがあるかを確認してから検索する」タイプのクエリで、パフォーマンスの向上が期待できます。
 

例 1

次に、条件付きフィルタの例を示します:
ClienteNombre LIKE &ClienteNombre
          WHEN NOT null(&ClienteNombre);
ClienteCedula >= &ClienteCedula
          WHEN NOT null( &ClienteCedula);
上のコードは、次のような意味です。
&ClienteNombre 変数に値がある場合は、次のフィルタが適用されます: ClienteNombre LIKE &ClienteNombre.このとき、&ClienteCedula 変数に値がある場合は、次のフィルタが適用されます: ClienteCedula >= &ClienteCedula フィルタ (ほかのフィルタに含まれ、AND 関係が成り立つ)。
変数に値がない場合、フィルタは適用しません。
 
例 2
For each ClienteNombre WHEN NOT null(&ClienteNombre)
          Order ClienteCedula WHEN NOT null( &ClienteCedula)
          ...
Endfor
上の For each では、&ClienteNombre 変数に値がある場合に、ClienteNombre で指定されている順序に従って、ナビゲーションが行われます。この変数に値がなく、&ClienteCedula 変数に値がある場合は、ClienteCedula で指定されている順序になります。どの条件も満たさない場合、ナビゲーションは不定の順序で行われます。
For each ClienteNombre WHEN NOT null(&ClienteNombre)
          Order ClienteCedula WHEN NOT null( &ClienteCedula)
          Order ClienteId
          ...
Endfor
上の For each では、ナビゲーションの順序は最初の例と同じになりますが、条件なしの順序が指定されているため、条件はありません。この場合、ナビゲーションは条件なしの順序で実行されます。 
適用範囲

オブジェクト: Work Panels、Web Panel、Procedure、Report
DBMS:  DB2 Universal Database、Informix、Oracle、SQL Server








サブページ
Created: 14/09/18 03:06 by Admin Last update: 21/05/21 05:23 by Admin
カテゴリ
Powered by GXwiki 3.0