<HOME  <お願い事項   <Access2002 TOP   <Access2000 TOP   <サイト内検索
 Access97データベース工作室>在庫のザの字はどう書くの〜♪
  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20



さて、では、この「出庫フォーム」を、いろいろ工夫して作り込んでいきましょうか。
いろいろやってみますんで、これはいらんな・・・と思う部分は飛ばして先に進んでみてください。

まず、フォーム全体のプロパティで、

 書式:スクロールバーやレコード移動ボタンなど、不要と思うものを非表示にする。

 その他:Tabキー移動を「カレントレコード」にしておいた方が何かとよいでしょう。

フォーム全体の色や大きさ、テキストボックスの配置などは自由に変更してください。

メニューバー[表示]→[タブオーダー]で、カーソルの移動順序をテキストボックスの並びに合わせておく。

[受付日]のテキストボックスのプロパティ

 データ:「既定値」に=Date( )と入力しておくと、とりあえず今日の日付が入る。

 必要に応じて書き換えればよいでしょう。


この辺の変更操作は、みなさんもうオッケーだと思います。
他にも気づいたところなどあれば、随時変更していってください。

さて、では、さらに掘り下げて、注文番号を自動で採番しましょうか。

こんなの、なんか適当に番号つけてくれた方が手間がかかんないですよね。
主キーにもなってるし、入力しないわけにはいかないしー・・・。

こういうのは、「Access97超入門部屋」の「自動採番?」のところで同じような操作のお話をしていますんで。
そちらも合わせてご覧いただけるとばっちしだと思います。

自動で番号・・・っていっても、いろいろやりかたあるんですよ。
でも、最近のAccessは、クラスモジュールっていうのが便利になって、結構気軽にVBAの記述ができるようになってきたんで、ぜひぜひ、こんな感じで書き込んでてみてください。

イベントのタイミングは・・・そうですねぇ。お勧めはとりあえずフォームのイベントプロパティの「挿入前処理」ですかね。

Private Sub Form_BeforeInsert(Cancel As Integer)

If DCount("注文番号", "出庫テーブル") = 0 Then

Me![注文番号] = "S0001"

Else

Me![注文番号] = "S" & Format(DCount("注文番号", "出庫テーブル") + 1, "0000")

End If

End Sub

ロジックとしては、出庫テーブルのレコード件数+1。これを基準にしようと思います。
で、出庫伝票なんで、アタマにSをつけて、ゼロを含めて4桁表示にしようかと・・・。
すでに5件分のレコードの入力が出庫テーブルにある場合だと、S 5+1(左にゼロをつけて4桁にする)っていうことで、S0006になる、というわけです。

それが緑色の部分の処理↑。で、[注文番号]テキストボックスに代入します。
すると、[注文番号]テキストボックスが基にしているのは、[出庫テーブル]の[注文番号]フィールドですから、結果的にテーブルに新しい注文番号がつく、ということになるわけです。

赤い部分は、「もし出庫テーブルにデータが一件もなかった場合」の例外処理です。
一番最初だけですけども、こうやって書いておいて損はないでしょう。



と、ちょっと実験・・・・。
とりあえずフォームビューにひっくり返して、顧客コードにでもなんか適当に入力してみてください。
なんでもいいです。

と、新しいレコードが挿入される直前に例のプロシージャが実行されて新しい番号が作られ、注文番号のテキストボックスに代入されるわけです。

ここまできたら、[注文番号]のテキストボックスの中には、カーソルが入らない状態にして、書き換えとかいっさいできなくした方がいいかもしれないですよね。

[注文番号]のデータプロパティ

編集ロック:はい
使用可能:いいえ



これでばっちりかな。何件か入力テストしてみてください。
次のレコードの入力をするには、キーボードのPageUPキーを使うと手っ取り早いと思います。


そして、フォームを開いたとき、常に新規レコード入力状態になるようにしてみましょうか。

フツウは、フォーム開くと、もとにしているテーブルかクエリーの一件目のレコード表示してる状態ですもんね。

Private Sub Form_Open(Cancel As Integer)

DoCmd.GoToRecord , , acNewRec

DoCmd.GoToControl "顧客コード"


End Sub

マクロで作ってもいいんですけどね。とりあえずコードでご紹介します。
フォームを開くとき、新規レコードに移動して、[顧客コード]のテキストボックスにカーソルを移動させておこうというわけです。


じゃ、乗ってきたところで、顧客コードを直接入力するんじゃなくて、一覧から選ぶようにしてみましょうか。
コンボボックス使って・・・。これはもうみなさんお手の物かな・・。一応段取りかきますんで、挑戦してみてください。

1)[顧客コード]のテキストボックスを右クリックし、コントロールの種類の変更→コンボボックスを選ぶ。

2)コンボボックスのデータプロパティを見て、値集合ソース欄[顧客テーブル]を選ぶ。

3)コンボボックスの書式プロパティを見て、列数を2、列幅を2;3、リスト幅を5にする。

4)あとはてきとうに。

