ActiveX Controls Guide (v11)

ActiveX アクセス方法を使用したアプリケーションの作成

ここでは、ActiveX アクセス方法を使用したアプリケーションの作成に関連する主な作業を行う方法について説明します。作業項目は以下のとおりです。

プロジェクトへの ActiveX アクセス方法の追加

Pervasive の ActiveX アクセス方法のデータ ソースとバウンド コントロールを Visual Basic プロジェクトに追加するには

  1. プロジェクト]メニューから[コンポーネント]を選択します(または、ツールボックスを右クリックし、[コンポーネント]を選択します)。
  2. コントロール リスト内をスクロールし、[Pervasive ActiveX Data Source]と[Pervasive Bound Controls]チェック ボックスを選択します。
  3. OK]をクリックします。
    ツールボックスに青色の Pervasive ActiveX アイコンが表示されます。



VAccess コントロールの使用

VAccess コントロールはデータをポイントするもので、ほかすべての Pervasive PSQL コントロールがバインドするマスター コントロールです。このコントロールは、Pervasive PSQL とのすべての通信を処理します。

Visual Basic フォームにデータ ソース コントロールを追加するには

  1. Pervasive PSQL ActiveX コントロールを含んでいる Visual Basic のツールボックスをクリックします。
  2. VAccess コントロール アイコンをクリックします。



  3. フォームにカーソルを置いてドラッグし、コントロールを保持するための四角形を作成します。マウスを離すと、四角形の中に ActiveX アクセス方法が表示されます。このコントロールは、設計時にはアイコンとして表示されますが、実行時には表示されません。
    また、Pervasive PSQL の起動画面には、Pervasive PSQL ワークステーション エンジンが起動されたことが表示されます。
  4. デフォルトでは、フォームに配置する最初の VAccess コントロールには VAccess1 という名前が付きます。必要であれば、Name プロパティに新しい名前を入力してこの名前を変更できます。

次に、この VAccess コントロールのプロパティを設定する必要があります。プロパティへのアクセスプロパティの設定、および Pervasive PSQL ファイルへの接続をお読みください。

プロパティへのアクセス

コントロールのプロパティは次の 3 つの場所で設定できます。

プロパティ ページ

コントロールを右クリックし、ショートカット メニューから[プロパティ]を選択すると、プロパティ ページが表示されます。これは、コントロールの Pervasive PSQL ActiveX プロパティを設定できるタブ付きのダイアログ ボックスです。詳細については、図 2 を参照してください。

図 2 プロパティ ページ ダイアログ ボックス

Visual Basic のプロパティ ウィンドウ

Visual Basic のプロパティ ウィンドウには、Visual Basic に固有のプロパティなど、選択したオブジェクトのすべてのプロパティ セットが表示されます。図 3 を参照してください。

図 3 VAccess プロパティを表示するプロパティ ウィンドウ

Visual Basic コード エディター

フォームまたはコントロールをダブルクリックすると、Visual Basic のコード エディターが開きます。コード エディターの使用方法については、Visual Basic のマニュアルを参照してください。各プロパティの構文などの詳細については、本マニュアルを参照してください。

プロパティの設定

コントロールのプロパティを設定するには

  1. プロパティを設定するコントロールを選択します。
  2. プロパティ ページ、Visual Basic プロパティ ウィンドウまたはコード エディターで変更するプロパティを検索します。プロパティへのアクセスについては、プロパティへのアクセスを参照してください。
  3. 追加または変更する各プロパティの値を設定するには、テキスト ボックスにその値を入力するか、フィールドをクリックしたときに表示されるドロップダウン リストから値を選択するか、あるいは、値の設定が行えるダイアログ ボックスを呼び出す省略記号をクリックします。

    メモ

    プロパティには、設計時または実行時に設定できるものと、設計時または実行時にしか設定できないものがあります。


Pervasive PSQL ファイルへの接続

VAccess コントロールには、このコントロールを Pervasive PSQL データ ファイルへ接続するための重要なプロパティとして、DdfPathTableName および Location という 3 つのプロパティがあります。これらのプロパティにアクセスする最も簡単な方法は、コントロールを右クリックしてショートカット メニューから[プロパティ]を選択したときに表示されるプロパティ ページからアクセスする方法です。プロパティ ウィンドウからも、これらのプロパティにアクセスできます。

