14.登録処理
 登録処理はフォーム「登録変更」を使用して行います。が、フォーム「登録変更」は既に登録されているデータをクエリーで抽出し表示するという作りにしました。しかし、登録とは新しくデータを追加する処理です。ちょっとヤバイ・・・?登録用のフォームを作ってみる?
 しかし、同じようなフォームが2つあるのもムダなので、強引に使っちゃいましょう!登録されたデータしか表示できないのなら登録しちゃえばいいのです!

 登録処理を行うときは、仮として新しいレコードを作って、それに対しての変更という形にします。もし、取り消しをしたい場合は削除してしまえば誰にも気づかれません(笑)
レコードの仮登録プロシジャ
 レコードを追加し、追加したレコードのレコードキーを呼び出しもとへ返すという処理です。ステータス1としたのは、仮登録を識別するためのものです。取り消し(登録変更)を押したとき、仮登録ならレコードの削除を行って証拠隠滅(?)をします。作成先はモジュールです。

Sub 仮登録(仮登録キー As Long)

  '記述場所:モジュール「AddressBookModule」

  Call テーブルオープン

  tbl.AddNew
  仮登録キー = tbl!レコードキー
  tbl!ステータス = 1
  tbl.Update

  Call テーブルクローズ

End Sub

 ステータスの謎が、徐々に明かされてきたでしょ?
削除処理
 登録を取り消したいときに、仮登録レコードを削除するためのプロシジャも作ります。削除対象は、クエリーで抽出されているレコードです。
 なお、このプロシジャは、後でレコード削除オペレーションの所でも利用します。
 これも、作成先はモジュールです。

Sub レコード削除()

  '記述場所:モジュール「AddressBookModule」

  'Access97、2003での手順
  Call テーブルオープン
  Dim qry As Recordset
  Set qry = db.OpenRecordset("汎用クエリー", DB_OPEN_DYNASET)

  qry.Delete

  qry.Close
  Call テーブルクローズ

End Sub
 ※Access97、2003の場合。太字の部分がAccess2000以降との違い。

Sub レコード削除()

  '記述場所:モジュール「AddressBookModule」

  'Access2000での手順
  Call テーブルオープン
  Dim qry As DAO.Recordset
  Set qry = db.OpenRecordset("汎用クエリー", dbOpenDynaset)

  qry.Delete

  qry.Close
  Call テーブルクローズ

End Sub
 ※Access2000の場合。太字の部分がAccess97、2003との違い。
フォーム「メニュー」への機能追加
 メニューで登録ボタンを押したとき登録処理が行えるようにメニューへ処理を追加しましょう。追加場所は登録ボタンのクリックイベント、追加する内容はレコードの仮登録、仮登録レコード抽出クエリーの作成、登録変更の表示です。

Private Sub 登録_Click()

  '記述場所:フォーム「メニュー」
  '記述箇所:「登録」ボタンのイベント「クリック時」

  Dim 仮登録キー As Long

  Call 仮登録(仮登録キー)
  Call 処理対象抽出クエリー創成(仮登録キー)

  DoCmd.OpenForm "登録変更"

End Sub
またまたフォーム「登録変更」への機能追加
 今回のフォーム「登録変更」の修正は取り消しを押したときの処理の追加です。

 新規登録時はレコードは仮で登録されているので、取り消しが押されたときは仮のレコードを削除しなくてはなりません。その処理を追加します。
 仮のレコードかどうかはステータスで判断します。この為にステータスがあったんですねぇ!いままで「何に使うんじゃ??」って思ってた人、やっとぐっすり眠ることができますね(笑)

 追加する部分は取り消しボタンのイベントクリック時で、次のようにします。

Private Sub 取り消し_Click()

  '記述場所:フォーム「登録変更」
  '記述箇所:「取り消し」ボタンのイベント「クリック時」

  If ステータス = 1 Then
    Call レコード削除
  End If

  DoCmd.Close

End Sub
 ※太字が追加する部分

 If文で参照しているステータスは、フォーム上のテキストボックスです。フォーム上のテキストボックス等のコントロールを参照するときは、このようにコントロール名(プロパティの名前で定義したもの)で参照できます。
 ところで、ステータスを隠しオブジェクトにした理由が、これでわかったでしょ?入力する必要がないというか、入力できるようにすると、まともな処理が行えないからです。

 なお、If文に関しての説明は省略します。プログラムを組んだことのある人だったら、見りゃ分かると思ったので。
登録できるか確認してみよう
 はーい、確認の時間です!(笑)
 レコードが登録できるか、取り消しの時レコードが削除されるか、いろいろ確認してみるとよいですよ。
Copyright(C) 1999-2006 結城圭介。 All rights reserved