初めまして。
ご教授の程、よろしくお願い申し上げます。
win10;access2016使用
メインフォームにレコードソース;T仕入情報
サブフォームにレコードソース;T仕入明細を使用しています。
T仕入情報には、
仕入先ID(オートナンバー型)
T仕入明細には、
商品分類ID(オートナンバー型)
仕入大分類ID(オートナンバー型)
仕入中分類ID(オートナンバー型)
仕入商品ID(オートナンバー型)
入数(数値型;整数)
仕入単価(通貨型)
があります。
また、サブフォームのT仕入明細の値集合ソースには、
仕入先ID各社の仕入商品テーブルをユニオンクエリした「UQ仕入商品一覧」を利用しようと考えております。
仕入商品テーブルはいずれも、
仕入先ID(オートナンバー型)
仕入商品ID(オートナンバー型)
商品分類ID(オートナンバー型)
仕入大分類ID(オートナンバー型)
仕入中分類ID(オートナンバー型)
仕入商品名(短いテキスト)
入数(数値型;整数)
仕入単価(通貨型)です。
入数と仕入単価は常に一定のものと、そうではなく日常的に変化が伴うものが混合するため、値の代入を利用したく、
順番としては、
1・メインフォームの仕入先ID;コンボボックス(イベント更新後処理でサブフォームを再クエリ)
2・仕入先ID(コンボボックス)選択。(イベント更新後処理で商品分類IDを再クエリ)
3・商品分類ID(コンボボックス)選択。(イベント更新後処理で仕入大分類ID再クエリ)
3・仕入大分類ID(コンボボックス)選択。(イベント更新後処理で仕入中分類ID再クエリ)
4・仕入中分類ID(コンボボックス)選択。(イベント更新後処理で仕入商品ID再クエリ)
5・仕入商品ID(コンボボックス)選択。(イベント更新後処理で仕入先IDと仕入商品IDから入数と仕入単価の値の代入)
6・数量(テキストボックス)入力
7・入数(テキストボックス)
8・仕入単価(テキストボックス)
以上です。
1~4までは問題なくできたのですが、5がどのようにしても出来ません。
色々と調べましたが、まだ知識が足りず、解決できずにおります。
仕入先ID(オートナンバー型)と仕入商品ID(オートナンバー型)の組み合わせであれば重複することはないので、抽出できると考えたのですが、ユニオンクエリを使用するのが間違いなのでしょうか。
投稿者です。
あまりにも拙い説明で、非常に分かりにくいかと存じます。
明日改めて、各種画像を添付致しますので、何卒、ご教授のほど、よろしくお願い申し上げます。
DLookup、正直苦手なのでしっかり回答出来ないのですが、追加情報があればいいかもと。
抽出条件無しでの動作確認、単独条件での動作確認、パラメータの代わりに適当な値を入れて動作確認はどうでしたか?パラメータの参照は想定通り?(仕入商品IDが何処を参照する事になるのか誰か解説して欲しい。)
念の為、コンボボックスについても確認です。仕入先IDや仕入商品IDですが、1列目ならば連結列は1、2列目ならば連結列は2となっていますか?
念の為、仕入先IDや仕入商品IDについても確認です。オートナンバー型との事ですか、0001、0002、0003みたいな感じではないですよね?実はNULLもあったり、なんてことはないですよね?
りんご 様
お忙しい中大変ご丁寧にありがとうございました。
>抽出条件無しでの動作確認、単独条件での動作確認、パラメータの代わりに適当な値を入れて動作確認はどうでしたか?
抽出条件無での動作確認は問題ございませんでした。
また、単独条件での動作確認ですが、仕入商品ID(オートナンバー型)を単独条件としたところ、本来導き出したい数値とは異なるものが代入されました。
わたくしの勝手な推測なのですが、仕入商品ID(オートナンバー型)は仕入先ID各社の仕入商品テーブルがあり、仕入商品ID(オートナンバー型)が重複するため、別のものを代入しているのではないかと考えます。
パラメータの代わりにダイレクトに仕入先IDを3仕入商品IDを3として動作してみたところ、
いずれも「エラー13 型が一致しません」となりました。
わたくしの式の書き方が悪いことが原因と思います。(恥ずかしながら、調べながら利用している素人です)
下記3通り試しました。
入数 = DLookup(入数, "UQ仕入商品一覧", "仕入先ID = 3" And "[仕入商品ID] = 3")
入数 = DLookup(入数, "UQ仕入商品一覧", "[仕入先ID] = 3" And "[仕入商品ID] = 3")
入数 = DLookup(入数, "UQ仕入商品一覧", "Forms![F仕入入力]!仕入先ID = 3" And "[仕入商品ID] = 3")
>念の為、コンボボックスについても確認です。仕入先IDや仕入商品IDですが、1列目ならば連結列は1、2列目ならば連結列は2となっていますか?
プロパティシートにて連結列確認いたしました。
連結列はコンボボックスすべてにおいて「1」でした。
>念の為、仕入先IDや仕入商品IDについても確認です。オートナンバー型との事ですか、0001、0002、0003みたいな感じではないですよね?実はNULLもあったり、なんてことはないですよね?
仕入先IDと仕入商品IDは頭に0等は入らず全て整数の「1.2.3…」となっております。
またNULLはございません。
全てのIDには必ず整数が入るようにしております。
hatena様から教えていただきました通りに変更したところ、入数には正しい数値が代入されました。
とりあえずエラーの行を下記のように変更してみてください。
hatena 様
お忙しい中大変ご丁寧にありがとうございました。
お教え下さった通りに変更しましたところ、
無事、成功しました。
お教えくださった内容をもとに、何が間違えていたのかを調べました。
正解か分かりかねますが、変数を扱いたいにもかかわらず、お教え下さった下記のように
入数 = DLookup("入数", "UQ仕入商品一覧", "仕入先ID = " & Forms![F仕入入力]![仕入先ID] & " And 仕入商品ID = " & [仕入商品ID])
「"入数"」と「" & Forms![F仕入入力]![仕入先ID] & " 」としていなかったことについて調べました。
「"入数"」については「"」を付けなくてもよいという記述もあり、まだ理解できておりません。
継続して調べてまいります。
「" & Forms![F仕入入力]![仕入先ID] & " 」については、変数を扱うにおいては「"&変数&"」としなければならないとの結論に至りました。(正解か不明ですが…)
色々と調べていたものの、一週間ほど悩んでおりましたので、解決して一安心しております。
本当に有難うございました。
まずは公式のヘルプで確認しましょう。
Application.DLookup メソッド (Access) | Microsoft Docs
これによると引数はすべて文字列で指定することが分かります。
>「"入数"」については「"」を付けなくてもよいという記述もあり、まだ理解できておりません。
どこで調べたか分かりませんが、それはあきらかに間違いですね。
第3引数は、抽出条件式を文字列として指定します。
具体的にはクエリのSQL文のWhere句に設定する条件式になります。
例えば 仕入先IDが 1、仕入商品IDが 2 のものを抽出するとき、SQLでは下記のようになります。
(SQLが分からなければ、デザインビューで条件を設定してからSQLビューにすれば確認できます。)
これをDLookupに変換すると、下記のようになります。
1 と 2 の部分は固定値ではなく、フォームのテキストボックスの値を参照することになるので、文字列の外に出して、
この固定値の部分をコントロール参照式に変更します。
ここで注意することは、DLookup関数の第3引数に設定するのはSQLの条件式ということです。
SQLとVBAは似ていますが、まったく別のものだということを意識してください。
VBAとSQLでも文字列の扱いの違いは、下記で詳しく解説していますので、ご参考に。
Access上のコード内で引用符(")と単引用符(')の使い分けについて - hatena chips
hatena 様
>まずは公式のヘルプで確認しましょう。
これによると引数はすべて文字列で指定することが分かります。
ありがとうございます。
文字列式とありました。
今後は公式のヘルプを何度も読み直し、しっかりと確認いたします。
>どこで調べたか分かりませんが、それはあきらかに間違いですね。
今回のエラーに関して様々な質問板等を見ているときに、DLookup (Expr, Domain, Criteria)ではExprの部分は""で囲まなくてOKです!と書いてあったので、お恥ずかしくも鵜吞みにしておりました。。。
また、きめ細やかなご解説本当に有難うございます。
リンクまで貼って下さり有難うございます。
拝見しました。
素人のわたくしにも理解できるように、詳しくご解説してくださっているので、
とても分かりやすく、勉強になりました。
重ね重ね御礼申し上げます。