- ベストアンサー
Accessで倉庫管理のためのDlookup関数の使い方とエラー対処法
- Accessで倉庫管理を行っている場合、Dlookup関数を使用してItemNameに対応するItemIDとItemGroup、Unitを一緒に表示させることができます。
- ただし、ItemIDとUnitは数値型、ItemNameとItemGroupはテキスト型である必要があります。
- そのため、正しいコードを使用するためには、ItemNameとUnitを正しく取得し、それらを条件としてDlookup関数を使用する必要があります。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
製品を登録するマスターテーブルと、入出庫を記録するテーブルは 一般的には分けて保持します。もちろん製品マスターテーブルに 入庫数、出庫数、初期値などを記録しておくこともありますが、 別に入出庫テーブルを作成する案はどうでしょう。 (1) たとえば、入出庫テーブルの名前を「T入出庫」とし、 フィールドを 日付 ItemID 入庫数 出庫数 とします。 (2) (1)のテーブルとInvetoryで以下のクエリを作成し、 名前を「Q入出庫」とします。 SELECT T入出庫.日付, T入出庫.ItemID, Inventory.ItemName, Inventory.Unit, Inventory.Group, T入出庫.入庫数, T入出庫.出庫数 FROM T入出庫 INNER JOIN Inventory ON T入出庫.ItemID = Inventory.ItemID; (3) 次に、(2)のクエリを基にフォームの新規作成で 表形式を選択し、名前を「F入出庫管理」とします。 (4) フォームをデザインビューで開き、ItemIDのコントロールを コンボボックスに変更します。そのコンボボックスの 値集合ソースに以下を設定します。 SELECT Inventory.ItemID, Inventory.ItemName, Inventory.Unit, Inventory.Group FROM Inventory; プロパティを以下に設定します。 列数 4 列幅 2cm;2cm;2cm;2cm リスト幅 7cm その他は既定 (5) フォームのItemName、Unit、Groupの各テキストボックスの 「編集ロック」を「はい」にします。 (6) 以下をフォームのコード表に貼り付け保存してください。 Private Sub ItemID_Enter() If IsNull(Me!日付) Then MsgBox "日付を先に入力してください" Me!日付.SetFocus Exit Sub End If End Sub Private Sub 出庫数_Enter() If IsNull(Me!日付) Then MsgBox "日付を先に入力してください" Me!日付.SetFocus Exit Sub End If If IsNull(Me!ItemName) Then MsgBox "製品を選択してください" Exit Sub End If End Sub Private Sub 入庫数_Enter() If IsNull(Me!日付) Then MsgBox "日付を先に入力してください" Me!日付.SetFocus Exit Sub End If If IsNull(Me!ItemName) Then MsgBox "製品を選択してください" Exit Sub End If End Sub マスターテーブルが誤って書き変えられないように (5)での処置を行なっています。 これで一度確認してみてください。
その他の回答 (7)
- piroin654
- ベストアンサー率75% (692/917)
No7の中で、 GroupがもしItemGroupということならば、 (2)、(4)のクエリでGrouoとなっているところを ItemGroupとしてください。 以上以外に表記の違いは変更してください。 確認ですが、 GroupはItemの分類ですか?
- piroin654
- ベストアンサー率75% (692/917)
だいたいの様子はわかりましたが、 そもそもフォームのレコードソースが Inventoryであるならば、質問の操作を するとテーブルのデータを書き変えることに なりますが、このフォームの目的は どのようなものでしょうか。製品登録、 検索、入出庫登録などがありますが。 >ここでItemNameはリストボックスで選択された小道具はItemID >とItemGroupも一緒に表示するようになってほしいです。 また、上記のリストボックスはコンボボックスですよね。
補足
Iventory というテーブルは製品名を入力するマスターテーブルです。 フォームは入出庫管理フォームです。製品名を入力するとIDとグループも表示されたら、入力するのに楽のではないかと思います。 >>ここでItemNameはリストボックスで選択された小道具はItemID >>とItemGroupも一緒に表示するようになってほしいです。 >また、上記のリストボックスはコンボボックスですよね。 リストボックスと思ったらコンボボックスです。本当に、素人です
- piroin654
- ベストアンサー率75% (692/917)
>倉庫管理フォームの中にこんな感じです >ItemID ItemName ItemGroup Unit UserID UserName この中でコンボボックスはどれですか。また、コンボボックスの 値集合ソース コントロールソース 値集合タイプ 値集合ソース 列数 列幅 連結列 はどのようになっていますか。 また、フォームは単票形式、あるいは表形式のどれですか。
補足
>倉庫管理フォームの中にこんな感じです >ItemID ItemName ItemGroup Unit UserID UserName ItemName はコンボボックスです。 この中でコンボボックスはどれですか。また、コンボボックスの 値集合ソース: SELECT Inventory.ItemName FROM Inventory; コントロールソース: ItemName 値集合タイプ: テーブル/クエリ 列数:1 列幅 連結列 1 フォームは帳票です よろしくお願いします。
- shincha119
- ベストアンサー率42% (95/226)
No1です。 コンボボックスから値が取れず、テキストボックスから値が取れた、というのは明らかにコントロールの使い方を理解してないからですね。 このままズルズルいってしまうような気がするので、一度以下のサイトなどを参考にして簡単なところから覚えていってください。 http://www.accessclub.jp/ AccessはVBと同じである程度覚えるとかなり楽な開発環境ですので、分からないことをまとめてやろうとするのではなく、コントロール1つ(例えばコンボボックスやリストボックス)を「リストボックス 値 代入」みたいなワードでGoogle等で検索してみてください。その答えはかならず見つかります。
お礼
仰った通りです。基本の基本も勉強せずに、やっていますので混乱していします。 サイトを参考にして、少しずつ覚えるようにします。 ありがとうございました。
- shincha119
- ベストアンサー率42% (95/226)
No1です。 エラーが出なくなった、ということは式そのものにエラーがないということと同時に その条件ではNULL(データなし)で返ってくるということになります。 ということはつまり、 ItemID(数値型) ItemName(テキスト型) ItemGroup(テキスト型) Unit(数値型) UserID(数値型?) UserName(テキスト型) この組み合わせ条件に誤りがあると予想されます。 データはInventoryテーブルに入ってるということなら 一度これらの値を決め打ちしてデータが取得できるかやってみてはどうでしょう? 例えば、 Inventoryテーブルに以下のデータを登録 ItemID 999 ItemName 試供品 ItemGroup 試作 Unit 1 UserID 999(必要なら) UserName テスター(必要なら) このデータを先ほどの式に当てはめると Me![ItemID] = Nz(DLookup("[ItemID]", "Inventory", "ItemName='試供品' And Unit=999 And ItemGroup='試作'"),"") こうなります。 これがうまくいったら Nz(DLookup("[ItemID]", "Inventory", "ItemName='" & ItemName & "' And Unit=999 And ItemGroup='試作'"),"") というように1つずつ決め打ち部分を変数に修正していきましょう。 これでMe![ItemID]が取得出来ない場合、テーブルのデータ型が違うとかどこかにスペースが入ってるとか、 そういう状況が考えられるのでいろいろ試してみてください。
お礼
ありがとうございます。 いろいろ試しましたら、ItemNameはテキストボックスならいけました。 私の場合はコンボボックスですのでダメでした。 本当にお手数ですが、この問題はどう処理すればよいでしょうか? よろしくお願いします
- shincha119
- ベストアンサー率42% (95/226)
No1です。 Null辺りのエラーということは文そのものはいけたということで話を進めると、 どこか(多分戻り値のMe![ItemID]がNULL)にNULL値が入っているんじゃないでしょうか。 NZ関数とかIsNull関数辺りでカバーすればいけそうです。 Nz関数でやるとこんな感じです。 Me![ItemID] = Nz(DLookup("[ItemID]", "Inventory", "ItemName='" & ItemName & "' And Unit=" & [Unit] & " And ItemGroup='" & Me![ItemGroup] & "'"),"") テキスト型にNULL値は入れられないので、戻り値以外にも取得前のItemNameとItemGroupに対しても 同様の処理をする必要があるかもしれません エラーが出た場合は「エラー内容 使用しているアプリケーション」でGoogleなどで検索をかければ大抵の場合 解決策があるので、参考までに留めておいてください。
補足
ありがとうございます。 今回はエラーはでなくなりしたが、コードを聞かないそうです。 製品名を選択しましたが製品IDもグループ名もでないです。 テーブルから直接取り出すことが出来ないでしょうか? 恐縮ですが、どうぞよろしくお願いします。
- shincha119
- ベストアンサー率42% (95/226)
手元にAccessがないのでぱっと見た感じですが "ItemName='" & ItemName & "'" And Unit" & [Unit] & And ItemGroup='" & Me![ItemGroup] & "'" ここの部分、もしかすると↓こうじゃないですか? "ItemName='" & ItemName & "' And Unit=" & [Unit] & " And ItemGroup='" & Me![ItemGroup] & "'" 一文にすると ItemName='ItemName' And Unit=[Unit] And ItemGroup='Me![ItemGroup]' こうしたいということですよね? 文字と変数の区別が多少こんがらがってる気がします。
お礼
早速ご対応ありがとうございます。 教えていただいたコードを使ってみたら、Nullの使い方が不正ですというエラーが出ます。 Me.ItemID = DLookup(ItemID, "Inventory", "ItemName='" & ItemName & "' And Unit=" & [Unit] & " And ItemGroup='" & Me![ItemGroup] & "'") このエラーの解除はどうすればよいでしょうか? 倉庫管理フォームの中にこんな感じです ItemID ItemName ItemGroup Unit UserID UserName ここでItemNameはリストボックスで選択された小道具はItemIDとItemGroupも一緒に表示するようになってほしいです。 フォームのソースはInventoryテーブルから取り出します。 よろしくお願いします。
お礼
グループは製品の分類です。 丁寧なご回答、ありがとうございます。 やってみました。うまく行けました。 本当に助かりました。ありがとうございました。