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


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

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

    発 行 : Yoshihisa Fukuda          2002.04.27 Vol.21

■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
--------------------------------------
今回は、郵便番号データ取り込みと更新のプログラム作成の続きです。
______________________________________
 □ 郵便番号データ取込のサブルーチンを作成する。

 前回作成したプログラムで、郵便番号取込の処理は ImportData と言うサブルーチン
 を呼び出しています。

 今回は、その ImportData サブルーチンと、またその中で呼び出している郵便番号
 ワークテーブルを作成するサブルーチン(CreateTmpTable)を作成します。

1.住所録ソフトのデータベース[Address.mdb]を開きます。

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

3.郵便番号データ取り込み・更新フォーム[ZipUpdateForm]を選択し[デザイン]
  ボタンを押下します。

4.モジュールウィンドウを開き、最下行にカーソルを移動して、以下のコードを
  入力します。

Private Function ImportData() As Boolean
On Error GoTo Err_ImportData

  Dim SqlStr As String

  If Dir(Me.FileName1) = "" Then
    MsgBox "取込ファイルが存在しません。"
    ImportData = True
    Exit Function
  End If
  
  Call CreateTmpTable
  
  DoCmd.TransferText acImportDelim, "郵便番号データ インポート定義", _
            "ZipCodeTableTMP", Me.FileName1
  
  SqlStr = "UPDATE ZipCodeTableTMP SET RegistDate = #" & Me.LatestDate & _
       "#, ModifyDate = #" & Me.LatestDate & "#;"
  DoCmd.SetWarnings False
  DoCmd.RunSQL SqlStr
  DoCmd.SetWarnings True
  
  Forms![ZipCodeForm].RecordSource = ""
  
  DoCmd.DeleteObject acTable, "ZipCodeTable"
  DoCmd.Rename "ZipCodeTable", acTable, "ZipCodeTableTMP"
 
  Forms![ZipCodeForm].RecordSource = "ZipCodeTable"

  ImportData = False

Exit_ImportData:
  Exit Function

Err_ImportData:
  DoCmd.DeleteObject acTable, "ZipCodeTableTMP"
  ImportData = True
  MsgBox Err.Description
  Resume Exit_ImportData

End Function

Private Function CreateTmpTable()
  Dim Addr_DB As Database
  Dim tdf As TableDef
  Dim idx As Index
  Dim fld As Field
  Dim Prp As Property
  
  Set Addr_DB = CurrentDb
  Set tdf = Addr_DB.CreateTableDef("ZipCodeTableTMP")
 
  Set fld = tdf.CreateField("ID", dbLong)
  fld.Attributes = DB_AUTOINCRFIELD
  tdf.Fields.Append fld
  tdf.Fields.Refresh
  
  tdf.Fields.Append tdf.CreateField("Code", dbLong)
  tdf.Fields.Append tdf.CreateField("OldZipCode", dbText, 5)
  tdf.Fields.Append tdf.CreateField("ZipCode", dbText, 7)
  tdf.Fields.Append tdf.CreateField("AddrKana1", dbText, 20)
  tdf.Fields.Append tdf.CreateField("AddrKana2", dbText, 40)
  tdf.Fields.Append tdf.CreateField("AddrKana3", dbText, 100)
  tdf.Fields.Append tdf.CreateField("Address1", dbText, 20)
  tdf.Fields.Append tdf.CreateField("Address2", dbText, 40)
  tdf.Fields.Append tdf.CreateField("Address3", dbText, 100)
  tdf.Fields.Append tdf.CreateField("Flg1", dbBoolean)
  tdf.Fields.Append tdf.CreateField("Flg2", dbBoolean)
  tdf.Fields.Append tdf.CreateField("Flg3", dbBoolean)
  tdf.Fields.Append tdf.CreateField("Flg4", dbBoolean)
  tdf.Fields.Append tdf.CreateField("Flg5", dbInteger)
  tdf.Fields.Append tdf.CreateField("Flg6", dbInteger)
  tdf.Fields.Append tdf.CreateField("RegistDate", dbDate)
  tdf.Fields.Append tdf.CreateField("ModifyDate", dbDate)

  Addr_DB.TableDefs.Append tdf
 
  Set idx = tdf.CreateIndex("PrimaryKey")
  idx.Fields.Append idx.CreateField("ID")
  idx.Primary = True
  tdf.Indexes.Append idx

  Set idx = tdf.CreateIndex("ZipCode")
  idx.Fields.Append idx.CreateField("ZipCode")
  tdf.Indexes.Append idx

  Set fld = tdf.Fields("ID")
  Set Prp = fld.CreateProperty("Description", dbText, "ID")
  fld.Properties.Append Prp
  Set Prp = fld.CreateProperty("Caption", dbText, "ID")
  fld.Properties.Append Prp
  
  Set fld = tdf.Fields("Code")
  Set Prp = fld.CreateProperty("Description", dbText, "地方公共団体コード")
  fld.Properties.Append Prp
  Set Prp = fld.CreateProperty("Caption", dbText, "地方公共団体コード")
  fld.Properties.Append Prp
  
  Set fld = tdf.Fields("OldZipCode")
  Set Prp = fld.CreateProperty("Description", dbText, "旧郵便番号")
  fld.Properties.Append Prp
  Set Prp = fld.CreateProperty("Caption", dbText, "旧郵便番号")
  fld.Properties.Append Prp
  
  Set fld = tdf.Fields("ZipCode")
  Set Prp = fld.CreateProperty("Description", dbText, "郵便番号")
  fld.Properties.Append Prp
  Set Prp = fld.CreateProperty("Caption", dbText, "郵便番号")
  fld.Properties.Append Prp
  
  Set fld = tdf.Fields("AddrKana1")
  Set Prp = fld.CreateProperty("Description", dbText, "都道府県名(カナ)")
  fld.Properties.Append Prp
  Set Prp = fld.CreateProperty("Caption", dbText, "都道府県名(カナ)")
  fld.Properties.Append Prp
  
  Set fld = tdf.Fields("AddrKana2")
  Set Prp = fld.CreateProperty("Description", dbText, "市区町村名(カナ)")
  fld.Properties.Append Prp
  Set Prp = fld.CreateProperty("Caption", dbText, "市区町村名(カナ)")
  fld.Properties.Append Prp
  
  Set fld = tdf.Fields("AddrKana3")
  Set Prp = fld.CreateProperty("Description", dbText, "町域名(カナ)")
  fld.Properties.Append Prp
  Set Prp = fld.CreateProperty("Caption", dbText, "町域名(カナ)")
  fld.Properties.Append Prp
  
  Set fld = tdf.Fields("Address1")
  Set Prp = fld.CreateProperty("Description", dbText, "都道府県名")
  fld.Properties.Append Prp
  Set Prp = fld.CreateProperty("Caption", dbText, "都道府県名")
  fld.Properties.Append Prp
  
  Set fld = tdf.Fields("Address2")
  Set Prp = fld.CreateProperty("Description", dbText, "市区町村名")
  fld.Properties.Append Prp
  Set Prp = fld.CreateProperty("Caption", dbText, "市区町村名")
  fld.Properties.Append Prp
  
  Set fld = tdf.Fields("Address3")
  Set Prp = fld.CreateProperty("Description", dbText, "町域名")
  fld.Properties.Append Prp
  Set Prp = fld.CreateProperty("Caption", dbText, "町域名")
  fld.Properties.Append Prp
  
  Set fld = tdf.Fields("RegistDate")
  Set Prp = fld.CreateProperty("Description", dbText, "登録日付")
  fld.Properties.Append Prp
  Set Prp = fld.CreateProperty("Caption", dbText, "登録日付")
  fld.Properties.Append Prp
  
  Set fld = tdf.Fields("ModifyDate")
  Set Prp = fld.CreateProperty("Description", dbText, "更新日付")
  fld.Properties.Append Prp
  Set Prp = fld.CreateProperty("Caption", dbText, "更新日付")
  fld.Properties.Append Prp
  
  Addr_DB.Close
 
  Set tdf = Nothing
  Set Addr_DB = Nothing
