メールマガジン【アクセスで作るシリーズ】


バックナンバー 【住所録ソフト編】 Vol.17
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□

    ACCESSで作るシリーズ  【住所録ソフト編】

    発 行 : Yoshihisa Fukuda          2001.03.02 Vol.17

■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
--------------------------------------
今回は、住所フォームと住所一覧フォームの修正です。
______________________________________
 □ 住所フォームに削除ボタンを付ける。

1.データベースウィンドウの[フォーム]タブを選択します。

2.住所フォーム[AddressForm]を選択し[デザイン]ボタンを押下します。

3.ツールバーのコマンドボタンを選択し[閉じる]ボタンの右横あたりにボタンを
  追加します。(コントロールウィザードは無効にしておきます)

4.追加したボタンの以下のプロパティを設定します。

  名前 ・・・ RecDelBtn
  標題 ・・・ 削除

5.削除ボタンを選択した状態で[クリック時]プロパティに[イベントプロシージャ]
  を設定し、右端の[...]ボタンを押下してモジュールウィンドウを開きます。

6.モジュールウィンドウを開いたら、Private Sub RecDelBtn_Click() と
  End Sub の間に以下のコードを記述します。

  Private Sub RecDelBtn_Click()
    Dim SqlStr As String

    SqlStr = "delete * from JointlyTable WHERE OwnerID=" & Me.ID
    DoCmd.RunSQL SqlStr

    SqlStr = "delete * from AddressTable WHERE ID=" & Me.ID
    DoCmd.RunSQL SqlStr

    Me.Requery
  End Sub

8.モジュールを保存してウィンドウを終了します。

9.フォームを保存して終了します。

【解説】

 住所フォームの削除ボタンのプログラム解説です。

 住所フォームで削除ボタンを押した場合、表示中の住所データを削除する訳ですが、
 住所フォームには住所テーブルのデータ以外に連名テーブルのデータもあります。

 従って、削除ボタンを押された時は、連名テーブルのデータを削除してから、住所
 テーブルのデータを削除します。

 では、コードを1行目から順番に見て行きましょう。

 1.1行目の Dim 文は、お馴染みの変数宣言です。
   SqlStrと言う変数を変数型String(文字列)として宣言しています。
 2.3行目はSqlStrと言う変数に文字列を代入しています。
   代入する文字列はSQL文です。

   "delete * from JointlyTable WHERE OwnerID=" & Me.ID を代入する訳ですが

   "delete * from JointlyTable WHERE OwnerID=" までは単なる文字列です。

   その後ろの & Me.ID は Me.ID を結合します。
   Me.IDは現在住所フォームで表示しているデータのIDです。

   例えば、現在表示しているデータの ID が5だとすると、このSQL文字列は
   "delete * from JointlyTable WHERE OwnerID=5" となります。
   これで、現在表示中のデータの連名テーブルのデータが削除されます。

   では、このSQL文を解説しましょう。
   まず delete はテーブルのデータの削除です。
   どのテーブルのデータを削除するかは from JointlyTable で、連名テーブル
   からデータを削除します。

   どのデータを削除するかは、次の WHERE句で決まります。
   ここでは WHERE OwnerID=" & Me.ID となっているので、OwnerID がMe.IDと
   同じデータ、先程の例で言うと OwnerID が5のデータを削除となります。

   このWHERE句を付けないと連名テーブルの全データを削除します。

  ※SQLに関しては【会計ソフト編】のVol.53、54、55でも、説明していますので
   参考にして下さい。
   【会計ソフト編】バックナンバーは http://homepage2.nifty.com/f-soft/
   のメールマガジンのページから、【会計ソフト編】バックナンバーへ行けます。

 3.4行目の DoCmd.RunSQL SqlStr は変数 SqlStr のSQL文を実行します。
   DoCmd.RunSQL で第一引数に指定した SQL文を実行します。

   例えば、SqlStrと言う変数を使わないで、ここで直接
   DoCmd.RunSQL "delete * from JointlyTable WHERE OwnerID=" & Me.ID と
   記述しても同じです。

 4.6行目は、3行目と同じで、SQL文を変数 SqlStr に代入しています。
   異なる点は削除するテーブルが連名テーブルから住所テーブルに変わっている
   のと、WHERE句の条件の OwnerID が ID に変わっています。

 5.7行目は4行目とまったく同じです。
   ここで6行目で代入したSQL文を実行しています。

 6.9行目の Me.Requery は、住所フォームのレコードソース(即ちAddressTable)
   を再クエリーしています。
   この再クエリーをしないと、データを削除した後、フォームの表示で全フィー
   ルドに #Deleted と表示されます。
   これは、現在表示中のレコードが無い(削除された)事を意味します。
   そこで、 Me.Requery で再クエリーする事で、住所フォームの削除レコードは
   表示されなくなります。
