<HOME  <お願い事項   <Access2002 TOP   <Access2000 TOP   <サイト内検索
 Access97データベース工作室>食いだおれデータベース
  Page1Page2Page3Page4Page5 Page6 Page7Page8Page9Page10Page11Page12Page13



<食いだおれデータベース作戦 6>

同じように、もうひとつのコマンドボタンのクリック時のイベントも作りましょう。

次のレコードはNext。こっちはおなじみですね。じゃ、このウィンドウは閉じましょう。


さて、そうしたら、ちょっと試してみましょうか。いちおうフォームを保存して、フォームビューに切り替えましょう。

さてー・・・思うように動きますかね。次ボタン前ボタン、クリックして、前後のレコードが表示されるかどうか確認してみてください。

あ、あれ???じっこうじえらー??2105???

な、なんで???

こういうエラーメッセージが出てきたら、必ず「何をしたとき出るか」を明確にしましょう。
メッセージそのものだけでは、なかなか原因究明につながらないもんです。

このメッセージはおそらく、「最後のレコードが表示されてる状態で、
さらに次ボタンをクリックしたから」出たんじゃないですかね。



エラーというより、「もう次のレコードがないので、命令には従えません」といってるみたいです。

でも、最後のレコードが表示されてる状態で、さらに次ボタンをクリックしちゃうことだってありそうですよねぇ。

うーん・・・。じゃあ、こうしましょう。多分、この次ボタンをクリックしたときに出るエラーなんて、これだけじゃないかなーと思うんです。他に複雑なことやってるわけでもないし。
だから、エラーが出たら、エラーを出した命令文は無視しろ、みたいな感じの命令を追加しようと思うんです。

わたしがよく使うのはこういう方法。OnErrorっていう方法です。エラーが出たら、次に進め、みたいな意味になります。

on error resume next

と入力してみてください。あ、もちろん次ボタン前ボタンも両方。


今度はどうでしょう。エラーは無視されると思うんですけど・・・。

オッケーだったら、[新規]ボタンと、「全レコード件数」を表示するテキストボックスを作りましょう。

テキストボックスは、ラベルはイラナイでしょう。黄色い印のついている方だけクリックして、deleteキーを押して削除しちゃいましょう。

で、[新規]ボタンのクリック時のイベントを作りましょう。これで揃い踏みですね。

で、後は、全レコード件数を表示するテキストボックス。これは手っ取り早くCount関数を使いましょう。
=Count(*)

これを、そのテキストボックスのコントロールソース欄に入力することで、フォームの表示対象になっているレコードの件数がわかります。

テキストボックスだけじゃ、何の数字なのかわからないので、後ろにラベルを作って、"件入力済み"とか書いておけば、わかりやすいと思いますよ。


さてさて、どうでしょう。
まだまだみなさんの理想のフォームとは程遠いかもしれませんけれど、ひとつひとつ作り込んでいく過程を体感していただければ、
とりあえずこのページの目標は達成できたかなーと思います。

細かいことは、大概フォームやテキストボックスのプロパティ欄を見ればなんとかなります。
今までにもいろいろなプロパティ使ってきましたよね。他にもいっぱいあるんですよ。

「○○したら××になるようにしたい」といった具合に、動作が絡む場合は、「クリック時」とか「更新後処理」とか、イベント欄を使って処理を作ります。
こちらは、コードの書き方や、マクロでどんなことができるのか、もう少し探求していく必要がありますが、大体イメージは湧いたんじゃないでしょうか。


ん??
「サブフォームの[番号]も、どうせ行番号なんだから自動的に採番したい」??

・・・・・なるほど。
んー、どうやってやるのかな。さっきのDMax関数を使うとすると・・・。

