セット

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

version 11 (Modified)


セットはレコードセレクションを素早くパワフルに操作する方法を提供します。作成したセットに対して、カレントセレクションとの関連付け、書き出し、読み込み、消去の処理が行えるだけでなく、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両方で使用できます。

インタープロセスセットは、データベースのすべてのプロセスからアクセスできます。

Client/Serverモードでインタープロセスセットは、それがクライアントマシン上で作成された場合クライアントのすべてのプロセスから、ストアドプロシージャなどのサーバプロセスで作成された場合サーバのすべてのプロセスから、アクセスできます。

インタープロセスセットの名称はデータベース内でユニークでなければなりません。

ローカルセット/クライアントセット: ローカル/クライアントセットはクライアント/サーバモードでの使用を意図しています。ローカル/クライアントセットの名前の先頭にはドル記号 ($) が付けられます。他の種類のセットと異なり、ローカル/クライアントセットはクライアントマシン上に作成されます。

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

セットの可視性

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

セットとトランザクション


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

セットの例題


以下の例では、重複する情報を持つレコードをテーブルから削除します。For...End forループはカレントレコードと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")

メソッドの終りで即座にレコードを削除するのではなく、画面にレコードを表示したり印刷したりして、より詳細な比較を行うこともできます。

UserSet システムセット


4DはUserSetというシステムセットを維持します。UserSetにはユーザによって画面上で最後に選択されたセレクションが自動的に保持されます。したがって、MODIFY SELECTIONDISPLAY SELECTIONでセレクションを表示し、ユーザにそれから必要なレコードを選択させて、選択結果によるセレクションあるいはセットを作成できます。

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

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

4Dは、デザインモードあるいはMODIFY SELECTIONDISPLAY SELECTIONコマンドで表示されるリストフォームのUserSetを管理します。ただし、このメカニズムはサブフォームには使用されません。

以下のメソッドはレコードを一覧表示し、ユーザにレコードを選択させ、UserSetを使用してその選択されたレコードを表示します:

      ` 全レコードを表示し、ユーザに必要なだけレコードを選択させる
      ` そしUserSetを使用し、選択されたレコードをセレクションとする
   OUTPUT FORM ([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]) ` 選択されたレコードを表示

LockedSet システムセット


APPLY TO SELECTIONARRAY TO SELECTION、そしてDELETE SELECTIONコマンドは、マルチプロセス環境で使用された場合、LockedSetという名前のセットを作成します。

クエリコマンドもまた、"クエリしてロック"のコンテキストでロックされたレコードを見つけた場合、LockedSetシステムセットを作成します (SET QUERY AND LOCK コマンドを参照)。

LockedSetは、コマンドの実行中に見つけた、ロックされたレコードが格納されています。

参照

識別子.


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