結合テーブルのレコードセットを返すストアドプロシージャについて

 ストアドプロシージャに連結するフォームを作成するときに、今までの例のようにひとつのテーブルについてレコードを抽出する場合は別に問題が起こりません。ところがストアドプロシージャの中で、2つ以上のテーブルを結合し必要な列だけを抜き出した場合には注意が必要です。特に、参照整合性のある多側テーブルの入力を行なうフォームを想定してください。
 DBSETUP.SQLプログラムを実行すると、医師テーブルと患者テーブルを作成します。患者テーブルの中に、その患者の主治医を表わす番号を入れます。この番号が医師テーブルの医者IDを表わします。医師テーブルが1側で、患者テーブルが多側になります。
 患者データを表示するためのストアドプロシージャが「PROC_患者登録」です。このストアドプロシージャをADPプロジェクトから普通に実行すると、図15のようなレコードが表示されます。レコード移動ボタンの新規登録ボタンが使用不能となっていることからもわかる通り、ここで得られたレコードセットの内容は変更することができません。また新しいレコードの追加登録も行なうことができません。この状態ではまだ参照しか許されない状態です。

図15:PROC_患者登録 ストアドプロシージャを実行した状態

 Access 2000ではストアドプロシージャの出力するレコードセットの内容を表示することができますが、受け取ったデータの内容を修正するためには条件が必要です。それは、ストアドプロシージャが返すレコードセットと1対1に対応しているテーブル側のデータに限り修正が可能だからです。
 「PROC_患者登録」の例のように、1側のテーブルと多側のテーブルを結合した場合に得られるレコードセットは、多側テーブルと1対1に対応します。このため、患者テーブルの内容は修正を行なうことができますが、医師側テーブルは参照しかできません。
 それでは、「PROC_患者登録」に連結したフォームを作成してみましょう。

  1. フォームウィザードを起動します。図16のように患者テーブルを選択し、その列を全部選択します。

    図16:患者テーブルの列を全部選択する

  2. 図16の状態で、次に医者テーブルを選択してください。ストアドプロシージャが返すレコードセットの内容に合わせて、「医師の名前」と「医師の電話番号」を追加します(図17)。

    図17:医師テーブルの列も患者テーブルの後に追加する

  3. データの表示方法を確認します(図18)。ストアドプロシージャのレコードセットに一致する「by患者」を選択します。

    図18:データの表示方法の確認

  4. フォームのレイアウトは「単票形式」、スタイルは「標準」、フォームの名前は「患者」とします。
  5. 以上でフォームが作成されますので、フォームのプロパティを修正します。
  6. レコードソースを、「PROC_患者登録」のストアドプロシージャに変更します。
  7. 「固有のテーブル」プロパティは、結合テーブルのうちどのテーブルが多側テーブルなのかを選択するものです。この固有のテーブルに指定されたテーブルに限り、レコードの修正が許可されます。この例では、患者テーブルが多側テーブルに相当しますので、患者テーブルを選択します。
  8. 「再同期コマンド」プロパティは、多側テーブルの外部キーの値が修正された場合に、レコードの値を再取得するためのSQL文またはストアドプロシージャの呼び出しを定義します。この例では、患者テーブルの「主治医」の値が修正されたときに、医師テーブルの「医師の名前」と「医師の電話番号」の取得方法をAccess 2000に教えます。DBSETUP.SQLプログラムの中で定義された「PROC_患者更新」ストアドプロシージャを使って、
          PROC_患者更新?
    
      と入力します。「?」は、パラメータの位置を表わし、Accessによって多側テーブルの主キーの値(患者IDの値)が設定されます。
      Access 2000のヘルプファイルの記述が不十分で、この再同期コマンドに設定するSQLの書き方がよくわかりませんでした。最初は「医師の名前」と「医師の電話番号」だけを返すSQL文かなと思いましたが、うまく動いてくれません。結局、レコードのすべてのフィールドを返すSQL文だったのです。このため、「PROC_患者更新」は、「PROC_患者登録」にレコード選択を入れたものになります。

     以上のプロパティの設定を図19に示します。

    図19:フォームのプロパティの設定

     プロパティを設定したら、フォームを開いてください(図20)。患者テーブルの内容を変更することができますが、医師側テーブルの「医師の名前」と「医師の電話番号」の内容を変更することはできません。自動的にロックがかかります。一方、多側テーブルの修正は許されます(固有のテーブルで定義したテーブル)。

    図20:フォームの完成(PROC_患者登録に連結したもの)

     また患者テーブルは新規レコードを登録することができます(図21)。ただ「医師の名前」と「医師の電話番号」は、入力することはできません。

    図21:新しい患者のレコードを登録します

     入力後、次レコードに移動します(図22)。そして、1レコード前に戻ってください。この時先ほど入力した新規レコードの内容がすべて表示されます(図23)。このレコード表示機能が、「再同期コマンド」の役目です。

    図22:次レコード移動で、EOF位置に移動する

    図23:前レコードに戻る。図21で入力できなかった医師の名前と電話が表示される