4D v14.3

セット

ホーム

 
4D v14.3
セット

セット  


 

 

セットはレコードセレクションを素早くパワフルに操作する方法を提供します。作成したセットに対して、カレントセレクションとの関連付け、書き出し、読み込み、消去の処理が行えるだけでなく、4Dは3つの基本機能を提供しています。

  • 集合交差 (INTERSECTION)
  • 集合結合 (UNION)
  • 集合差異 (DIFFERENCE)

セットはレコードセレクションを簡潔に表現します。セットの概念はカレントセレクションと密接な関連があります。セットは一般的に以下の目的で使用します:

  • 並び順が重要でないセレクションの保存と再利用を実行する場合
  • ユーザが画面上で作成したセレクションにアクセスする場合 (UserSet)
  • セレクション間で論理演算を実行する場合

カレントセレクションは、現在選択されている各レコードを指し示す参照のリストです。リストはメモリ上に存在します。現在選択されているレコードのみがリストに含まれます。セレクションは実際にレコードを含んでいるわけではなく、レコードに対する参照リストを保持しているだけです。レコ-ドに対する参照はそれぞれ1レコードに対してメモリを4バイト使用します。テーブルに対して作業を実行する場合にも、常にカレントセレクションのレコード用いて作業を行います。セレクションをソートした場合でも、参照のリストがソートされるだけです。カレントセレクションは1つのプロセス内で各テーブルごとに1つしか存在しません。

カレントセレクションと同様に、セットもレコードセレクションを表わします。セットはこれを行うために、非常にコンパクトなレコード参照を使用します。1レコードに対してメモリを1ビット (1/8バイト) 使用します。コンピュータはビットに対する演算を非常に高速に行うため、セットを使った処理は高速に行われます。セットは、セット内にレコードが含まれているかどうかに関係なく、テーブル上に存在するすべてのレコードに対して1ビットずつ使用します。実際、各ビットは1または0であり、この値はレコードがセット内にあるかどうかを表します。

セットはRAMスペースの面から見ると、非常に経済的です。テーブルのレコード件数を8で割れば、そのテーブルのセットサイズをバイト数で求めることができます。例えば、10,000件のレコードを持つテーブルに対してセットを作成すれば、セットはRAMを1,250バイト (約1.2K) 使用します。

各テーブルに対して複数のセットを持つことができます。またデータベースとは別にセットをディスクに保存することもできます。セットに属するレコ-ドを変更するには、最初にセットをカレントセレクションとして使用し、それから1つまたは複数のレコ-ドを修正します。

セットは、ソートした順番には決してなりません。レコードがセットに含まれるか含まれないかだけを示します。これに対して、命名セレクションはソートの順番を保持することができますが、ほとんどの場合より多くのメモリを必要とします。命名セレクションに関する詳細は、を参照してください。

セットは、セットが作成された時点のカレントレコードを“記憶”しています。以下の表は、カレントセレクションとセットの概念を比較したものです:

比較項目カレントセレクションセット
1つのテーブルに持てる数10以上
ソート可はいいいえ
ディスクに保存可いいえはい
RAM/レコード (バイト)レコード数 * 4総レコード数/8
論理演算いいえはい
カレントレコードを記憶はいはい (セットが作成された際の)

セットを作成する際、セットはそれを作成したテーブルに属します。セット演算は同じテーブルに属するセット間でのみ可能です。

セットは実在するデータとは別に存在します。これはテーブルを更新をした後では、セットが正確でなくなる可能性があることを意味します。セットが不正確になる可能性のある処理は数多くあります。例えば、すべての東京出身の人でセットを作成した後でその中の1つのレコードを大阪出身に修正しても、セットは更新されません。これは、セットがレコードのセレクションを表現しているに過ぎないためです。レコードを削除した後で新しいレコードを追加した場合やデータの圧縮なども、セットを不正確にします。セットは、その対応するセレクションのデータが更新されていない場合にのみ正確なものであることが保証されます。

3種類のセットを使用できます:

  • プロセスセット: プロセスセットは、それを作成したプロセス内でのみアクセスすることができます。LockedSet もプロセスセットです。プロセスセットはプロセスメソッドが終了しだい消去されます。プロセスセットは、その名前に特別な接頭辞を必要としません。
  • インタープロセスセット: インタープロセスセットを作成するには、その名前の前に記号 (<>) を付けます。このシンタックスはMac OSとWindows両方で使用できます。
    インタープロセスセットは、データベースのすべてのプロセスからアクセスできます。
    クライアント/サーバーモードで、インタープロセスセットはそれが作成されたマシン上のプロセスから、アクセスできます (クライアントまたはサーバー)。
    インタープロセスセットの名称はデータベース内でユニークでなければなりません。
  • ローカルセット/クライアントセット: ローカル/クライアントセットはクライアント/サーバモードでの使用を意図しています。ローカル/クライアントセットの名前の先頭にはドル記号 ($) が付けられ、UserSet システムセットを受け取ります。他の種類のセットと異なり、ローカル/クライアントセットはクライアントマシン上に作成されます。

Note: クライアント/サーバモードにおけるセットの使用については4D Server Referenceマニュアルの4D Server: セットと命名セレクションを参照してください。

以下の表はセットのスコープおよびそれが作成された場所による、セットの可視性についてまとめたものです:

トランザクション中でセットを作成できます。トランザクション中で作成されたレコードのセットやトランザクションの外で作成・更新されたレコードの セットを作成できます。トランザクションが終了したとき、トランザクション中に作成されたセットはクリアされるべきです。なぜなら、特にトランザクション がキャンセルされた場合、そのセットはレコードセレクションの表現として正しくないものになっているかもしれないからです。

以下の例では、重複する情報を持つレコードをテーブルから削除します。Styled Textルー プはカレントレコードと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 SELECTIONDISPLAY SELECTIONでセレクションを表示し、ユーザにそれから必要なレコードを選択させて、選択結果によるセレクションあるいはセットを作成できます。

4D Server: 名前が"$"で始まっていませんが、UserSetシステムセットはクライアントセットです。そのため、INTERSECTIONUNIONDIFFERENCEで使用する際は、UserSetをクライアントセットと比較していることを確認してください。詳細はこれらのコマンドの説明や、4D Server Referenceマニュアルのの節を参照してください。

UserSetは1つのプロセスに対して1つしかありません。各テーブルごとにUserSetがあるわけではありません。UserSetは、その時点でセレクションを表示しているテーブルに所有されます。

4Dは、デザインモードあるいはMODIFY SELECTIONDISPLAY 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 SELECTIONDELETE SELECTION、そしてARRAY TO SELECTIONコマンドは、マルチプロセス環境で使用された場合、 LockedSet という名前のセットを作成します。
クエリコマンドもまた、"クエリしてロック"のコンテキストでロックされたレコードを見つけた場合、 LockedSet システムセットを作成します ( SET QUERY AND LOCK コマンドを参照)。
LockedSet は、コマンドの実行中にロックされたレコードあらわします。

 
プロパティ 

プロダクト: 4D
テーマ: セット

 
参照 

識別子

 
ARTICLE USAGE

ランゲージリファレンス ( 4D v14 R3)
ランゲージリファレンス ( 4D v14 R2)
ランゲージリファレンス ( 4D v14.3)
ランゲージリファレンス ( 4D v14 R4)

Inherited from : セット ( 4D v12.4)