ここは旧式の4DドキュメントWebサイトです。最新のアップデートされたドキュメントを読むには新サイトをご利用下さい→ developer.4d.com |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v20 R7
セット
|
比較項目 | カレントセレクション | セット |
1つのテーブルに持てる数 | 1 | 0以上 |
ソート可 | はい | いいえ |
ディスクに保存可 | いいえ | はい |
RAM/レコード (バイト) | レコード数 * 4 | 総レコード数/8 |
論理演算 | いいえ | はい |
カレントレコードを記憶 | はい | はい (セットが作成された際の) |
セットを作成する際、セットはそれを作成したテーブルに属します。セット演算は同じテーブルに属するセット間でのみ可能です。
セットは実在するデータとは別に存在します。これはテーブルを更新をした後では、セットが正確でなくなる可能性があることを意味します。セットが不正確になる可能性のある処理は数多くあります。例えば、すべての東京出身の人でセットを作成した後でその中の1つのレコードを大阪出身に修正しても、セットは更新されません。これは、セットがレコードのセレクションを表現しているに過ぎないためです。レコードを削除した後で新しいレコードを追加した場合やデータの圧縮なども、セットを不正確にします。セットは、その対応するセレクションのデータが更新されていない場合にのみ正確なものであることが保証されます。
3種類のセットを使用できます:
注:
以下の表はセットのスコープおよびそれが作成された場所による、セットの可視性についてまとめたものです:
クライアントのプロセス | 同じクライアントの他のプロセス | 他のクライアント | サーバーのプロセス | サーバー上の他のプロセス | |
クライアントプロセスで作成された場合 | |||||
$test | ◯ | ||||
test | ◯ | ◯(トリガ) | |||
<>test | ◯ | ◯ | |||
サーバープロセスで作成された場合 | |||||
$test | ◯ | ||||
test | ◯ | ||||
<>test | ◯ | ◯ |
トランザクション中でセットを作成できます。トランザクション中で作成されたレコードのセットやトランザクションの外で作成・更新されたレコードの セットを作成できます。トランザクションが終了したとき、トランザクション中に作成されたセットはクリアされるべきです。なぜなら、特にトランザクション がキャンセルされた場合、そのセットはレコードセレクションの表現として正しくないものになっているかもしれないからです。
以下の例では、重複する情報を持つレコードをテーブルから削除します。4D Write Proドキュメントを4Dオブジェクトフィールドに保存するルー プはカレントレコードと1つ前のレコードの内容を比較する処理をすべてのレコードに対して行います。名前、住所、郵便番号がすべて一致する場合には、その レコードをセットに追加します。ループが終了したところでセットをカレントセレクションにし、カレントセレクションを削除します:
CREATE EMPTY SET([People];"Duplicates")
` 重複したレコードを格納する空のセットを作成
ALL RECORDS([People])
` 全レコードを選択
` ZIP, address, nameで並び替え、重複が前後に来るようにする
ORDER BY([People];[People]ZIP;>;[People]Address;>;[People]Name;>)
` 前レコードのフィールド値を保持する変数を初期化
$Name:=[People]Name
$Address:=[People]Address
$ZIP:=[People]ZIP
` 先頭と比較するために次レコードに移動
NEXT RECORD([People])
For($i;2;Records in table([People]))
` 2から開始してレコード数まで繰り返す
` name, address, ZIPが前レコードのそれと同じなら
` それは重複レコード
If(([People]Name=$Name) & ([People]Address=$Address) & ([People]ZIP=$ZIP))
` 重複しているカレントレコードをセットに追加
ADD TO SET([People];"Duplicates")
Else
` 次のレコードと比較するためにname, address, ZIPを保持
$Name:=[People]Name
$Address:=[People]Address
$ZIP:=[People]ZIP
End if
` 次のレコードに移動
NEXT RECORD([People])
End for
` 見つかった重複レコードをセレクションにする
USE SET("Duplicates")
` 重複レコードを削除する
DELETE SELECTION([People])
` メモリからセットを取り除く
CLEAR SET("Duplicates")
メソッドの終りで即座にレコードを削除するのではなく、画面にレコードを表示したり印刷したりして、より詳細な比較を行うこともできます。
4DはUserSetというシステムセットを維持します。UserSetにはユーザによって画面上で最後に選択されたセレクションが自動的に保持されます。したがって、MODIFY SELECTIONやDISPLAY SELECTIONでセレクションを表示し、ユーザにそれから必要なレコードを選択させて、選択結果によるセレクションあるいはセットを作成できます。
4D Server: 名前が"$"で始まっていませんが、UserSetシステムセットはクライアントセットです。そのため、INTERSECTION、UNION、DIFFERENCEで使用する際は、UserSetをクライアントセットと比較していることを確認してください。詳細はこれらのコマンドの説明や、4D Server Referenceマニュアルのの節を参照してください。
UserSetは1つのプロセスに対して1つしかありません。各テーブルごとにUserSetがあるわけではありません。UserSetは、その時点でセレクションを表示しているテーブルに所有されます。
4Dは、デザインモードあるいはMODIFY SELECTIONやDISPLAY SELECTIONコマンドで表示されるリストフォームのUserSetを管理します。ただし、このメカニズムはサブフォームには使用されません。
以下のメソッドはレコードを一覧表示し、ユーザにレコードを選択させ、UserSetを使用してその選択されたレコードを表示します:
` 全レコードを表示し、ユーザに必要なだけレコードを選択させる
` そしてUserSetを使用して、選択されたレコードをセレクションとする
FORM SET OUTPUT([People];"Display") ` 出力フォームを設定
ALL RECORDS([People]) ` 全レコードを選択
ALERT("Press Ctrl or command and Click to select the people required.")
DISPLAY SELECTION([People]) ` レコードを表示
USE SET("UserSet") ` 選択されたレコードをカレントセレクションにする
ALERT("You chose the following people.")
DISPLAY SELECTION([People]) ` 選択されたレコードを表示
APPLY TO SELECTION、DELETE SELECTION、そしてARRAY TO SELECTIONコマンドは、マルチプロセス環境で使用された場合、 LockedSet という名前のセットを作成します。
クエリコマンドもまた、"クエリしてロック"のコンテキストでロックされたレコードを見つけた場合、 LockedSet システムセットを作成します ( SET QUERY AND LOCK コマンドを参照)。
LockedSet は、コマンドの実行中にロックされたレコードあらわします。
プロダクト: 4D
テーマ: セット
ランゲージリファレンス ( 4D v20 R7)