<HOME  <お願い事項   <Access2002 TOP   <Access2000 TOP   <サイト内検索
 MS-Access97大魔法陳列棚>カンタンな在庫管理システム



【仕 様 な ど】MS-Access97で作成。Windows95でのみ動作確認。

【ダウンロード】←Zip形式
            (解凍後のmdbファイル:およそ350KB)

【主 な 機 能】



【も ろ も ろ】

平凡な「在庫管理データベース」のちっさいやつです。

「表形式フォーム」を使わずに、複数行伝票の入力画面を作れないかな・・・と思い、挑戦してみました。
単票フォームに縦5行、横に6個分のコントロールを配置し、あたかも5行の入力行があるかのように見せています。
この単票フォームを、注文表フォームに埋め込んでサブフォームとしています。
このサブフォームの方は、テーブルとは連動していません。
VBAで配列もどきのやり方で、発注処理時にひとつずつテーブルにかき出しています。
また、商品コード欄はコンボボックスにし、在庫マスターと連動させています。
商品名と単価を、このコンボボックスの中から取り出して、それぞれのテキストボックスに代入させる処理を、コンボボックスのイベントプロパティ「更新後の処理」で動かしています。これを5つのコンボボックスそれぞれに付けています。

発注処理後、在庫マスター内の在庫数が引き算されて、常に最新の残数が参照できるようにしています。

注文表フォーム

(スクリーンコピー失敗した・・・もっときれいな色がついたフォームです・・)

このようなシステムを作るとき、よく用いられる手法なのかもしれないですが、複数の人間が同時にエントリーした際のトラブルを最小限に防ぐために、ユーザーが使用するワークテーブルと、実際にデータが蓄積されるサーバーテーブルを分けて使っています。このフォームが使うワークテーブルには、常に今開いているレコードだけがたまり、発注処理をするとサーバーのテーブルにデータが移って、このテーブルの中身は削除されます。こんな処理も動いているので、ちょっと遅いです。

これが正しいやり方かどうかわかりませんが、ひとつの方法として参考にしていただければと思います。

伝票番号を自動採番するしくみを2つ作ってみました。イメージは同じなんですが、ひとつはクエリーとマクロを使って、もうひとつは関数を作ってみました。どちらもテンポラリのテーブルをひとつ用意して、その中に最後に使った伝票番号を格納するようにしています。

このデータベース内で用いている方法の解説を、以下に示します。


<クエリー&マクロ版>

用意するもの:

テーブル1つ。中身は1レコードだけ。データシートビューを使って適当な数を入力しておく。
下のテーブルでいくと、左のテーブルは特に使用しない。クエリーで検索しやすくするため。
右のフィールドの中身が、実際の伝票番号になります。ここでは「今年の西暦+伝票番号」という付け方をしようとしていますので、「ナンバー2」というフィールドを作って、こちらは数値のフィールドにしています。とりあえず下のように、1行だけ入力しておきます。

テンポラリテーブル

クエリー2つ。
ひとつめ。更新クエリーです。上のテーブルのレコードを拾い(IDが1のもの、ってやってください)、ナンバー2のフィールドに1を足して更新しています。

クエリー

クエリー2つめ。再びテーブルの中を見て、新しい伝票番号を作っています。
ここではDatapart関数という関数を使って、現在の西暦の部分を取り出して伝票番号の先頭に使っています。
また、ナンバー2のフィールドは数値型なので、先行ゼロが反映されません。"199800001"という具合にしたい場合は、format関数という関数を使って、数値の書式を整えます。
この二つの値をアンパサンドで合わせて(+で足しちゃだめですよ)、ナンバーのフィールドを更新します。

クエリーデザイン

このふたつを、順番にマクロで動くようにして、新しくレコードが追加された後、注文番号がつくようにします。
そうすると、常に新しい注文番号がつくようになります。
但し、注文番号が主キーになっている場合は、早いうちに伝票番号を付けておかないと、サブフォームをクリックしたときに「主キーがNullはイケマセン」というようなキビシイおきてのエラーメッセージが出ます。
この辺はうまく工夫してみてください。

クエリーの名前などをわかりやすく付けておけば、後で修正しやすいので、結構使われているテクニックだと思います。


<関数版>

これもしくみは同様です。マクロとクエリー2つで動かしてたことを、ひとつのプロシージャーで実行させているだけです。

<用意するもの>

テーブルひとつ。上記テーブルとまったく同じ用途で使いますので、付ける番号のロジックにあったテーブルを作ります。

テンポラリテーブル

で、以下のようなプロシージャを作ります。独立したモジュールとして作成してもよいと思いますが、このDBでは、フォームの中のクラスモジュールとして作りました。フォームのイベントプロパティBeforeInsertに作ってみました。

Private Sub Form_BeforeInsert(Cancel As Integer)
Dim db As Database
Dim D1 As Recordset
Dim Number As Long
Dim CountA As Long
Set db = CurrentDb
Set D1 = db.OpenRecordset("W_Temp1")
D1.MoveFirst
Number = D1!ナンバー
CountA = Number + 1
D1.Edit
D1!ナンバー = CountA
D1.Update
Me!商品番号 = CountA
Me!仮ラベル.Visible = True
Me!変更ラベル.Visible = False

D1.Close
End Sub

下の方の赤い文字の部分は、特にナンバリング処理とは関係ありません。番号がついたことを入力者に知らせるため、今まで可視していなかったラベルを可視にしているだけです。ラベルを2種類作っているので、片方はFalseのままにしといてね、と、念のための1行です。

で、これだけでもちゃんと採番されますが、チョット欲張って「分類コード」によって、伝票番号の先頭に文字列を付け加えてみようと思いました。分類コードのコンボを変更した後に動く関数がこれです。

Private Sub 分類コード_Change()
Dim db As Database
Dim D1 As Recordset
Dim CountA As String
Dim Bunrui As String
Dim NewNumber As String
Set db = CurrentDb
Set D1 = db.OpenRecordset("M_Bunrui", dbOpenDynaset)
D1.FindFirst "分類コード='" & Me!分類コード & "'"
Bunrui = D1!略称
CountA = Right(Me!商品番号, 7)
NewNumber = Bunrui & "-" & CountA
Me!商品番号 = NewNumber
Me!仮ラベル.Visible = False
Me!変更ラベル.Visible = Tru
e
D1.Close
DoCmd.GoToControl "現在庫数"
End Sub

あらかじめ、分類テーブル(M_Bunrui)の中で、略称を決めておき、組み合わせてひとつの伝番を作るようにしてます。
別に2段階にしなくても、ひとつの関数にして、別のイベント時に動くようにしてもよいと思います。

この他にも、いろいろ細かい技を使ってます。完成品ではありませんが、「文房具の出し入れ台帳」みたいなお仕事になら、すぐ使っていただけるんじゃないかな、と思います。