Visual Basic 6.0 データベース講座
VB6対応

 

Visual Basic 中学校 > VB6 データベース講座 >

第4回 レコードの編集

 

今回はレコードを表示するだけでなく、新規登録・修正・削除といった編集ができるプログラムを作成します。

なお、この講座は連載ですので前回までの分を読んでいない場合には先に読まれることをお勧めします。

前回の宿題の解説はこちらです。

 

1.たたき台

 

今回は次のプログラムをもとに話を進めていきます。とりあえず、新規プロジェクトを作成したらこのとおりのプログラムを作ってください。 プログラムを作る際には必ずADOに参照設定をしてください。参照設定のやりかたは前回(第3回の 2.データベースアプリケーションの流れ)で解説しています。簡単に言うと、[プロジェクト]メニューの[参照設定]からMicrosoft ActiveX Data Objects 2.7 Libraryを選ぶのでした。このとき、2.7 の部分はバージョンなので少しくらいバージョンが違っても平気という説明もしましたね。

名前 種類 プロパティ プロパティの値
txtID TextBox Text  (空にして下さい)
txtName TextBox Text  (空にして下さい)
txtGuide TextBox Text  (空にして下さい)
    MultiLine True
cmdFirst CommandButton Caption  |<
cmdPrevious CommandButton Caption  <
cmdNext CommandButton Caption  >
cmdLast CommandButton Caption  >|

 

Option Explicit

Dim Con As New ADODB.Connection
Dim Rs As ADODB.Recordset

Private Sub ShowData()

    '■C レコードの表示
    txtID.Text = Rs("動物ID")
    txtName.Text = Rs("名前")
    txtGuide.Text = Rs("説明")

End Sub
 

Private Sub cmdPrevious_Click()

    '■F カーソルを前のレコードに移動
    Rs.MovePrevious                 'カーソルを前のレコードに移動
    If Rs.BOF Then Rs.MoveLast 'BOFの場合は最後に飛ぶ
    Call ShowData

End Sub


Private Sub cmdFirst_Click()

    '■G カーソルを先頭に移動
    Rs.MoveFirst
    Call ShowData

End Sub

Private Sub cmdLast_Click()

    '■H カーソルを最後に移動
    Rs.MoveLast
    Call ShowData

End Sub

Private Sub cmdNext_Click()

    '■E カーソルを次のレコードに移動
    Rs.MoveNext                      'カーソルを次のレコードに移動
    If Rs.EOF Then Rs.MoveFirst 'EOFの場合は先頭に戻る
    Call ShowData

End Sub

Private Sub Form_Load()

    Dim MDBFileName As String

    '■A データベースに接続
    MDBFileName = "C:\Database\Animals.mdb"
    Con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=" & MDBFileName
    Con.Open

    '■B レコードセットの取得
    Set Rs = New ADODB.Recordset
    Rs.Open "T1_動物マスタ", Con, adOpenDynamic, adLockOptimistic

    Rs.MoveFirst 'カーソルを先頭に移動
    Call ShowData

End Sub

Private Sub Form_Unload(Cancel As Integer)

     '■D データベースから切断
    Rs.Close
    Con.Close

    Set Rs = Nothing
    Set Con = Nothing

End Sub
 

できたら念のために実行してみてください。レコードを表示して、前、次、最後、先頭に移動できることを確認してください。

 

2.レコードの修正

 

この状態でもテキストボックスに表示されている文字を編集することはできます。たとえば、アイアイと表示されているところを「キツネザル」と書き換えることはできます。しかし、いったんプログラムを終了させたり、レコードを移動させたり(カーソルを移動させることをレコードを移動させるともいいます)して、また表示すると「アイアイ」のまま何も変わりません。

これは、見かけのテキストを編集するだけではレコードセットの内容を編集したことにならないからです。第1回・第2回で出てきた、ADODCを使った場合には基本的な処理はADODCがやってくれるのでテキストを編集しただけでレコードセットの内容が変わることもありましたが今回のプログラムはデータベースの接続から切断まですべて自分でやっているので自動的にレコードセットの内容が変わるなどという不可解なことは起こりません。

では、どうすればレコードセットの内容を修正できるのでしょうか。

何も難しいことはありません。Updateメソッドを使うだけです。それよりも問題はどこでUpdateメソッドを使うかということです。ユーザーがテキストボックスに何か入力したらすぐにUpdateメソッドを使って変更をレコードセットに反映するのがよいでしょうか?いいえ、これはかなり問題があります。やはり、入力した内容を確定するというユーザーの指示があってはじめてレコードセットの内容を変更するというのがよいでしょう。そうじゃないとキャンセルできなくなりますし、1文字入力するごとにレコードセットを更新していては無駄が多すぎます。

