QUERY BY FORMULA

4D - Documentation   French   English   German   Spanish   日本語   4D v11 SQLコマンドテーマリスト   4D v11 SQLインデックス   4D v11 SQL定数テーマリスト   戻る   前   次

version 11.2 (Modified)


QUERY BY FORMULA ({aTable}{; }{queryFormula})

引数説明
aTableテーブルレコードセレクションを求めるテーブル
queryFormulaブール検索フォーミュラ

説明

QUERY BY FORMULAは、aTableからレコードを検索します。QUERY BY FORMULAは、カレントプロセスのaTableのカレントセレクションを変更し、セレクションの先頭のレコ−ドをカレントレコ−ドにします。

QUERY BY FORMULAQUERY SELECTION BY FORMULAは、全く同じように機能しますが、QUERY BY FORMULAがテーブルのすべてのレコードを検索対象とするのに対して、QUERY SELECTION BY FORMULAコマンドはカレントセレクションのレコードのみを検索対象とします。

両方のコマンドは、テーブルまたはセレクションの各レコードに対してqueryFormulaを適用します。queryFormulaはTRUEかFALSEのいずれかの状態に評価されるブール式です。queryFormulaでTRUEに評価されたレコードを新しいセレクションに追加します。

queryFormulaは、フィールドと値とを比較するだけの単純なものから、計算、またはリレート先テーブルの情報を評価するような複雑なものまで処理します。queryFormulaには4Dの関数 (コマンド) や開発者が作成した関数 (メソッド) や式 (フォーミュラ) を使用することができます。文字フィールドやテキストフィールドに対して作業を実行する場合は、queryFormulaにワイルドカード (@) を使用することもできます。詳しい情報はQUERYコマンドの例を参照してください。

queryFormulaが省略されると、4Dはクエリダイアログボックスが表示されます。

検索が完了すると、新しいセレクションの最初のレコードがディスクからロードされカレントレコードになります。

これらのコマンドは最適化され、特にインデックスを利用します。クエリのタイプが許す場合、これらのコマンドはQUERY コマンドと同じのクエリを実行します。例えばQUERY BY FORMULA([mytable]; [mytable]myfield=value) は可能であればインデックスを使用し、QUERY([mytable]; [mytable]myfield=value) と同じに実行されます。4Dは最適化可能な部分を先に検索し、他の残りのクエリと合算することで、部分的に最適化できないクエリも最適化します。例えば、QUERY BY FORMULA[mytable];Length(myfield)=value) は最適化されません。他方、QUERY BY FORMULA([mytable];Length(myfield)=value1 | myfield=value2) は部分的に最適化されます。

これらのコマンドはデフォルトでSQLのような"JOIN"を行います。これはQUERY BY FORMULA([Table_A];[Table_A]field_X = [Table_B]field_Y)のようなステートメントを実行する際にも、Table_ATable_Bの間に自動リレーションが必要ないことを意味します (例題 3参照)。

ストラクチャエディタ中でリレーションが存在しても、ルールとしては使用されません。しかし以下のケースでは、これらのコマンドは自動リレーションを使用します:

- フォーミュラが { フィールド ; 比較演算子; 値} の形式の要素に分解できない場合

- 同じテーブルの2つのフィールドが比較されている場合

Note: 互換性のためJOINメカニズムを無効にできます。これはデータベース環境設定でグローバルに (変換されたデータベースのみ)、またはSET DATABASE PARAMETER コマンドコマンドを使用してプロセスごとに行うことができます。

4D Server: 4D Serverのバージョン11より、このコマンドはサーバ上で実行され、実行が最適化されるようになりました。queryFormula内で直接変数が呼ばれているとき、クライアントマシンの変数値を使用してクエリを計算します。例えばQUERY BY FORMULA([mytable];[mytable]myfield=myvariable)というステートメントはサーバ上で実行されますが、myvariable変数の内容はクライアントマシンのものが使用されます。

他方、フォーミュラにメソッドを使用し、メソッドから変数を参照する場合にはこの原則は適用されません (サーバ上の変数値を使用して評価が行われます)。このコンテキストでは、変数を引数として渡つつサーバ上でメソッドの時移行を可能にする、"サーバ上で実行"メソッド属性を使用することをお勧めします (Design Referenceマニュアルを参照)。

以前のバージョンの4D Serverでは、このコマンドはクライアントマシンで実行されていました。互換性のため、バージョン11に変換されたデータベースでは古い動作が保持されています。互換性の環境設定やSET DATABASE PARAMETER コマンドのセレクタを使用して、サーバ上で実行させるバージョン11の動作を適用できます。

例題

1. 以下の例は、すべての年の12月に作成された請求書のレコードを検索します。これはMonth of関数を各レコードに適用して検索します。このような検索は月の情報を別のフィールドとして持たない限り、他の方法では実現できません:

   QUERY BY FORMULA ([Invoice]; Month of ([Invoice]Entered) = 12) ` Find the invoices entered in December

2. 以下の例は、名前が10文字を超える人のレコードを検索します:

   QUERY BY FORMULA ([People]; Length ([People]Name)>10) ` Find names longer than ten characters

3. 以下の例は特定のフォーミュラを使用したクエリに対しSQL JOINを有効にします:

   $currentVal:= Get database parameter(QUERY BY FORMULA Joins) 
   SET DATABASE PARAMETER(QUERY BY FORMULA Joins;2) `Activate SQL joins
      `Query all the lines of "ACME" client invoices even though the tables are not related
   QUERY BY FORMULA([invoice_line] ; ([invoice_line]invoice_id = [invoice]id & [invoice]client = "ACME"))
   SET DATABASE PARAMETER(QUERY BY FORMULA Joins;$currentVal) `We re-establish the current settings

参照

QUERY, QUERY BY SQL, QUERY SELECTION, QUERY SELECTION BY FORMULA.


4D - Documentation   French   English   German   Spanish   日本語   4D v11 SQLコマンドテーマリスト   4D v11 SQLインデックス   4D v11 SQL定数テーマリスト   戻る   前   次