<HOME  <お願い事項   <Access2002 TOP   <Access97 TOP   <サイト内検索
 MS-Access2000超入門部屋--見積書を作る
   1 > 2 > 3 > 4 > 5 > 6 > 7 > 8 > 9 > 10 > 11 > 12 > 13 > 14 > 15 > 16 



んでは、テーブルを閉じて・・・見積入力のフォームに手を加えましょう。

いつ番号を付けるか・・・イベントのタイミングが悩ましいところですけれど、「フォームの挿入前処理イベント」で動かしましょうか。

こんな感じかな・・・。

では、ちょっとだけ実験・・・。

たとえば日付の入力とか、顧客番号を選んだときとかに、見積番号、自動的につきますか?
明細の方も適当になんか入力して、フォームを一回閉じてください。

で、W テーブルを見てみましょう。

両方とも、見積番号、ちゃんと入ってますよね?[ W_ 見積明細テーブル]の方の見積番号がミソですよ。サブフォームをしっかり作っていれば、ちゃんと見積番号が入ってくるはず。これ空欄のままだと当然エラーになるし、後でどの見積でどういう商品の依頼があったのかつながらなくなっちゃいますからね。

メインフォームとサブフォームがうまいこと結びつくか点でバラバラに動くか、は、「見積番号」が正しく振られていくかどうかにかかってますので、この辺はちょっとずついろいろテストしてみて作りこんでいってくださいね。

では、このふたつのテーブルの中のレコード、削除して空っぽにしておいてください。その方が実験しやすいので・・・。


じゃあ、勢いに乗って、明細入力の方も、行番号を自動的にふってみましょうか。

でも、これは、表形式のフォームなので、ちょっと考え方が難しいんです。リレーショナルデータベースというものは表のイメージでデータを捉えますけど 1 枚の表があるわけじゃないので、「上の行の番号」とか「前のレコードの番号」とか、「前の」とか「後の」っていう見方が難しいのです。っていうか、基本的にできません。

だからこそ迅速な並べ替え/ 検索ができるんですけどね。1 枚岩じゃなくて、レコードが個々に独立して活動できるような状態にあるから。まあー・・・この部分だけ取りあえげ「 Access ってつかえなーい」って言う人もいますけどね。しかもあたしに。あたしに言ったってしょうがないじゃないですかねえ。ほんとにもう。いろんな人がいますよ。

今回は、W テーブルは、1 件見積作成するごとに削除して、常に常に 1 件分の見積情報が入力されてる状態にしようと思ってます。なので、 W 見積明細テーブルの中の「いちばん大きな行番号」というのをうまいこと拾って、それに 1 足せば、「次の行番号」になるはずですよね。ちょっと遠まわしなやり方みたいな感じですけど・・・多分、いちばん簡単な方法だと思いますよ。

では、ちょっと書いてみましょう。
サブフォームの方の、フォームセレクタをダブルクリックして、出てきたプロパティの「挿入前処理イベントプロパティ」にイベントを作ります。

基本はこんな感じでしょうか。

これもおなじで、明細テーブルの方にレコードが 1 件もない場合、「からっぽ」に1を足しても「からっぽ」のままになっちゃうので、 1 件もないときと1 件でもあるときとで処理を分けます。

こんな感じかな。


じゃ、テストを・・・まず、顧客番号とか担当営業を選んでから、商品番号を選びましょう。

あ、これはご承知だと思いますけど、メインのフォームの方何も入力しないうちにサブフォームの方触ろうとしちゃいけませんよ。いけませんよってことはないけど、メインフォームの内容あってのサブフォームですもんね。

行番号は入力せず、商品番号を選んでみてください。

1 行目に1、 2 行目に2・・・と、出ますか???とりあえずまだテストなので、そっとそっとテストしてくださいね。

いちおう、こんな感じで、「行番号」をつけていくことはできないことはないんですけどね。
もう・・・お気づきだとは思いますが、この「行番号」はあくまでも「W 見積明細テーブル」内のフィールドのひとつです。
しかも主キーとして使ってます。本来の意味合いはテーブルの中の「代表選手」として活躍するフィールドです。厳密には「フォーム上の通し番号」ではありません。その辺は皆さん、理解なさってますよね。表形式のフォームで「フォーム上の通し行番号」みたいなものを表示する機能や考え方は、データベースにはありません。

順番に入力していけば、入力した明細に対して1,2,3 … と通し番号が付くのであって、「3 行目に表示されてるから行番号が3」という意味ではありません。
「ありー間違えて余計なのを入力しちゃったよ」なんて場合、明細フォームの方の各レコードの左端(レコードセレクタ)を使って簡単に 1 行削除することができるんですけどね。

でも、3 行あったものが2 行になっても、行番号は 1  3… と、ひとつ飛びになります。表示上の通し番号ではなく、あくまでも「その明細レコードに対してふられた番号」としてテーブルに収められる値ですので、その辺を十分に理解してくださいね。

どうしても表示上の行番号をふりたい、という方もいらっしゃるにはいらっしゃるんですけど、入力 / 変更も行わなくちゃいけないこういったフォーム上では、多分無理です。