それでは、入力した内容を確定する「ユーザーの指示」とはどんなものでしょうか。まず、思いつくのは何かボタンを作ってユーザーがそのボタンをクリックするとレコードが更新されるとする方法です。もう一つはユーザーがレコードを移動したタイミング(つまり、次へ移動するボタンなどを押したとき)でレコードを更新されるとする方法です。

今回は最初ということもあるのでより簡単な最初の方法ととることにします。ユーザーが「修正」ボタンをクリックすると入力した内容でレコードが更新されるようにしましょう。

では、早速フォームにボタンを1つ追加してください。名前は cmdUpdate としましょう。

そして、次のようにプログラムします。

Private Sub cmdUpdate_Click()

    '■I 更新処理
    Rs("名前").Value = txtName.Text
    Rs("説明").Value = txtGuide.Text
    Rs.Update

End Sub

どうでしょうか。なかなか簡単だと思うのですが。

まず、各列に現在の値を代入してからUpdateメソッドを呼び出すのがポイントです。繰り返しになりますが、テキストボックスは直接レコードセットに連結しているわけではないのでこの例のように自分で各列に入力された値を代入する必要があるのです。

 

3.レコードの新規登録

 

次に新しくレコードを登録してみましょう。

こちらもプログラムはさほどむずかしくないのですが、どのような形で新規登録できるようにするのか少し考える必要があります。今回はちょっと楽をしてボタンを3つ作ることにします。1つ目は新規登録モードに移行するボタンです。このボタンをクリックすると画面のデータはいったんすべてクリアされて新規登録モードに移行することにします。もう1つのボタンは確定ボタンです。このボタンをクリックしたときにはじめて新規登録が実行されることになります。つまりこのボタンをクリックするまではいつでも新規登録をキャンセルできるというわけですね。3つ目のボタンはこのキャンセルに使用します。

とりあえず、今出てきた3つのボタンを次のようにして作成してください。

名前 種類 プロパティ プロパティの値 機能
cmdAddNew CommandButton Caption 新規 新規登録モードに移行
cmdComit CommandButton Caption 確定 新規登録を実行
cmdCancel CommandButton Caption キャンセル 新規登録をキャンセル

そして、つぎのようにプログラムします。

Private Sub cmdAddNew_Click()

    '■J 新規登録モードに移行
    txtID.Text = ""
    txtName.Text = ""
    txtGuide.Text = ""

    Rs.AddNew

End Sub

Private Sub cmdComit_Click()

    '■K 新規登録を実行
    Rs("動物ID").Value = txtID.Text
    Rs("名前").Value = txtName.Text
    Rs("説明").Value = txtGuide.Text
    Rs.Update

End Sub

Private Sub cmdCancel_Click()

    '■L 新規登録をキャンセル
    Rs.CancelUpdate
    Call ShowData

End Sub

これで一応新規登録できるのですがかなりやばいです。たとえば、プログラムを実行させた直後に確定ボタン(cmdComit)をクリックするとエラーになります。これは新規登録モードじゃないのにUpdateメソッドを使用したからです。では、どうすればいいのかというのは次回以降で説明するとして今回はあまり危ないことをしないでこのプログラムを実行してみることにしましょう。

プログラムを開始させたら新規ボタン(cmdAddNew)をクリックしてください。画面の表示がクリアされますね?これが新規登録モードです。そうしたら新しく登録するデータを入力してください。テストなので適当なデータでいいのですが1つだけ注意していただきたいのが動物IDです。このIDは各動物が一つずつ独自に持っているもので別の動物に同じIDをわりあててはいけません。もし、他の動物にすでにわりあてているIDで登録しようとしたらたちまちエラーになります。このような設定はmdbファイルを作るときに私がしたものです。

とりあえず、IDには他と重複しないような適当な値を入れて置いてください。200番台以降は安全かと思われます。他の項目にも一応何か入れて置いてください。すべていれおわったら確定ボタン(cmdComit)をクリックします。確定ボタンをクリックしてもプログラムを見ればわかるのですが画面は何も変わりません。それでわかりにくいのですがちゃんと通常モードに戻っています。ためしにレコードを移動させてみてください。そして、あなたが今追加したレコードを探しましょう。きっとどこかにあるはずです。

それから、キャンセルボタン(cmdCancel)のほうは新規登録モードでキャンセルボタンをクリックするだけですぐに通常モードに変わります。こちらはShowDataプロシージャをCallしているので表示も更新されて若干わかりやすいですね。

肝心の内容の説明もしなくてはならないのですが、ここまで実際に試された方ならすぐわかるのでしょう。新規レコードの登録をするにははじめに AddNewメソッド を呼び出し、最後に Updateメソッドを呼び出せばいいのです。ほとんど修正の場合とおなじですね。