End Function
______________________________________
 □ 郵便番号データを取り込んでみる。

 ここで、実際に郵便番号データの取り込みが、上手く出来るか試してみたいと思い
 ますが、実行するためには郵便番号データ更新のサブルーチンも必要になります。

 そこで、郵便番号データ更新のサブルーチンの殻だけ作成しましょう。

 上記のプログラムを記述した最後に

Private Function UpdateData() As Boolean

End Function

 とサブルーチンの殻だけ作成します。
 このサブルーチンの中身は次回作成します。

 では早速、郵便番号データの取り込みをやってみましょう。

 フォームを開いて、取込ファイル名に郵便番号データ(全国ならKEN_ALL.CSV)と
 入力します。

 データ最新日付は、郵政省ホームページから郵便番号データをダウンロードする際、
 そのデータが、いつ時点のものかが書いてあるので、その日付を入力します。
 例えば、4月26日現在だとホームページ上に「平成14年3月1日現在版」とある
 ので、このデータをダウンロードして取り込む場合、データ最新日付は 2002/3/1
 と入力します。

 後は、[取込]ボタンを押下すれば、データが取り込まれます。
______________________________________
 □ フォームの入力が無い場合のチェックを行う。

 このままでも、特に問題は無いのですが、ファイル名やファイル最新日付を入力
 しなかった場合のエラーメッセージを見てみましょう。

 ファイル名を入力しないで[取込]ボタンを押すと「取込ファイルが存在しません。」
 のエラーメッセージが出ます。

 またファイル名を正しく入れて、ファイル最新日付を入力しないで[取込]ボタンを
 押すとインポートが終わった後で「クエリー式'##'の日付の構文エラーです。」
 と言うエラーが表示されます。

 これらのエラーをもっと親切に判りやすくしてみましょう。

1.郵便番号データ取り込み・更新フォーム[ZipUpdateForm]をデザインで開きます。

2.取込・更新ボタン(ExecuteBtn)を選択し[クリック時]プロパティへカーソルを
  移動し、右端の[...]ボタンを押下してモジュールウィンドウを開きます。

3.Private Sub ExecuteBtn_Click() という関数に、前回記述したコードがあると
  思いますが、Private Sub ExecuteBtn_Click()関数の先頭(前回記述したコード
  のSelect文の前)に以下のコードを記述しましょう。

  If IsNull(Me.FileName1) Then
    MsgBox "ファイル名を入力して下さい。"
    Me.FileName1.SetFocus
    Exit Sub
  End If
  If IsNull(Me.LatestDate) Then
    MsgBox "ファイル最新日付を入力して下さい。"
    Me.LatestDate.SetFocus
    Exit Sub
  End If

  以下 Select ・・・ と前回のコードが記述されている。

4.コードが記述できたら、モジュールウィンドウを閉じて、フォームを保存します。

 これで、ファイル名が入力されていない場合「ファイル名を入力して下さい。」と
 言うエラーメッセージが表示されます。
 また、ファイル最新日付が入力されていない場合「ファイル最新日付を入力して
 下さい。」と言うエラーが表示されるようになります。


今回はここまでです。
次回は、データ更新のサブルーチンを作成します。
______________________________________
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□

◇ 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.

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