図 4 データに接続するためのプロパティの設定

データに接続するための 3 つの重要なプロパティを以下に示します。

データを指定するプロパティを設定するには

  1. データに接続する VAccess コントロールを選択します。
  2. VAccess コントロールの DdfPath を設定します。
  3. TableName プロパティのドロップダウン メニューからテーブル名を選択します。このメニューには、手順 2 で指定した DDF で使用できるテーブル名が含まれています。
    この VAccess コントロールにバインドするバウンド コントロールはすべて、このテーブルを参照します。
  4. 手順 3 でテーブル名を選択すると、Location プロパティはそのテーブルを含んでいる .MKD ファイルに変更されます。
    データへの接続を完了するには、IndexNumber プロパティをアクセスしたいインデックスに設定します。

    メモ

    実行時にコードからこれらのプロパティを設定しても、同じ順序が適用されます。


インデックスの選択

VAccess コントロールの IndexNumber プロパティは、レコード取得メソッドを呼び出すときに VAccess コントロールで使用されるインデックスを決定します。このインデックスは、設計時に VAccess コントロールのプロパティ ウィンドウで設定するか、あるいは、実行時にコードで設定できます。

設計時にインデックス番号を設定するには

プロパティ ウィンドウでは、IndexNumber プロパティのドロップダウン リストから値を選択してプロパティを設定できます。

次のように、プロパティ ページから IndexNumber を設定することもできます。

  1. インデックス番号を設定する特定の VAccess コントロールを選択します。
  2. 右クリックしてプロパティ ページ ダイアログ ボックスを開きます。
  3. VAccess1 プロパティ ページ ダイアログ ボックスの[Settings]タブをクリックし、IndexNumber フィールドをクリックします。選択したテーブルに定義されているインデックスのリストが表示されます。
  4. インデックス 0ID を選択し、[OK]をクリックします。図 5 に設定を示します。
図 5 IndexNumber プロパティの設定

実行時にインデックス番号を設定する方法として、コードによる方法と VAComboBox コントロールによる方法があります。

実行時にコードによりインデックス番号を設定するには

  1. インデックスを設定する VAccess コントロールをダブルクリックします。コード エディターが呼び出されます。
  2. 以下の例に倣って、コードを入力します。
    VAccess1.IndexNumber = 0 '最初のインデックスを選択 
    

実行時にコンボ ボックスでインデックス番号を設定するには

  1. フォームに VAComboBox を配置して選択します。
  2. VAccessName プロパティを VAccess コントロールの名前に設定し、VAFieldName プロパティを[Index List]に設定します。VAComboBox にはファイルからインデックスのリストが自動的に設定され、このリストからの選択によって、VAccess コントロールで使用されるインデックスが設定されます。

自動と手動のファイル オープンの設定

VAccess コントロールは AutoOpen プロパティの設定状態に基づいて、2 つの方法のいずれかで Pervasive PSQL データ ファイルを開きます(AutoOpen は設計時のみのプロパティです)。

も参照してください。

AutoOpen プロパティを設定するには

プロパティ ウィンドウで AutoOpen プロパティを設定するには、ドロップダウン リストから True または False を選択します。

次のように、プロパティ ページから AutoOpen を設定することもできます。

  1. コントロールを右クリックしてプロパティ ページを呼び出します。
  2. Settings]タブをクリックします。
  3. AutoOpen チェック ボックスを選択または選択解除します。チェック ボックスを選択すると、AutoOpenTrue に設定されます。チェック ボックスを選択解除すると、AutoOpenFalse に設定されます。

この例は、AutoOpenFalse に設定されている場合に、ファイルを閉じ、別のファイルを開く方法を示したものです。

' 現在開いているファイルを閉じる 
  VAccess1.Close 
' データ辞書情報を設定する 
  VAccess1.DdfPath = "file_path¥PSQL¥Demodata¥" 
  VAccess1.TableName = "Student" 