ここで新規登録の説明が終わってはすこしいじわるなので最後に追加します。前に書いたようにこの新規登録のプログラムは「やばい」ので少しでも操作を間違えるとすぐにエラーになります。ただエラーになるだけならよいのですがタイミングによっては変なデータが作成されてしまってそのデータを表示させようとするたびにエラーになったりしてしまいます。変なデータというのは空のデータのことです。フィールドの値が空の場合、値はNull(ヌル)というように表現するのですが、今回のようなプログラムではこのNullを表示させようとするとエラーになります。

それで、こうなってしまった場合にはどうしたらいいかというと、一番簡単なのはもういちど連載の第1回に戻って動物データベースをダウンロードしてくることなのですが、それはちょっと面倒くさいという人のためにプログラムでこの現象を修復する方法をここに示します。作成中のプログラムに修復ボタン「cmdRepair」を追加して次のようにプログラムしてください。

Private Sub cmdRepair_Click()

    Rs.MoveFirst

    Do Until Rs.EOF

        If IsNull(Rs("名前").Value) Then
            Rs.Delete
        ElseIf IsNull(Rs("説明").Value) Then
            Rs.Delete
        End If

        Rs.MoveNext

    Loop

    Rs.MoveFirst
    Call ShowData
    MsgBox "データベースの修復は完了しました。", , "修復"

End Sub
 

このプログラムが何をやっているかというと、値がNullのフィールドを持っているレコードを探して見つけたら削除しているだけです。詳しいことは今は解説しません。

 

4.レコードの削除

 

最後は削除です。削除は実に簡単で、削除したいレコードにカーソルを合わせてDeleteメソッドを使うだけです。カーソルを合わせるとはMoveNextやMovePreviousなどを使って削除するレコードに移動するということで、これはもう前回からあたりまえのようにやっているのでなんてことはないでしょう。要は削除したいレコードに移動してからDeleteメソッドを使うということです。

早速削除ボタン cmdDelete を作成して次のようにプログラムしてください。

Private Sub cmdDelete_Click()

    '■M レコードを削除します
    Rs.Delete
    cmdNext.Value = True 'cmdNextをクリックしたのと同じ意味

End Sub

削除するとカーソルが指していたレコードがなくなるのでcmdNextをクリックしてカーソルが通常のレコードを指すようにします。cmdNextをプログラムからクリックするにはこの例のように cmdNext.Value = True とします。これはデータベース以外の場面でも使うかもしれませんね。この他にも Call cmdNext_Click としても同様のことができます。

このプログラムは最後の1件を削除したり、新規登録モードで削除ボタンをクリックしない限りエラーにはならないでしょうがやはり「やばい」です。通常、データを削除するときはユーザーに確認するのが基本です。このプログラムは削除ボタンをクリックすると有無を言わさず現在表示しているレコードを削除してしまいます。それもテストデータだからまだいいのですが重要なデータベースだったら悲惨です。ちゃんとしたプログラムを完成させる折はぜひこういったところにも配慮したいですね。

 

5.まとめ

 

以上で今回は終わりです。複雑になってきたので少しばかりまとめておきます。

1.レコードの移動にはMoveNext, MovePrevious, MoveFirst, MoveLastなどのメソッドを使う。

2.レコードを移動しただけで自動的に表示が変わったりはしない。

3.フィールドの値を参照するには rs("名前") のようにする。

例:MsgBox rs("名前")

4.レコードを修正するには、フィールドに新しい値を代入した後で Updateメソッドを使う。

5.レコードを新規登録するには、AddNewメソッドを呼び出し、フィールドに新しい値を代入した後で Updateメソッドを使う。

6.レコードを削除するには Deleteメソッドを使う。

7.レコードに対する操作(AddNew, Update, Deleteなど)は現在カーソルのあるレコードに対してなされる。

現在カーソルのあるレコードとはわかりやすくいうと「現在のレコード」のこと。つまり、カーソルを移動するにはMoveNext, MovePreviousなどをつかう。このため、カーソルを移動することを単に「レコードを移動する」と表現することも多い。

 

6.宿題

 

今回も宿題を出します。今回のプログラムは文中時々指摘したようにすぐエラーになったりする「やばい」プログラムです。このプログラムをやばくない、つまりちょっとやそっとじゃエラーにならないプログラムに作り変えて下さい。

手段は問いません。どんなテクニックを使っても結構です。

 

7.最後に

 

このVisual Basic中学校はそれほと訪問者が多くなのでデータベース講座を第1回から読み進めてくれている読者が1人でもいるのかどうか自信がないのですが万が一そういう方がいらっしゃいましたらぜひメールか掲示板で感想などお聞かせください。

それでは、失礼します。