基にしているテーブルを見比べてみましょう。サブフォームの方が基にしているのは、下の方のテーブルですね。
もし、下の[食いだおれ明細テーブル]の[番号]が通し番号でよいなら、今さっき作った方法でいいんじゃないですかね。
[食いだおれ明細入力](サブフォームにしてる方のフォーム)のデザイン画面で、「挿入前処理」にDMax関数を書き込んで・・・。

でも、[ナンバー]ごとに1,2,3と付けるとなると、ちょっと条件違いますよね。まずそれをクリアしないと。

それと、これは常にあらゆる処理で言えることだと思うんですが、「一番最初のレコードだった場合」。これも考えないといけないですね。
最大の値に1を足してるわけですけど、最初のレコードということは、テーブルの中身は空っぽで、最大の値が存在しないわけです。
存在しないということは、ゼロとは違うわけで、足し算成立しないんですよ。それは当然ですよね。

その辺も踏まえて、作ってみました。


まず、普段は単体で使用することのないサブフォームの方を、
デザインビューで開きます。

フォームのプロパティを出して、挿入前の処理を作りましょう。

さて、ここで、VBAの構文の定番、If 〜then 〜elseというのを使います。今日はVBAそのものの解説じゃないので、とにかく下のように書き込んでみてください。

青い色を付けた行は、これで1行。途中で改行しません。

Private Sub Form_BeforeInsert(Cancel As Integer)
If DCount("番号", "食いだおれ明細テーブル", "[ナンバー]='" & Forms![食いだおれ入力]![ナンバー] & "'") = 0 Then
Me![番号] = 1
Else
Me![番号] = DMax("番号", "食いだおれ明細テーブル", "[ナンバー]='" & Forms![食いだおれ入力]![ナンバー] & "'") + 1
End If
End Sub

意味は、「[食いだおれ明細テーブル]の中から、[ナンバー]が、今表示している[食いだおれ入力]フォームの[ナンバー]という値と同じレコードを数えてみて、ゼロ件だったら初めての入力だから[番号]には1を代入する、でも1件でもあれば、一番大きい番号に1を足して、それを[番号]に代入」という意味の文です。
記号がいっぱい並んでいて、なんだか複雑ですね。でも、これもちゃんと法則があって、それにのっとって入力してる式なんです。徐々に身につけていかれてください。

ずいぶんと横に長い式になりましたね。

で、こうなると、[番号]は直接入力しないですよね。
でも、もともと数値フィールドなんで、新規入力行に"0"って表示されません?フォームビューに切り替えて確かめてみてください。

一番下、ゼロって出ますよねぇ。これはこれで出てないとおかしいんですけど、何とか表示しないようにできないものかな・・・という場合は、書式の設定でごまかしましょう。
このフィールドにゼロってのはありえないですよね。

数値方のフィールドを基にしているテキストボックスで、数値は数値で扱いたいけれど、
新規入力行や他の行にゼロと表示されるのはちょっとカッコ悪いなぁ、という場合。

書式プロパティに

#;-#;" "

数値フィールドはふつう、何も入力してないところにはゼロをデフォルトで出します。数値ですからね。
テキスト型フィールドとは扱いがちょっと違うわけです。他にも方法はありますが、書式でゼロだけ非表示にしてしまうっていう手が一番じゃないかと思いますよ。

この書式の作り方、Excelも同じなんでご存知の方も多いと思いますが、

正の数の書式;負の数の書式;ゼロの書式

と、セミコロンで区切って設定できるんです。フツウは正の数の部分だけしか設定しなくて、後は省略してるんですけどね。

[値段]のところも、こういう書式を作っておくといいかもしれないですね。


さて、だいたいできあがりましたけど、改めて何件かデータ入力してみてください。

これくらいまで来ると、実務に耐えられるんじゃないかと思うんですけど、いかがでしょう。
これが見積入力だったり、注文書入力だったり・・・。
作業には流れがあって、いろいろなオブジェクトやその中のプロパティを組み合わせて、ひとつの仕組みを作っていくのだというところ、その辺を押さえることができればいいんじゃないかと思います。