' ファイルを開く 
  VAccess1.Open 

データ ソースへのバウンド コントロールのリンク

VAccess コントロールをフォームに追加してプロパティを設定した後、必要なバウンド コントロールを追加し、この VAccess コントロールにバインドすることができます。これにより、それらのバウンド コントロールは VAccess コントロールが指定するデータにリンクされます。特定のバウンド コントロールについては、ActiveX コントロール リファレンスを参照してください。

8 個ある Pervasive バウンド コントロールのどれかをデータにリンクするには

  1. バウンド コントロールの VAccessName プロパティを、既にデータをポイントしている VAccess データ ソース コントロールの名前に設定します。
  2. VATextBox や VAOptionButton などのフィールド バウンド コントロールの場合は、VAFieldName プロパティをデータ ソース コントロール内のフィールドのうちの 1 つの名前に設定する必要もあります。

レコードの取得

以下の 3 つの方法でレコードを取得できます。

スクロール バーでレコードを取得するには

  1. VAHScrollBar または VAVScrollBar をフォームに追加して選択します。
  2. VAccessName プロパティを使用する VAccess コントロールに設定します。

コマンド ボタンでレコードを取得するには

  1. フォームに VACommandButton を追加して選択します。
  2. VAccessName プロパティを使用する VAccess コントロールの名前に設定し、VAOperation プロパティを希望の取得オペレーションに設定します。

使用可能な Pervasive PSQL オペレーションのリストについては、VAOperation を参照してください。

コードでレコードを取得するには

' 人の名前を表示 
' データ辞書情報を設定 
  'VAccess1.DdfPath = "file_path¥PSQL¥Demodata¥" 
  'VAccess1.TableName = "Person" 
  'VAccess1.IndexNumber = 1 (Last_Name + 'First_Name) 
Stat = VAccess1.GetFirst 
While Stat = 0 
    List1.AddItem VAccess1.FieldValue("Last_Name") _ 
    & " " & VAccess1.FieldValue("First_Name") 
    Stat = VAccess1.GetNext 
Wend 

特定のレコードの検索

以下の 2 つの方法で特定のレコードを検索できます。

テキスト ボックスで特定のレコードを検索するには

  1. フォームに VATextBox を配置します。
  2. VATextBox の VASearch プロパティを True に設定します。これにより、テキスト ボックスにテキストが入力されると、一致するレコードを取得するために VAccess コントロールで GetGreaterOrEqual メソッドが実行されるようになります。

コードで特定のレコードを取得するには

  1. VAccess コントロールをダブルクリックします。
  2. IndexNumber プロパティを設定して適切なインデックスを選択します。
  3. FieldValue メソッドを使用して、検索する値をインデックス フィールドに設定します。複数のフィールドを使用するインデックスの場合は、必ず各フィールドに値を代入してください。
  4. 次に、表 4 のメソッドのうちの 1 つを実行して目的のレコードを取得します。

    表 4 特定のレコードを取得するためのメソッド
    GetEqual
    キーと一致する最初のレコードを返します。
    GetGreater
    キーより後の次のレコードを返します。
    GetGreaterOrEqual
    キー レコード、またはキーより後のレコードを返します。
    GetLess
    キーより前のレコードを返します。
    GetLessOrEqual
    キー レコード、またはキーより前のレコードを返します。

  5. IndexNumber プロパティが、検索が行われるフィールドに対応するインデックスに設定されていることを確認してください。

' キー フィールドに検索値を入力 
VAccess1.FieldValue("last_name") = "Reich" 
VAccess1.FieldValue("first_name") = "Steve" 
' 正しいインデックス番号を設定してレコードを取得 
VAccess1.IndexNumber = 1 
stat = VAccess1.GetEqual 
If stat = 0 Then 
   MsgBox "レコードが見つかりました。" 
Else 
   MsgBox "ファイルには該当するレコードがありません。" 
End If 

レコードの追加、更新および削除

レコードを追加、更新または削除する方法として、以下の 2 つの方法があります。

