<HOME  <お願い事項  <Access2000 TOP   <Access97 TOP   <サイト内検索
  Ac2002--VBAの沼 > 「更新」と「削除」も、できないとな
  



「更新」と「削除」も、できないとな

「追加」「検索」と来たら、後は「更新」「削除」についてもお話しないといけませんですね。
これも、ホントは、更新クエリや削除クエリといったクエリを使うのが理想なんですけどね・・・。
まあ、今日は練習なので、基本的なところだけ見てってください。
だいぶ慣れてこられたんじゃないかと思うんで、ちゃっちゃっと進めちゃいますよ。

基本は同じです。操作したいテーブルを扱えるように、変数を宣言し、レコードセットを準備して開きます。

「追加」するのと同じで、変数 rs に対するメソッドを変えて書けば、「更新」「削除」といった処理をすることができるわけです。



■レコードの更新

レコードの更新をする場合は、専用のメソッドがあるわけじゃなくて、どう書き換えるか指定した後にUpdateすればOKです。

このプロシージャを実行してみると、[商品テーブル]の中身は、

こうなります。↑
つまり、ループもしてないし、検索もしてないから、レコードセットを開いて一番最初に見つかったレコードを書き換えてるわけですね。
例え1件目を書き換えたかったとしても、ちゃんとMoveFirstって書かないとホントはいけないんだろうけれども、まあ、とりあえずこんな結果になりました。



じゃあ、テーブルの中の全部の商品の値段を、500円増しにしたい場合は、というと、

コードはこんな感じになり、このプロシージャを実行すると、

テーブルの中身はこんな感じ↑。全部の商品の値段が、すこーしずつ値上がりしてますね。
テーブルの中身全件に対して同じ処理を施す場合は、こうしてDo Loopでテーブルの最後のレコードまでループ処理をします。
永久ループにならないよう、MoveNextするのを忘れないようにしてくださいよ。



1件だけ探し当てて、金額の書き換えをするなら、こんな感じでしょうか。

InputBoxを使ってみますね↑
こうすればいいんじゃないかと思います。




■レコードの削除

削除も、同じような感じでやります。
メソッドはDeleteです。ベタですねー。

書き方は単純。こうです↑
多分もう、あまり細かいこと申し上げなくてもOKなんじゃないかと思うんで、InputBoxを使った方法をアレンジしたコードを書いちゃいますね。
ほんとに消えちゃいます。取り消しは効きませんですよ。慎重にテストしてくださいね。

テーブルを開いたままテストをしていると、削除したレコードの残像が残ります。
別にバグってないですよ。一度テーブルを閉じて、もう一度開けば、レコードはきれいさっぱり消えています。

じゃあ、少しだけ応用してみるとしまして・・・。
例えば、こういうフォームがあって、コマンドボタンをクリックしたらこのレコードを削除してしまいたい、なんてときは、

これで、削除できちゃいます↓

で、このプロシージャを、

フォーム内の「コマンドボタンをクリックしたとき」のイベントで呼び出すようにしてやる、ってのはどうでしょう。
わざわざこんなことやるくらいなら最初からPrivateプロシージャとして作ればよかったんですけどね。
まあ、今日のところはこれで勘弁してください。

と、でも、やっぱり、削除した瞬間、こんな表示になります。
削除はされてるんですけど、残像が(残像というわけじゃないんですが)残ります。


これを何とかするためには、Deleteメソッドを実行した後で
  ・再クエリする
  ・フォームを閉じてもう一度開く
  ・次のレコードか前のレコードか、レコード移動する
など、なんかしらアクションを取る必要があります。

といっても別にバグってるわけじゃないので、このまんまでもいいんですけどね。
でも、知らない人が見たらビックリするかもしれませんしね。


例えばこんなふうに、マクロの「レコード移動」アクションを活用して、削除した後次のレコードにすぐ移動しちゃっとくとか。

再クエリする場合は、こう書きます。

Privateプロシージャの場合は、フォーム名をMeと書くことができましたよね。
「商品という名前のフォームを再クエリする」という意味になります。再クエリとは、レコードソースにしているテーブルまたはクエリの状態を最新の状態にして再表示する、というような感じの動作をするんでしたよね。

再クエリの場合は、最新の状態にして再表示するわけなので、削除した後は1レコード目が表示されます。
フォームを一度閉じてもう一度開きなおしたのと同じような状態になるわけですね。

他にもいろいろ考えられる方法はありますが、ケースバイケースで使い分けをしてってくださいね。




こうした、テーブルを扱うプロシージャを作る場合は、「オブジェクト変数」やら「データベースへの接続」やら「メソッド」やら、Visual Basic独自の書き方、考え方を理解しなければなりません。
雰囲気としてはここまでご紹介したとおりですが、これを応用するためには、いろいろなサンプルコードやヘルプの注意書きをしっかり読まなければなりませんですよ。丸写しも結構ですが、やっぱり一行一行意味を知らなければどうにもなりません。

複雑な処理を考えようとすると、もっともっといろいろなことを知らなければなりませんけれども、主軸は

  ・オブジェクト変数の扱い
  ・データベースへの接続方法
  ・レコードセットの開き方
  ・ループ処理
  ・メソッド

この5つについて理解をされていれば(今現在理解をしているかどうかは別にして、理解をしておかないといけないんだなぁということがなんとなく理解できる、程度でOK)、さほど困ることもないと思います。「自分でコードが書ける」「人の書いたコードの意味を理解できる」ようになるまで、あともう一歩ですよ。もう到達したも同然です。
自信を持ってくださいね。
「できない」「難しい」「わからない」と思い込んでると、こんなわけのわかんないもん、なかなか理解できないですよ。