|
ここでは、ActiveX アクセス方法を使用したアプリケーションの作成に関連する主な作業を行う方法について説明します。作業項目は以下のとおりです。
Pervasive の ActiveX アクセス方法のデータ ソースとバウンド コントロールを Visual Basic プロジェクトに追加するには
VAccess コントロールはデータをポイントするもので、ほかすべての Pervasive PSQL コントロールがバインドするマスター コントロールです。このコントロールは、Pervasive PSQL とのすべての通信を処理します。
Visual Basic フォームにデータ ソース コントロールを追加するには
次に、この VAccess コントロールのプロパティを設定する必要があります。プロパティへのアクセス、プロパティの設定、および Pervasive PSQL ファイルへの接続をお読みください。
コントロールのプロパティは次の 3 つの場所で設定できます。
コントロールを右クリックし、ショートカット メニューから[プロパティ]を選択すると、プロパティ ページが表示されます。これは、コントロールの Pervasive PSQL ActiveX プロパティを設定できるタブ付きのダイアログ ボックスです。詳細については、図 2 を参照してください。
Visual Basic のプロパティ ウィンドウには、Visual Basic に固有のプロパティなど、選択したオブジェクトのすべてのプロパティ セットが表示されます。図 3 を参照してください。
フォームまたはコントロールをダブルクリックすると、Visual Basic のコード エディターが開きます。コード エディターの使用方法については、Visual Basic のマニュアルを参照してください。各プロパティの構文などの詳細については、本マニュアルを参照してください。
コントロールのプロパティを設定するには
メモ
プロパティには、設計時または実行時に設定できるものと、設計時または実行時にしか設定できないものがあります。
VAccess コントロールには、このコントロールを Pervasive PSQL データ ファイルへ接続するための重要なプロパティとして、DdfPath、TableName および Location という 3 つのプロパティがあります。これらのプロパティにアクセスする最も簡単な方法は、コントロールを右クリックしてショートカット メニューから[プロパティ]を選択したときに表示されるプロパティ ページからアクセスする方法です。プロパティ ウィンドウからも、これらのプロパティにアクセスできます。
データに接続するための 3 つの重要なプロパティを以下に示します。
データを指定するプロパティを設定するには
.MKD
ファイルに変更されます。
VAccess コントロールの IndexNumber プロパティは、レコード取得メソッドを呼び出すときに VAccess コントロールで使用されるインデックスを決定します。このインデックスは、設計時に VAccess コントロールのプロパティ ウィンドウで設定するか、あるいは、実行時にコードで設定できます。
設計時にインデックス番号を設定するには
プロパティ ウィンドウでは、IndexNumber プロパティのドロップダウン リストから値を選択してプロパティを設定できます。
次のように、プロパティ ページから IndexNumber を設定することもできます。
実行時にインデックス番号を設定する方法として、コードによる方法と VAComboBox コントロールによる方法があります。
実行時にコードによりインデックス番号を設定するには
実行時にコンボ ボックスでインデックス番号を設定するには
VAccess コントロールは AutoOpen プロパティの設定状態に基づいて、2 つの方法のいずれかで Pervasive PSQL データ ファイルを開きます(AutoOpen は設計時のみのプロパティです)。
例も参照してください。
AutoOpen プロパティを設定するには
プロパティ ウィンドウで AutoOpen プロパティを設定するには、ドロップダウン リストから True または False を選択します。
次のように、プロパティ ページから AutoOpen を設定することもできます。
この例は、AutoOpen が False に設定されている場合に、ファイルを閉じ、別のファイルを開く方法を示したものです。
' 現在開いているファイルを閉じる VAccess1.Close ' データ辞書情報を設定する VAccess1.DdfPath = "file_path¥PSQL¥Demodata¥" VAccess1.TableName = "Student" ' ファイルを開く VAccess1.Open
VAccess コントロールをフォームに追加してプロパティを設定した後、必要なバウンド コントロールを追加し、この VAccess コントロールにバインドすることができます。これにより、それらのバウンド コントロールは VAccess コントロールが指定するデータにリンクされます。特定のバウンド コントロールについては、ActiveX コントロール リファレンスを参照してください。
8 個ある Pervasive バウンド コントロールのどれかをデータにリンクするには
以下の 3 つの方法でレコードを取得できます。
スクロール バーでレコードを取得するには
コマンド ボタンでレコードを取得するには
使用可能な 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 つの方法で特定のレコードを検索できます。
テキスト ボックスで特定のレコードを検索するには
コードで特定のレコードを取得するには
' キー フィールドに検索値を入力 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 つの方法があります。
コマンド ボタンでレコードを追加、更新または削除するには
コードでレコードを追加、更新または削除するには
以下の VAccess コントロール用カスタム メソッドの 1 つを使用し、コードからデータベースへの書き込みを行います。
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 コントロールを結合するには
Extended オペレーションを使用すると、複数のレコードに対するリクエストの処理を Pervasive PSQL トランザクショナル インターフェイスにさせることが可能になります。ネットワーク サーバー ベースの Pervasive PSQL システムでは、Extended オペレーションによってネットワーク トラフィックを大幅に削減し、データ取得を高速化することができます。
Extended オペレーションは、複数のレコードを一度に読み取る際に最も有効です。たとえば、統計データを収集して表に記入するためにファイルをスキャンしたり、表、レポートまたはグリッドを作成するために多数のレコードを一度に要求したり、必要なレコードを照合するための適切なインデックスを持たないデータベースに対する一度限りの検索を実行するのに適しています。
Extended オペレーションは個々のレコードにアクセスするためのインデックス付きレコード取得に代わるものではなく、データ セットを高速に取得するための強力なツールになります。
Extended オペレーションを使用可能にするには
Pervasive の ActiveX アクセス方法は、以下の Extended Fetch メソッドをサポートします。
Init メソッドは、SelectedFields または SelectedRecords プロパティを変更した後、あるいは、単一レコードのフェッチ メソッドを使ってファイル内の現在のカーソル位置を再設定してから Extended Fetch メソッドを呼び出すまでの間に使用します。
AutoMode を有効にすると、VAccess データ ソースは選択基準を満たす行が取得されるときにそれらをすべてメモリにキャッシュして、データの「スナップショット」を構築できるようにします。Row プロパティを使用して返されたレコード セットを走査したり、RowColumnValue メソッドを使用してレコード セット内の任意の行と列における値を取得することができます。
AutoMode を使用するには
AutoMode は環境によっては Extended オペレーションを使いやすくしますが、使用可能メモリの制限を受けます。AutoMode を無効(デフォルト)にして、明示的な Extended Fetch メソッドの GetNextExtended、GetPreviousExtended、StepNextExtended、または StepPreviousExtended を使用すれば、考慮したブロックでデータ セットを返すことができます。
Extended Fetch メソッドの GetNextExtended、GetPreviousExtended、StepNextExtended および StepPreviousExtended はファイル内の現在のカーソルの位置から始まり、指定された選択基準を満たす一連の行(レコード)と列(フィールド)を返します。Get メソッドは、現在のインデックスを使用してインデックス順にレコードを返します。Step メソッドは、物理位置の順序で並べられたレコードを返します。Step メソッドは一般にほかのメソッドより高速なので、返されるレコードの順序が重要でない場合に使用してください。
特定の Extended Fetch オペレーションから返される最大レコード数の設定には、いくつかのプロパティが関与します。
Extended Fetch オペレーション後の現在のカーソル位置は、オペレーションでスキャンされた最後のレコードに対応します。このカーソル位置は、レコード選択基準が指定されているアプリケーションでは不確定です。なぜなら、この位置は実際に取得された最後の行を超えている可能性があるからです。
IncludeCurrent プロパティの設定によって、次の Extended Fetch オペレーションが現在のカーソル位置のレコードをスキャンするか、後続のレコードから開始するかが決まります。ほとんどの場合、このプロパティを設定する必要はありません。このプロパティは自動的に、Init メソッドで True に設定され、Extended Fetch の後に False に設定されます。それ以降の Extended Fetch オペレーションで現在のカーソル位置のレコードを取り込むには、オペレーションの直前にこのプロパティに True を設定します。
ExtendedOps プロパティは、典型的な「品目を注文するための注文ヘッダー レコード」などに見られるような、1 対多関係の VAccess データ コントロールの結合を高速化かつ単純化することができます。結合されたデータ ソース(この例では Orderlines コントロール)に対して Extended オペレーションを有効にすると、適応するクエリが自動作成され、コントロールは Extended オペレーションを使って結合(Join)を実行し、結合基準に合致する結合ファイルから、すべてのレコードを 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
|