コマンド ボタンでレコードを追加、更新または削除するには

  1. フォームに VACommandButton を配置します。
  2. VAccessName プロパティを対応する VAccess コントロールの名前に設定します。
  3. VAOperation プロパティを希望のオペレーションに設定します。可能なオペレーションのリストについては、本書の「プロパティ リファレンス」の VAOperation プロパティを参照してください。

コードでレコードを追加、更新または削除するには

以下の VAccess コントロール用カスタム メソッドの 1 つを使用し、コードからデータベースへの書き込みを行います。

表 5 レコードを追加、更新および削除するためのカスタム メソッド
Delete
現在のレコードを削除します。
Insert
メモリ内のレコードを新しいレコードとして挿入します。
Update
現在のレコードをメモリ内のレコードで更新します。

' 指定された学生の専攻科目を変更 
VAccess1.TableName = "Student" 
VAccess1.IndexNumber = 1 
VAccess1.FieldValue (ID) = 2001100 
stat = GetEqual 
If stat = 0 
   VAccess1.FieldValue ("Major") = "Music" 
   VAccess1.Update 
End If 

レコードのロック

Pervasive PSQL には、Pervasive の ActiveX アクセス方法でサポートされる次の 2 種類のロックがあります。単一レコード ノーウェイト ロックと複数レコード ノーウェイト ロックです。

Pervasive の ActiveX アクセス方法でこれらのロックを適用するには、以下のアプローチのうちの 1 つを使用します。

レコードをロック解除するには、Unlock メソッドを使用します。

レコード ロックと並行制御の詳細説明は、『Pervasive PSQL Programmer's Guide』でデータの整合性を参照してください。

'レコードをロックし、学生の名前を変更して、レコードを更新する 
Const SINGLE_NOWAIT_LOCK = 200 
Const MULTIPLE_NOWAIT_LOCK = 400 
VAccess1.FieldValue("ID") = "<valid #>" 
' ロック バイアス付きのロックをかけてレコードを取得 
stat = VAccess1.GetEqual SINGLE_NOWAIT_LOCK 
' 学生の名前を変更してレコードを更新 
' レコードの更新によりロックが解除される 
If stat = 0 
  VAccess1.FieldValue("Major") = "Astronomy" 
  VAccess1.Update 
End If 

ファイルの結合

VAccess コントロールの Join プロパティを使用すると、2 つのファイルをキー値でリンクし、第 1 ファイルのレコード位置におけるあらゆる変更が、第 2 ファイルから取得されるレコードにも反映されるようにすることができます。Join プロパティは、リレーショナル データベースを参照するための簡単なメカニズムを提供します。

スレーブ コントロール内の結合フィールドはインデックス フィールドである必要があり、また、マスター コントロール内の対応するフィールドと同じ未加工データが含まれていなければなりません。マスター コントロール内のフィールドは、インデックスである必要はありません。スレーブ コントロールの IndexNumber プロパティは、結合に関係するインデックスに設定されたままにしておく必要があります。そうしないと、結合が断たれます。

1 対 1、多対 1、1 対多、多対多の結合はすべてサポートされます。VAListBox の VAccessName プロパティをスレーブ コントロールの名前に設定し、VAFieldName プロパティを表示されるフィールドに設定することによって、データをレコード リスト モードで表示できます。

2 つの VAccess コントロールを結合するには

  1. スレーブ コントロールとする VAccess コントロールを選択します。
  2. プロパティ ウィンドウで、[Join]ボタンをクリックして[Join Controls]ダイアログ ボックスを開きます。ダイアログ ボックスの左側には、結合元のスレーブ コントロールのテーブルとそのテーブルの選択したインデックスが表示されます。右側には、結合先のマスター コントロールとそのコントロールで使用できるフィールドが表示されます。
  3. マスター コントロールをスレーブ コントロールのテーブルに結合するには、マスター コントロールのフィールドをクリックします。そうすると、Equals 列の下にフィールドが表示され、そのフィールドが結合されていることを示します。

Extended オペレーションの有効化

Extended オペレーションを使用すると、複数のレコードに対するリクエストの処理を Pervasive PSQL トランザクショナル インターフェイスにさせることが可能になります。ネットワーク サーバー ベースの Pervasive PSQL システムでは、Extended オペレーションによってネットワーク トラフィックを大幅に削減し、データ取得を高速化することができます。