コンボに顧客コードと顧客名、出ます?
[顧客マスター]の左から1番目と2番目のフィールドの中身を出してるんですよね。列数2だからね〜。

で、どれか顧客を選ぶと、注文番号がそのタイミングでちゃんとつくし、これは入力するより楽ですよねぇ。

ん?顧客コードだけじゃなくて、顧客名をどっかに表示したい?
えーいいじゃないですかー。
コンボ開いてみればわかるんだしー・・・。

分かりましたよ。やりましょう。表示させるだけでいいんですか?だったらですねぇ。
コンボボックスの2列目に顧客名が表示されてるわけですから、これをとってきましょう。

じゃ、まず、顧客コードのコンボの右側に、適当な大きさのテキストボックスを作ります。
フラットにしちゃって透明にしちゃうのも、ちょっとおしゃれかもしれないですねぇ。
わたしは名前を[顧客名]ってつけてみました。別に[テキストxx]のままでもオッケーですけどね。

で、顧客コードのコンボボックスの更新後処理イベントに、下のようなコードを書いてみましょう。

Private Sub 顧客コード_AfterUpdate()

Me![顧客名] = Me![顧客コード].Column(1)

DoCmd.GoToControl "担当者"

End Sub

こういうのはみなさん何度かトライしてらっしゃいますよね。
コンボの中のデータは、Column(列数)というプロパティで取り出すことができるので、これが結構重宝します。

2行目のDoCmd.GoToControl "担当者"は、いちおう、気配りというか・・・。
次の場所にカーソルを移動しておこうかな、ということで付け足してみました。

フォームビューに切り替えて実験してみてください。顧客名、入りますか?


でも、この[顧客名]のテキストボックス、非連結なんですよね。

PageDownキーを押して、前のレコードを表示させてみても、顧客名は変わらないと思います。
つまり、このレコードの[顧客コード]とぜんぜんまったくすこしも連動してないんですよね。
だから非連結。中に値をぶち込むだけで、レコードソースと何の関連も持たないコントロールという意味です。

フォームとテーブルの役割の違いは、みなさんもうオッケーですよね。
では、一瞬え???となっても、あ、なるほどね。と、いう結論に達しますよね。こういう現象に遭遇しても・・・。

ここで、

「別の出庫伝票を表示しても、顧客名がAB社のままだ!おかしい!」

と思っちゃう方、もう一度テーブルとフォームの関係についてじっくりおさらいしてみてください。
おかしくないのです。これがふつう。
連動して顧客名も変わるようにするためには、もう一工夫しないとなりません。
ここんとこの理解がいまいちだと、先々ちょっぴりキツい・・・ですよ。

ここまで乗りかかったら、こういうとこも徹底的に・・・。
Dlookup関数を使って、レコードが移動したらその都度[顧客名]引っ張ってくるような処理を書いておきましょう。
とりあえずこれで、現状はなんとか体裁が整うと思います。

で、このフォームのプロパティの「レコード移動時」のイベントに、こんな構文を書きます。

Private Sub Form_Current()

Me![顧客名] = DLookup("顧客名", "顧客マスター", "[顧客コード]='" & Me![顧客コード] & "'")

End Sub

うはは。例によってややっこしい構文が出てきましたねぇ。

"[顧客コード]='" & Me![顧客コード] & "'"


顧客マスターのレコード件数が50000件とか100000件とか、めちゃくちゃあると、DLookupでいちいち顧客名を拾うのはすこーし時間がかかるかもしれないです。
結果的に次のレコード、前のレコードを表示するのにもたついてるみたいに見えるんですよね。
この場合だと。100件や200件では特に問題ないと思うんですけど、こればっかりはPCによっても違うし、やってみないとわかんないってところもありますんで、とにかくここまで試してみてください。

で、もし、仮に、顧客件数がめっちゃくちゃ多くて、作ってみたらやたらレコード移動に時間がかかるって場合は、別の手段を考えましょう。
段取りだけざっと書いてみますね。
興味がおありでしたら、試してみてください。

[顧客マスター]と[出庫テーブル]をふたつつなげるようなクエリーを作りましょう。
で、出庫テーブルの全フィールドと、顧客マスターからは[顧客名]だけを選びます。

[顧客コード]が主キーになっていて、フィールド名を揃えていれば、結合線が自動的に出てくると思います。

で、このクエリーになんか適当な名前をつけて保存し、このクエリーを出庫伝票入力のさっきのフォームのレコードソースにするわけです。



忘れちゃいけないのが、非連結のままの[顧客名]のテキストボックスのコントロールソース。
これをちゃんとクエリーの[顧客名]に変えてやればいいですよね。

で、苦労して書き込んだDlookup関数ですけど、これをやめます。
レコード移動時と、コンボボックスの更新後処理のイベントプロシージャを削除して、完成です。

でも、結果は同じ。これなら常に[顧客マスター]と結びついてますから、スピード自体は早く感じるんじゃないかなーと思います。
Dlookupでもクエリーで結合した状態で使っても、どっちでも結果は同じ。要はケースバイケース。
両方の方法を知っていれば、使い分けできそうですよね。