- 締切済み
データを効率よく入力させるには?
ACCESSにおいて製品の数量を入力するのに、製品を効率よく選択し数量を入力したいと思っています。現在は製品コードを設定し、それを入力したり、ドロップダウンリストから選択できるようにしていますが、効率があまりよくありません。 製品データの形式は、 OEM AAA 1111 OEM AAA 1112 OEM AAB 1111 CDK AAA 1111 というように、タイプ・記号・番号で構成され、データ数は約2000程度です。 何かいい知恵がありましたら、よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
#5で書き忘れてました。最初に 1.製品数量テーブル(仮称)の作成 フィールドはとりあえず三つ 製品数量ID(オートナンバー) 製品ID、数量(数値)
#2です。プロトタイプで試験していましたが、フォーム作りとVBAは久々の作業で手間取りました。ついでに昔からVBAは嫌いでしたがますます嫌いになりました。それはさておき 1.フォームを作りレコードソースを SELECT 製品数量テーブル.数量, 製品数量テーブル.製品ID, 製品テーブル.製品名, 製品テーブル.コード FROM 製品テーブル INNER JOIN 製品数量テーブル ON 製品テーブル.製品ID = 製品数量テーブル.製品ID; 2.フィールドリストからマウスで 数量、製品名、コード をフォーム上に配置する 3.コンボ1、コンボ2、コンボ3 をフォーム上に配置する 4.コンボ1 の 値/データ集合ソースを SELECT 製品テーブル.タイプ FROM 製品テーブル GROUP BY 製品テーブル.タイプ ORDER BY 製品テーブル.タイプ; 5.コンボ2 の 値/データ集合ソースを SELECT 製品テーブル.記号, 製品テーブル.タイプ FROM 製品テーブル GROUP BY 製品テーブル.記号, 製品テーブル.タイプ HAVING (((製品テーブル.タイプ)=[Forms]![フォーム1]![コンボ1])); 6.コンボ3 の 値/データ集合ソースを SELECT 製品テーブル.番号, 製品テーブル.タイプ, 製品テーブル.記号 FROM 製品テーブル WHERE (((製品テーブル.タイプ)=[Forms]![フォーム1]![コンボ1]) AND ((製品テーブル.記号)=[Forms]![フォーム1]![コンボ2])); 7.コンボ1 のイベント/更新後処理をコードビルダで DoCmd.Requery "コンボ2" 8.コンボ2 のイベント/更新後処理をコードビルダで DoCmd.Requery "コンボ3" 9.コンボ3 のイベント/更新後処理をコードビルダで Dim key As String Dim rsSt As Recordset, rst As Recordset Dim strSQL As String key = [Forms]![フォーム1]![コンボ1] + " " + [Forms]![フォーム1]![コンボ2] + " " + [Forms]![フォーム1]![コンボ3] Set dbs = CurrentDb strSQL = "SELECT 製品テーブル.製品ID, 製品テーブル.コード " & _ "FROM 製品テーブル WHERE (((製品テーブル.コード)='" & key & "'));" Debug.Print strSQL Set rsSt = dbs.OpenRecordset(strSQL) Forms![フォーム1]![製品ID] = rsSt![製品ID] 以上です。留意点 A.製品テーブルは正規化した方が良いでしょう。ツール/解析/テーブルの正規化など見てください B.VBAのツール/参照設定で Microsoft DAO 3.6 Object Library にチェックを着けてください。いまならばDAOよりADOが良さそうですが、旧い自作コードを参考にしたためこんなことになりました(^^;
効率よく入力したいなら、するべきことは現状の把握です。 このようなケースの場合は タイプは何種類あるのか? それぞれのタイプに記号は何種類あるのか? それぞれの記号に番号は何種類あるのか? 入力者は一日何件入力するのか? どのように入力作業を行っているのか?(入力者は製品番号をどの程度覚えているのか?、製品名から検索する必要があるのか?など) これらの状況を把握すれば効率よい入力方式を考えることができます。 例えば、タイプや記号などが数種類以下ならば、ラジオボタンなどで選択するほうが早いですが、その数が20を超えると他の方式を選んだほうがよくなってきます。また、番号を覚えているケースが多いなら直接入力する場所を作ったほうがよいですが、製品名を毎回検索するならそのような場所は要らないかもしれません。 製品マスタを作るにあたって他に重要なこととして 世代管理を行う必要があるのか?(価格更新、取り扱い停止などの管理) というのもあります。 私個人的には、効率よく入力をする際には、キーボードから手を離すことなく入力できるように考えます。 具体的には、検索文字を入れるテキストボックスと、リストボックスなどを組み合わせてエクセルのオートコンプリートみたいな機能をつけるのがよいと思いますが、ちょっとプログラミングが必要になります。 入力件数が一日数十件ならそこまでしなくてもよいかもしれません。
#2です 1.製品コードをタイプ、記号、番号の3フィールドに分解 更新クエリーを使用します。 a.製品テーブル(仮称)に タイプ、記号、番号 の3フィールドを文字型で追加する b.クエリ/新規作成/デザイン でデザインモードにし、ツールボタン左端のビュー選択ボタンドロップダウンリストから「SQL」を選択する。 c.SQL文に下記を貼り付ける UPDATE 製品テーブル SET 製品テーブル.タイプ = Left([コード],3), 製品テーブル.記号 = Mid([コード],5,3), 製品テーブル.番号 = Right([コード],4); ※「製品テーブル」テーブルの「コード」フィールドを分解すると仮定しています。適当にチューニングしてください 2.この3フィールドを主キーとして重複を防止 a.分解後の「製品テーブル」をデザインモードで開きます b.セレクタボタン(フィールド名左側の灰色四角ボタン)でタイプ、記号、番号の三フィールドを選択 c.ツールバーの主キーボタン(鍵のマーク)を押して、上記三フィールドを主キーにする。
コンボボックスを使用し、タイプ、記号、番号で絞り込んでゆくのが一般的でしょう。ポイントとしては 1.製品コードをタイプ、記号、番号の3フィールドに分解 2.この3フィールドを主キーとして重複を防止 3.選択フォームで3フィールドごとにコンボボックスを作成 4.タイプ更新後のイベントに記号コンボボックスの再クエリーをおこなう 5.記号更新後も同様 などでしょうか
補足
fuuten_no_nekoさん御回答ありがとうございます。 質問の内容のとおり、私は初心者です。 ”1.製品コードをタイプ、記号、番号の3フィールドに分解” ”2.この3フィールドを主キーとして重複を防止” とは具体的にどうすればいいのでしょうか? 申し訳ありませんが、よろしくお願いします。
- mozu001
- ベストアンサー率14% (2/14)
自信ないですが回答します。 入力は、エクセルで行い、アクセスはそれを参照する。 タイプ,記号,番号の入力を分け、プルダウンで選択させれば、データ数はもっと減りそう。 オートコレクト機能でしたか...働けば手入力でもいけそう。 製品コードは、文字結合すれば作れる。 番号は手入力になりそうですが...。
お礼
早速の御回答ありがとうございます。
補足
fuuten_no_nekoさん,ご丁寧な説明ありがとうございます。 説明いただきましたとおり、フィールドを3つに分けることができ、 その3つのフィールドに対して、主キーを設定することもできました。 その先ですが、数量入力用のテーブルも必要になると思うのですが、 受付番号(主キー)・タイプ・記号・番号・数量というような構成で 「製品テーブル」のタイプ・記号・番号それぞれに対応する リレーションシップを設定すればよいのでしょうか? よろしくお願いします。