Extended オペレーションは、複数のレコードを一度に読み取る際に最も有効です。たとえば、統計データを収集して表に記入するためにファイルをスキャンしたり、表、レポートまたはグリッドを作成するために多数のレコードを一度に要求したり、必要なレコードを照合するための適切なインデックスを持たないデータベースに対する一度限りの検索を実行するのに適しています。

Extended オペレーションは個々のレコードにアクセスするためのインデックス付きレコード取得に代わるものではなく、データ セットを高速に取得するための強力なツールになります。

Extended オペレーションを使用可能にするには

  1. Extended オペレーションで使用する VAccess コントロールを選択します。
  2. プロパティ ウィンドウを使用している場合は、ExtendedOps プロパティを True に設定します。プロパティ ページを使用している場合は、[Extended Operations]タブをクリックし、[ExtendedOps]チェック ボックスをオンにして、[OK]をクリックします。

Pervasive の ActiveX アクセス方法は、以下の Extended Fetch メソッドをサポートします。

Init メソッドの使用

Init メソッドは、SelectedFields または SelectedRecords プロパティを変更した後、あるいは、単一レコードのフェッチ メソッドを使ってファイル内の現在のカーソル位置を再設定してから Extended Fetch メソッドを呼び出すまでの間に使用します。

AutoMode プロパティによるデータ「スナップショット」の構築

AutoMode を有効にすると、VAccess データ ソースは選択基準を満たす行が取得されるときにそれらをすべてメモリにキャッシュして、データの「スナップショット」を構築できるようにします。Row プロパティを使用して返されたレコード セットを走査したり、RowColumnValue メソッドを使用してレコード セット内の任意の行と列における値を取得することができます。

AutoMode を使用するには

  1. VAccess コントロールの ExtendedOpsAutoMode プロパティを True に設定して、Extended オペレーションを使用可能にし、コントロールをオートモードに切り替えます。
  2. 取得するレコード セットを指定するために、コントロールの SelectedFieldsSelectedRecords プロパティを設定します。
  3. 取得オペレーションごとに取得する最大レコード数を CacheRows プロパティに設定します。
  4. ユーザーがスキャンを終了する前にスキャンを取り消せるようにする場合は、CancelDialog プロパティを True に設定します。

AutoMode は環境によっては Extended オペレーションを使いやすくしますが、使用可能メモリの制限を受けます。AutoMode を無効(デフォルト)にして、明示的な Extended Fetch メソッドの GetNextExtendedGetPreviousExtendedStepNextExtended、または StepPreviousExtended を使用すれば、考慮したブロックでデータ セットを返すことができます。

Extended Fetch メソッドの使用

Extended Fetch メソッドの GetNextExtendedGetPreviousExtendedStepNextExtended および StepPreviousExtended はファイル内の現在のカーソルの位置から始まり、指定された選択基準を満たす一連の行(レコード)と列(フィールド)を返します。Get メソッドは、現在のインデックスを使用してインデックス順にレコードを返します。Step メソッドは、物理位置の順序で並べられたレコードを返します。Step メソッドは一般にほかのメソッドより高速なので、返されるレコードの順序が重要でない場合に使用してください。

特定の Extended Fetch オペレーションから返される最大レコード数の設定には、いくつかのプロパティが関与します。

Extended Fetch オペレーション後の現在のカーソル位置は、オペレーションでスキャンされた最後のレコードに対応します。このカーソル位置は、レコード選択基準が指定されているアプリケーションでは不確定です。なぜなら、この位置は実際に取得された最後の行を超えている可能性があるからです。

IncludeCurrent プロパティの設定によって、次の Extended Fetch オペレーションが現在のカーソル位置のレコードをスキャンするか、後続のレコードから開始するかが決まります。ほとんどの場合、このプロパティを設定する必要はありません。このプロパティは自動的に、Init メソッドで True に設定され、Extended Fetch の後に False に設定されます。それ以降の Extended Fetch オペレーションで現在のカーソル位置のレコードを取り込むには、オペレーションの直前にこのプロパティに True を設定します。