______________________________________
 □ 住所一覧選択でエンターキーでも選択できる様にする。

1.データベースウィンドウの[フォーム]タブを選択します。

2.住所一覧選択[AddrListForm]を選択し[デザイン]ボタンを押下します。

3.リストボックス[AddrList]を選択し[キークリック時]プロパティを[イベント
  プロシージャ]にして、右端の[...]ボタンを押下します。

4.モジュールウィンドウが開いたら、
  Private Sub AddrList_KeyDown(KeyCode As Integer, Shift As Integer)
  と End Sub の間に、以下のコードを記述します。

If KeyCode = vbKeyReturn Then
  Dim varItm As Variant

  For Each varItm In Me.AddrList.ItemsSelected
    Forms![AddressForm]![Address] = Me.AddrList.Column(0, varItm) & _
                    Me.AddrList.Column(1, varItm) & _
                    Me.AddrList.Column(2, varItm)
  Next varItm
  DoCmd.Close
End If

5.モジュールウィンドウを閉じて、フォームを保存して終了します。

以上で、エンターキーでも住所を選択できる様になりました。

______________________________________
 □ 住所一覧選択で「以下に掲載がない場合」を削除する。

 郵便番号を入力して[郵便番号<=>住所]ボタンで住所を設定する場合で、該当住所
 が1つの時(住所一覧が表示されない時)は「町域名」に「以下に掲載がない場合」
 と入っている場合、それを削除していましたが、該当住所が複数ある時(住所一覧
 が表示される時)に選択した住所の「町域名」に「以下に掲載がない場合」と入っ
 ていても、そのまま表示されてしまいます。

 これを、該当住所が1つの時と同様に、「以下に掲載がない場合」を削除します。

1.データベースウィンドウの[フォーム]タブを選択します。

2.住所一覧選択[AddrListForm]を選択し[デザイン]ボタンを押下します。

3.リストボックス[AddrList]を選択し[ダブルクリック時]プロパティの右端の[...]
  ボタンを押下し、モジュールウィンドウを開きます。

4.AddrList_DblClick関数のコードを以下の様に修正します。

Private Sub AddrList_DblClick(Cancel As Integer)
  Dim varItm As Variant
  Dim AddrStr As String

  For Each varItm In Me.AddrList.ItemsSelected
    AddrStr = Me.AddrList.Column(0, varItm) & _
         Me.AddrList.Column(1, varItm)
    If Me.AddrList.Column(2, varItm) <> "以下に掲載がない場合" Then
      AddrStr = AddrStr & Me.AddrList.Column(2, varItm)
    End If

    Forms![AddressForm]![Address] = AddrStr
  Next varItm
  DoCmd.Close
End Sub

5.モジュールウィンドウを閉じます。

6.先程追加したエンターキーの場合([キークリック時]プロパティ)も同様の修正
  を行いましょう。

7.修正が完了したら、フォームを保存して終了します。

※ 「以下に掲載がない場合」の削除に関して、今はプログラムで削除していますが
  後々は、メンテナンス画面を使用し、郵便番号データ自体から「以下に掲載が
  ない場合」を削除しようと考えています。
  その場合、今回のプログラムの修正は必要ありません。
______________________________________
 □ お知らせ

  都合により、ホームページの更新が3月3日(日)以降になります。
  サンプルMDBをダウンロードされる方は、恐れ入りますが、少々お待ち下さい。
______________________________________
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□

◇ ACCESSで作るシリーズ 【住所録ソフト編】
◇ 発 行 元  :Yoshihisa Fukuda(福田 義久)
◇ ご意見・ご要望
  ご質問等   :fukud@nifty.com

◇ このメールマガジンは、インターネットの本屋さん『まぐまぐ』を利用して発行
  しています。(まぐまぐID:0000077071)
◇ バックナンバー:http://homepage2.nifty.com/f-soft/
◇ 登録・解除  :http://homepage2.nifty.com/f-soft/

 Copyright(C) 2001-2002 Yoshihisa Fukuda All rights reserved.

◇転載について
 このメールマガジンの無断転載などは、一切禁止です。
 転載をご希望の方は、事前にメールで連絡をください。
◇免責
 このメールマガジン及びホームページの内容による、いかなる損害、障害などに
 関して発行者は一切の責任を負いません。
 掲載広告についても同様です。
______________________________________
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□