コンボボックスのNotInListイベントから新規レコードを登録するには (Part 2)



コンボボックスのNotInListイベントを利用して、新規レコードを登録する方法を解説します。ここで紹介する方法は、レコードの主キーがオートナンバー以外のときも適用できます。Part1では、NotInListのイベント内で新規レコードを登録しています。Part2では、NotInListイベントからポップアップフォームを開いてフォームから新規レコードを登録します。

  1. Access 2000を起動して Northwind.mdb を開きます。


  2. データベースウィンドウからフォームのタブをクリックして、新規作成ボタンをクリックします。

  3. フォームが表示されたら、図1に示すような得意先レコードを新規登録するためのフォームを作成します。コマンドボタンのコントロール名は、cmdOK, cmdCancelのように書き換えます。


    図1-得意先レコードを新規登録するフォーム


    メニューからコードのアイコンをクリックしてフォームモジュールを表示させてリスト1の各種イベント処理をコピー&ペーストします。

    リスト1-得意先レコード登録フォームの各種イベント処理
    
    ' ***************************
    Private Sub cmdCancel_Click()
      Me.Undo
      DoCmd.Close acForm, Me.Name
    End Sub
    
    ' ***********************
    Private Sub cmdOK_Click()
      Me.Visible = False
    End Sub
    
    ' *********************
    Private Sub Form_Load()
      If Len(Me.OpenArgs) > 0 Then
        Me.得意先名 = Me.OpenArgs
      End If
    End Sub

    Form_Loadイベントでは、引数(NewData)を取得してフォーム上の得意先名のフィールドに格納します。OKボタンをクリックしたときは、VisibleプロパティをFalse(非可視状態)に設定して制御を戻します。Cancelボタンをクリックしたときは、フォームを閉じて制御を戻します。

    Tip:
    ダイアログモードで開いたフォームは、フォームを非可視状態にするか閉じると制御が戻ります。


  4. フォームをfrmCustomer2の名称で保存して閉じます。

  5. 新規登録ボタンをクリックして得意先テーブルのコンボボックスを作成します。

    図2-フォーム上に得意先テーブルのコンボボックスを作成

    コンボボックスのプロパティは以下のように設定します。

    オブジェクト プロパティ 設定値
    コンボボックス 名前 cboCustomer
    値集合タイプ テーブル/クエリ
    値集合ソース SELECT 得意先.得意先コード, 得意先.得意先名
    FROM 得意先;
    連結式 1
    列数 2
    列幅 0cm;3cm


    メニューからコードのアイコンをクリックしてフォームモジュールを表示させてリスト2のNotInListイベント処理をコピー&ペーストします。

    リスト2-コンボボックスのNotInListイベント処理コード
    
    ' *******************************
    Private Sub cboCustomer_NotInList( _
      NewData As String, Response As Integer)
      
      Dim strMsg As String
        
      strMsg = NewData _
         & " が得意先テーブルに存在しません!" _
         & vbCrLf & "登録しますか?"
      If MsgBox(strMsg, vbYesNo + vbQuestion, "得意先") = vbYes Then
        DoCmd.OpenForm "frmCustomer2", _
          DataMode:=acFormAdd, _
          WindowMode:=acDialog, _
          OpenArgs:=NewData
        
        If IsLoaded("frmCustomer2") Then
          Response = acDataErrAdded
          DoCmd.Close acForm, "frmCustomer2"
        Else
          Response = acDataErrContinue
        End If
      Else
        Response = acDataErrContinue
      End If
    End Sub
    
    ' *****************************************
    Private Function IsLoaded(strName As String) _
      As Boolean
      IsLoaded = (SysCmd(acSysCmdGetObjectState, acForm, strName) <> 0)
    End Function
      
    

    NotInListのイベントでは、レコードを新規登録するかどうか問い合わせをして、NoのときはResponseにacDataErrDisplayを設定して戻ります。Yesのときは、frmCustomer2を開きます。このとき、frmCustomer2からOKまたはCancelボタンをクリックするまで制御が止まるようにacDialogモードで開きます。

    frmCustomer2から制御が戻ったら、OKまたはCancelのいずれのボタンをクリックしたか調べるためにIsLoaded()関数を呼びます。frmCustomer2がまだロードされているときはOKボタン、frmCustomer2が閉じられている(アンロード)ときはCancelボタンをクリックしたことを意味します。

  6. フォームをfrmNotInListWithFormの名称で保存します。

  7. フォームビューに切り替えたら、コンボボックスにフレンドリーソフト2と入力してリターンキーを押します。登録するかどうか問い合わせのメッセージが表示されたら、はいをクリックします。得意先を新規登録するフォームが表示されますので、データを入力してOKボタンをクリックします。コンボボックスの一覧に新規登録したレコードが表示されるか確認します。




    図3-コンボボックスに未登録の得意先名を入力してフォームから新規登録した例


  8. 最後に、フォームを閉じてAccess 2000を終了します。