結合ファイルに対する ExtendedOps の使用

ExtendedOps プロパティは、典型的な「品目を注文するための注文ヘッダー レコード」などに見られるような、1 対多関係の VAccess データ コントロールの結合を高速化かつ単純化することができます。結合されたデータ ソース(この例では Orderlines コントロール)に対して Extended オペレーションを有効にすると、適応するクエリが自動作成され、コントロールは Extended オペレーションを使って結合(Join)を実行し、結合基準に合致する結合ファイルから、すべてのレコードを Extended Fetch のレコード セットとして返します。

Extended Fetch の最適化

Extended Fetch オペレーションを最も効率よく使用するには、まず、検索条件に合う最初のレコードのできるだけ近くにカーソルを置きます。多くの場合、まず GetEqual または GetGreaterOrEqual メソッドをインデックスと併用して、Pervasive PSQL が必要なレコードを返すためにスキャンしなければならないレコードの範囲を制限し、初期位置を確立してから、次に GetNextExtended を使用して後続のレコードを取得できます。

CacheRejectMax プロパティは、SelectedRecords の基準で現在のインデックス上のレコードが制限される場合に有効です。たとえば、CacheRejectMax プロパティの値を 1 に設定すると、Pervasive PSQL サーバー プロセスに対し、基準に合わない最初のレコードを見つけたら停止するよう指示することができます。

ファイル全体をスキャンする必要があってもレコードの順序が重要でない場合は、StepFirst メソッドでファイルの先頭にカーソルを置き、StepNextExtended メソッドでファイルをスキャンすることによって、時間をある程度節約できます。Step メソッドの方が一般に高速なのは、インデックス パスに沿ってレコードを照合する必要がないからです。

SelectedFields プロパティに入手したいフィールドのみを指定することによっても、時間とリソースを節約できます。Extended Fetch オペレーションの制限要因はデータ バッファーのサイズなので、各行に必要なメモリが少ないほど、一度に返せる行が多くなります。

ここで、Extended オペレーションは別のタスク、一般には Pervasive PSQL サーバー プロセスで実行されるため、アプリケーションは拡張クエリを実行するとすぐにプロセスの制御を放棄し、クエリ条件が満たされるまでもう 1 つのプロセスが制御を引き受けるということに留意してください。したがって、拡張クエリを計画し最適化すれば、アプリケーションのパフォーマンスに大きな差が出てくる可能性があります。

' 奨学金を受けているすべての学生の ID を出力 
Q = Chr$(34) 
' Student ID はインデックスなので、レコードの並べ替えに 
' 使用できます。 
' しかし、選択条件にはインデックスがありません。したがって、 
' データベース全体をスキャンする必要があります。 
' 効率を上げるため、Extended オペレーションを使用します。 
VAccess1.ExtendedOps = True 
' レコード選択条件を指定することにより、Pervasive PSQL が 
' サーバーでレコードにフィルターをかけるようにできます。 
VAccess1.SelectedRecords = "Scholarship_Amount > " & Q & 
"0" & Q 
' 必要なのは金額と Student ID だけなので、この情報を返すだけで、 
' 一度により多くのレコードを取得することができます。 
VAccess1.SelectedFields = "ID,Scholarship_Amount" 
' データの並べ替えは不要なので、Step オペレーションを使用します。 
' Step オペレーションは物理位置に基づいているので、 
' データベースを最も速く読むことができます。 
VAccess1.StepFirst 
VAccess1.Init 
Do 
  Stat = VAccess1.StepNextExtended 
  ' 注意:Extended フェッチは、ファイルの終わり(9)のような 
  ' ステータス値を返しても、有効なデータを返すことがあります。 
  For R = 1 to VAccess1.Rows 
    List1.AddItem VAccess1.RowColumnValue(R, 1) & Chr$(9) 
& _ 
      Format(VAccess1.RowColumnValue(R, 2), "Currency") 
  Next R 
Loop While Stat = 0 

ActiveX で使用されるファイルとディレクトリ

Pervasive PSQL ActiveX ファイルの配布と登録