version 11 (Modified)
SET QUERY DESTINATION (destinationType{; destinationObject})
| 引数 | 型 | 説明 | |
| destinationType | 数値 | 0 カレントセレクション | |
| 1 セット | |||
| 2 命名セレクション | |||
| 3 変数 | |||
| destinationObject | 文字列 | 変数 | セット名, または | |
| 命名セレクション名, または | |||
| 変数 |
説明
SET QUERY DESTINATIONを使い、カレントプロセスのクエリの結果を配置する場所を4Dに指示することができます。
destinationType引数に配置場所のタイプを指定します。"Queries"テーマの定義済み定数を使用することもできます:
| 定数 | 型 | 値 |
| Into current selection | 倍長整数 | 0 |
| Into set | 倍長整数 | 1 |
| Into named selection | 倍長整数 | 2 |
| Into variable | 倍長整数 | 3 |
以下の表にしたがって、オプションのdestinationObject引数にクエリの配置先を指定します:
| destinationType | destinationObject |
| 引数 | 引数 |
| 0 (current selection) | 引数を省略します |
| 1 (set) | セット名 (既存または作成させる) |
| 2 (named selection) | 命名セレクション (既存または作成させる) |
| 3 (variable) | 数値変数 (既存または作成させる) |
・例:
SET QUERY DESTINATION(Into current selection)
以降の検索で見つかったレコードは、最終的にその検索の対象となるテーブルの新しいカレントセレクションとなります。
・例:
SET QUERY DESTINATION(Into set;"mySet")
以降の検索で見つかったレコードは、最終的にセット"mySet"に配置されます。検索の対象となったテーブルのカレントセレクションとカレントレコードは変更されません。
Note: クライアント/サーバでは、ローカル/クライアントセット ($で名前が始まるもの) をクエリの配置先として使用することはできません。このタイプのセットはサーバで検索が実行されたときにクライアントマシンで作られます。セットのタイプのについての詳細はセットを参照してください。
・例:
SET QUERY DESTINATION(Into named selection;"myNamedSel")
以降の検索で見つかったレコードは、最終的には命名セレクション"myNamedSel"に配置されます。検索の対象となったテーブルのカレントセレクションとカレントレコードは変更されません。
Note: 命名セレクションが存在しない場合は、検索が完了した時に自動的に作成されます。
・例:
SET QUERY DESTINATION(Into variable;$vlResult)
以降の検索で見つかったレコード数が、変数$vlResultに配置されます。検索の対象となったテーブルのカレントセレクションとカレントレコードは変更されません。
警告: SET QUERY DESTINATIONは、カレントプロセス内で行われた以下の検索のすべてに影響を及ぼします。destinationTypeが0でないSET QUERY DESTINATIONの呼び出しを行った後は、通常のクエリを再実行するためにSET QUERY DESTINATION(0)の呼び出しと対にさせることを忘れないでください。
SET QUERY DESTINATION は、下記のクエリコマンドの動作を変更します:
これに対して、SET QUERY DESTINATIONは、ALL RECORDSやRELATE MANY等、テーブルのカレントセレクションを変更する他のコマンドには影響を与えません。
例題
1. 以下の例は[Phone Book]テーブルのレコードを表示するフォームを作成します。そのフォームに (アルファベット26文字の) asRolodexと名付けられたタブコントロールと[Phone Book]レコードを表示するサブフォームを作成します。タブコントロールから任意のタブを選択することにより、そのタブ上の文字で始まるレコードを表示することができます。
このアプリケーション例では、[Phone Book] テーブルが変更されることはないため、任意のタブを選択するたびにクエリを実行する必要はありません。これにより、検索に要する時間を節約することができます。
これを実行するために、検索結果を命名セレクションに格納し、必要に応じて再利用できるようにします。以下のコードはasRolodexタブコントロールのオブジェクトメソッドです:
` asRolodex object method
Case of
: (Form event=On Load)
` フォームが表示される前に,
` rolodexと、検索が行われたかを示すブール配列を初期化
ARRAY STRING(1;asRolodex;26)
ARRAY BOOLEAN(abQueryDone;26)
For ($vlElem;1;26)
asRolodex{$vlElem}:=Char(64+$vlElem)
abQueryDone{$vlElem}:=False
End for
: (Form event=On Clicked)
` タブコントロールがクリックされたら、対応するクエリが実行済みかどうか調べる
If (Not(abQueryDone{asRolodex}))
` 実行されいなければ、次のクエリ結果は命名セレクションに格納する
SET QUERY DESTINATION(Into named selection;"Rolodex"+asRolodex{asRolodex})
` クエリを実行
QUERY([Phone Book];[Phone Book]Last name=asRolodex{asRolodex}+"@")
` 通常のクエリモードに戻す
SET QUERY DESTINATION(Into current selection)
` 次回同じタブが選択された時は、クエリを行わない
abQueryDone{asRolodex}:=True
End if
` 選択された文字に対応するレコードを表示するために命名セレクションを使用
USE NAMED SELECTION("Rolodex"+asRolodex{asRolodex})
: (Form event=On Unload)
` フォームをアンドーろする際、作成した命名セレクションをクリアする
For ($vlElem;1;26)
If(abQueryDone{$vlElem})
CLEAR NAMED SELECTION("Rolodex"+asRolodex{$vlElem})
End if
End for
` プロセス配列をクリアする
CLEAR VARIABLE(asRolodex)
CLEAR VARIABLE(abQueryDone)
End case
2. この例題のUnique valuesプロジェクトメソッドは、テーブル中の任意の数のフィールドに対し、重複値がないことを検証するために使用できます。カレントレコードは新規あるいは既存のレコードを使用できます。
` Unique values プロジェクトメソッド
` Unique values ( ポインタ; ポインタ{ ; ポインタ... } ) -> ブール
` Unique values ( ->ーブル ; ->フィールド { ; ->フィールド2... } ) -> Yes or No
C_BOOLEAN($0;$2)
C_POINTER(${1})
C_LONGINT($vlField;$vlNbFields;$vlFound;$vlCurrentRecord)
$vlNbFields:=Count parameters-1
$vlCurrentRecord:=Record number($1->)
If ($vlNbFields>0)
If ($vlCurrentRecord#-1)
If ($vlCurrentRecord<0)
` カレントレコードはまだ保存されいない新規レコード (レコード番号= -3);
` なので、少なくとも1つのレコードが見つかれば検索を停止できる
SET QUERY LIMIT(1)
Else
` カレントレコードは既存のレコード;
` なので、少なくとも2つのレコードが見つかれば検索を停止できる
SET QUERY LIMIT(2)
End if
` クエリはカレントセレクションやカレントレコードを変更せずに
` $vlFoundに結果を返す
SET QUERY DESTINATION(Into variable;$vlFound)
` 指定した数の¥フィールドのクエリを行う
Case of
: ($vlNbFields=1)
QUERY($1->;$2->=$2->)
: ($vlNbFields=2)
QUERY($1->;$2->=$2->;*)
QUERY($1->; & ;$3->=$3->)
Else
QUERY($1->;$2->=$2->;*)
For ($vlField;2;$vlNbFields-1)
QUERY($1->; & ;${1+$vlField}->=${1+$vlField}->;*)
End for
QUERY($1->; & ;${1+$vlNbFields}->=${1+$vlNbFields}->)
End case
SET QUERY DESTINATION(Into current selection) ` クエリモードを通常に戻す
SET QUERY LIMIT(0) ` クエリの上限をクリア
` クエリ結果を処理
Case of
: ($vlFound=0)
$0:=True ` 重複値はない
: ($vlFound=1)
If ($vlCurrentRecord<0)
$0:=False ` 未保存の新規レコードと同じ値を持つ既存のレコードを見つけた
Else
$0:=True ` 重複値は見つからなかった
End if
: ($vlFound=2)
$0:=False ` ケースに関わらず、値は重複しいる
End case
Else
If (<>DebugOn) ` Does not make sense; signal it if development version
TRACE ` WARNING! カレントレコードなしでメソッドが呼び出された
End if
$0:=False ` 結果は保証できない
End if
Else
If (<>DebugOn) ` Does not make sense; signal it if development version
TRACE ` WARNING! 検索条件なしでメソッドが呼び出された
End if
$0:=False ` 結果は保証できない
End if
このプロジェクトメソッドをアプリケーションから使用するには、以下のように記述します:
` ...
If (Unique values (->[Contacts];->[Contacts]Company);->[Contacts]Last name;->[Contacts]First name)
` Do appropriate actions for that record which has unique values
Else
ALERT("There is already a Contact with this name for this Company.")
End if
` ...
参照
QUERY, QUERY BY EXAMPLE, QUERY BY FORMULA, QUERY BY SQL, QUERY SELECTION, QUERY SELECTION BY FORMULA, QUERY WITH ARRAY, SET QUERY LIMIT.