こんにちは アクセス2000で発注書を作っています
ど素人です。。
コンボボックスの絞りこみについて教えてください。
現在5つのコンボで絞込みをしています
コンボ1仕入先(メインフォーム)
コンボ2種類1(サブフォーム)
コンボ3種類2(サブフォーム)
コンボ4商品名(サブフォーム)
コンボ5詳細(サブフォーム)
です。
コンボ1は一度選択すると、変更はありません。
コンボ5で選択決定した後、コンボ2、コンボ3、コンボ4は空白に、
コンボ5は全表示に設定しているのですが
それだとコンボ1で選択した仕入先以外の商品も入ってしまうので
コンボ5に、コンボ1で仕入れた商品のみを全表示したい場合は
どうしたらいいですか?
説明下手で申し訳ありませんが
どなかたご教授の程よろしくお願いいたします
No.8ベストアンサー
- 回答日時:
質問、新しく商品の枝番が発生した場合の処理手順。
1、在庫ゼロでテーブル[商品]に追加する。
2、テーブル[商品]に追加しない。
仕入先:
仕入先コード_仕入先名_担当者名
___________101__A社________山田花子
___________201__B社________山田太郎
___________301__C社________山田五郎
商品:
商品コード_仕入先コード_品番_種類1_____種類2__商品名____色____サイズ_単価____入数
___________1_____________101_156___メンズ_____トップ___シャツA___赤____L_______\1,000_____5
___________2_____________101_156___キッズ_____トップ__シャツB____青___S_______\800_______3
___________3_____________101_156___レディス__ボトム_デニムA____白___L_______\5,000_____2
※典型的な主テーブルと従テーブルの混在。
※市販の販売管理システムの大概は、枝番を従テーブルで管理しています。
※困った先人ですね。
発注書:
発注書コード_仕入先コード
_______________1_____________101
※列[仕入先名]は不要ですね。
発注明細:
明細コード_発注書コード_商品コード_数量
___________1________________1_____________1______1
___________2________________1_____________2______1
なぜ、冒頭の質問をするのかというと[発注書]と[発注明細]とはこれで十分な可能性があるからです。
例えば、次のような[発注明細クエリ]を用意すれば目的のフォームは自動生成されます。
発注明細クエリ:
明細コード_発注書コード_商品コード_品番_種類1_種類2_商品名___色_サイズ_単価____数量
____________1________________1____________1__156_メンズ_トップ___シャツA__赤_L_______\1,000______1
____________2________________1____________2__156_キッズ_トップ___シャツB__青_S______\8001______1
SELECT 発注明細.明細コード, 発注明細.発注書コード, 発注明細.商品コード, 商品.品番, 商品.種類1, 商品.種類2, 商品.商品名, 商品.色, 商品.サイズ, 商品.単価, 発注明細.数量
FROM 発注明細 LEFT JOIN 商品 ON 発注明細.商品コード = 商品.商品コード;
こうなると、[発注明細]![商品コード]で'0'か空でも入力されたら商品選択のためのフォームをオープンするだけ!
いつも丁寧にご回答くださり、ありがとうございます
質問のお答えですが
こちらは私が担当しないのでどう処理するか?ですが
多分1になるかと思われます。
また、〔発注明細クエリ〕も元々作成されてたのですが
帳票フォームでやりたいことと
どうしても結びつかないことがおきて
不具合が多すぎて 外しました。
今回いろいろなアドバイスをいただき、
改めてシステムを見直すいいきっかけになりました。
質問の内容は
値集合ソースを書き換えることで
解決することができましたので
これで、質問を終了させていただきます。
WHERE (((商品.商品名)=[商品名コンボ]) AND ((商品.仕入先コード)=[forms]![発注書]![仕入先コードコンボ])) OR ((([商品名コンボ]) Is Null))
↓
WHERE (((商品.商品名)=[商品名コンボ] or [商品名コンボ]) Is Null) AND ((商品.仕入先コード)=[forms]![発注書]![仕入先コードコンボ])))
本当にありがとうございました
No.7
- 回答日時:
本格的回答002:
=================================================================================
さて、商品情報の記録を主と従とで管理しない現行を追認するとした場合のやり方ですが・・・。
その前に、テーブル発注の設計が明確でないと話が噛み合わないですよ。
発注台帳: テーブル
[ID]_[発注番号____]_[発注日_______]_[仕入先コード]
___1__2008120001___2008/12/01___新日本商事
___2__2008120002___2008/12/02___新日本商事
___3__2008120003___2008/12/03___朝日商会
発注明細: テーブル
[ID]_[発注台帳_ID]_[行番号]_[商品コード]_[品名・品番___]_[枝番1____]_[枝番2_____]_[枝番3]_[数量]_[備考]
___1_________________1__________1___A001__________男子靴__________S_____________c#001_______紐付き______10__________
___2_________________1__________2___A001__________男子靴__________M_____________c#002_______紐付き________1_________
___3_________________2__________1___B001__________スニーカー______25cm_______C1____________________________4__________
[発注台帳_ID]_[行番号]を主キーにしてもOK!
ともかく、このような[発注台帳]と[発注明細]という関係な筈。
======================================
発注番号_______[2009120001]
発注日__________[2008/12/01]
仕入先コード___[S001_________][新日本商事____________________________]
--------------------------------------
[行番号][商品コード][品名・品番___][枝番1____][枝番2_____][枝番3___][数量][備考]
--------------------------------------
[______01][A001_______][男子靴_______][S__________][c#001_____][紐付き__][___10][______________]
[______02][A001_______][男子靴_______][M__________][c#002_____][紐付き__][_____1][_____________]
--------------------------------------
そして、これが普通に考えた発注データの入力フォーム。
ここでは、商品コード数の多さを考えればコンボボックスの利用は不可。
固定的なデータで個数も割りと少ないデータの選択に適しているのがコンボボックス。
で、原則として各行毎にそのローソースは変えてはいけません。
提案1、少なくとも、以上のようなテーブル構造とデータは示されたがいいですね。
提案2、Accessで作業する以前に、このようにワードかなんかでシュミレーション。
提案3、[発注明細]![商品コード]を削除したり空だったら[仕入先別商品枝番検索フォーム]をオープンすることも。
以上、お節介ながら・・・。
この回答への補足
ありがとうございます
わかりやすいように書いてみました(実際の商品内容は違います)
発注書: テーブル
[発注書コード(オートno主キー)]_[仕入先コード]_[仕入先名]_[...以下省略]
_____________________1____________101____A社
_____________________2____________201____B社
_____________________3____________301____C社
発注明細: テーブル
[明細コード*オート/主キー]_[発注書コード]_[商品コード]_〔品番〕_〔商品名〕_〔色〕_〔単価〕_〔数量〕_[以下省略]
商品:テーブル
[商品コード*オート/主キー]_[仕入先コード]_〔品番〕_〔種類1〕_〔種類2〕〔商品名〕〔色〕〔サイズ〕〔単価〕_〔入数〕_[以下省略]
[01]_____________________[101]__________〔156〕_〔メンズ〕_〔トップ〕〔シャツA〕〔赤〕〔L〕〔¥1000〕_〔5〕_[以下省略]
[02]_____________________[101]__________〔156〕_〔キッズ〕_〔トップ〕〔シャツB〕〔青〕〔S〕〔¥800〕_〔3〕_[以下省略]
[01]_____________________[101]__________〔156〕_〔レディス〕_〔ボトム〕〔デニムA〕〔白〕〔L〕〔¥5000〕_〔2〕_[以下省略]
[01]_____________________[201]__________〔156〕_〔キッズ〕_〔トプス〕〔チュニック〕〔白〕〔F〕〔¥1000〕_〔5〕_[以下省略]
[02]_____________________[301]__________〔156〕_〔ベビー〕_〔─〕〔スタイ〕〔青〕〔S〕〔¥800〕_〔3〕_[以下省略]
[01]_____________________[201]__________〔156〕_〔キッズ〕_〔その他〕〔帽子5〕〔白〕〔F〕〔¥5000〕_〔2〕_[以下省略]
仕入先:テーブル
〔仕入先コード・主キー〕〔仕入先名〕〔担当者名〕
〔101〕_________________〔A社〕____〔山田花子〕
〔201〕_________________〔B社〕____〔山田太郎〕
〔301〕_________________〔C社〕____〔山田五郎〕
こんな感じです
発注書:メインフォーム
〔発注書番号〕〔日付〕{仕入先コードコンボ}〔仕入先名〕〔担当者名〕〔以下省略〕
発注書明細:サブフォーム
●ヘッダー
{種類1コンボ}{種類2コンボ}{商品名コンボ}
種類1コンボの値集合ソース
SELECT DISTINCT 商品.種類1, 商品.仕入先コード
FROM 商品
WHERE (((商品.仕入先コード)=[forms]![発注書]![仕入先コードコンボ]));
種類2コンボの値集合ソース
SELECT DISTINCT 商品.種類2
FROM 商品
WHERE (((商品.種類)=[種類1コンボ])) OR ((([種類1コンボ]) Is Null));
種類3コンボ
SELECT DISTINCT 商品.商品名
FROM 商品
WHERE (((商品.種類1)=[種類1コンボ]) AND ((商品.仕入先コード)=[forms]![発注書]![仕入先コードコンボ])) OR ((([種類2コンボ]) Is Null));
●詳細
{品番コンボ}〔商品名〕〔色〕〔サイズ〕〔数量〕〔単価〕〔明細金額〕〔メモ〕
*品番コンボの値集合ソース
SELECT 商品.品番, 商品.商品コード, 商品.商品名, 商品.色, 商品.サイズ, 商品.単価, 商品.仕入先コード
FROM 商品
WHERE (((商品.商品名)=[商品名コンボ]) AND ((商品.仕入先コード)=[forms]![発注書]![仕入先コードコンボ])) OR ((([商品名コンボ]) Is Null))
ORDER BY 商品.品番;
No.6
- 回答日時:
本格的回答001:
=================================================================================
仕入先: テーブル
仕入先コード__仕入先名
S001____________新日本商事
S002____________朝日商会
商品: テーブル
[ID]_[仕入先コード]_[商品コード]_[品名・品番]_[枝番1]_[枝番2]_[枝番3]_[単価]
___1__新日本商事_____A001_________男子靴________S________c#001___紐付き__\1,000
___2__新日本商事_____A001_________男子靴________M________c#002___紐付き__\1,100
___3__朝日商会________B001________スニーカー___24cm___C1__________________\2,000
___4__朝日商会________B001________スニーカー___25cm___C2__________________\2,100
仕入先コード=SELECT 仕入先.仕入先コード, 仕入先.仕入先名 FROM 仕入先;
(ルックアップを設定)
商品コードと品名・品番との相関関係も、これは各仕入先の商品体系で実に様々。
枝番1は色であったりサイズであったり、これは各仕入先の商品体系で実に様々。
当然に単価もS寸とM寸では違うことでしょう。
そういう事情で、このような商品マスターが作成されたということでしょう。
商品一覧: テーブル
[ID]_[区分1]_[区分2]_[仕入先コード]_[商品コード]_[品名・品番]
___1__区分1__区分2____新日本商事_____A001_________男子靴
___2__区分2__区分2____朝日商会________B001_________スニーカー
商品枝番: テーブル
[ID]_[商品_ID]_[枝番1]_[枝番2]_[枝番3]_[単価]
___1__A001_______S________c#001___紐付き__\1,000
___2__A001_______M________c#002___紐付き__\1,100
___3__B001_______24cm___C1__________________\2,000
___4__B001_______25cm___C2__________________\2,100
こういう場合、主テーブル(商品一覧)と従テーブル(商品枝番)とで管理します。
(名称は好みによって色々です)
こうすることで、仕入先と商品コードとが決まれば、その枝番情報が容易に検索できる訳です。
また、在庫管理する場合の、現実問題として[商品一覧]のレコード単位なんてのはありえません。
サイズや色毎、あるいは単価毎の在庫が判らないと意味ないので[商品枝番]のレコード単位が基本。
さて、このようなテーブル設計になっていない場合の[商品枝番]のレコード単位に相当する情報の抽出に挑戦中。
そういうことだと思います。
※お礼も補足もされないで本格的回答を先ずはお読みください。
この回答への補足
*********イベント
Option Compare Database
Private Sub 品番コンボ_AfterUpdate()
Me.商品名 = Me.品番コンボ.Column(2)
Me.色 = Me.品番コンボ.Column(3)
Me.サイズ = Me.品番コンボ.Column(4)
Me.単価 = Me.品番コンボ.Column(5)
End Sub
Private Sub 商品名コンボ_enter()
Me!品番コンボ.Requery
End Sub
Private Sub 種類1コンボ_AfterUpdate()
Me!種類2コンボ.Requery
End Sub
Private Sub 種類2コンボ_AfterUpdate()
Me!商品名コンボ.Requery
End Sub
Private Sub 商品名コンボ_AfterUpdate()
Me!品番コンボ.Requery
'タブ移動
Me![品番コンボ].SetFocus
End Sub
'フォーカスが移ると同時にドロップダウンさせる
Private Sub 種類1コンボ_GotFocus()
Me.種類1コンボ.Dropdown
End Sub
Private Sub 種類2コンボ_GotFocus()
Me.種類2コンボ.Dropdown
End Sub
Private Sub 商品名コンボ_GotFocus()
Me.商品名コンボ.Dropdown
End Sub
Private Sub 品番コンボ_GotFocus()
Me.品番コンボ.Dropdown
End Sub
'摘要フォーカス移動後にコンボボックスを空白にする
Private Sub 摘要_LostFocus()
Me!種類1コンボ = Null
Me!種類2コンボ = Null
Me!商品名コンボ = Null
Me!品番コンボ.Requery
End Sub
'テスト仕入先での絞り込み
Private Sub 数量_AfterUpdate()
Me.品番コンボ.RowSource = _
DBSelect("SELECT 品番 FROM 商品 WHERE 仕入先コード" & Me.仕入先コンボ.Value)
If Me.品番コンボ.ListCount > 0 Then
Me.品番コンボ.Value = Me.品番コンボ.ItemData(0)
End If
End Sub
以上です。
特殊な業種なので分かりやすいようにアパレルにしてみました
コンボボックスは上からの命令&現時点で一応完成しているものなので
使用不可にすることはできません。
品番コンボでダイレクトに品番をタイプすることも多いのですが
仕入先によっては商品数が少ないものもあり、
品番コンボでダイレクトに選べると便利なときもあるのと
他の仕入先が混ざってしまうと発注ミスなどが起こるとこまるので
品番コンボに メインフォームで選択した仕入先の商品一覧が
並ぶといいなあと思ったしだいです。
No.5
- 回答日時:
帳票タイプのコンボボックスですと、一つの行のロウソースを変更すると全てに反映しますよね。
そうなると、矛盾した行も出てきますよね。
ですから、この矛盾を回避するには、商品選択フォームなどをオープンしてターゲットを特定。
商品選択フォームを閉じる時に各行に必要なデータを書き込むのが普通。
※ロウソースと各行の値との矛盾が許される設計ですか?
何度も本当にありがとうございます
感謝いたします
仕事が来週までお休みになったので
検証ができず、来週あらためてお返事させていただきます
ありがとうございます!!
No.4
- 回答日時:
更に言えば、商品名と商品コードとをなぜ絞り込む必要があるのか?
-------------------------------------
[商品コード][品名・品番______]
[S001______][シューズ型番S001]
かように、既定の品名・品番を表示しアレンジも可はありえるでしょう。
でも、この場合は、コンボボックスではないですよね。
この回答への補足
度々ありがとうございます。
同じ商品コードが無数にあり、
最後に色や、形状などを選択するのです
かなりの商品数で既に管理されているテーブルなので
大まかなことは変えることができないのです。。
No.3
- 回答日時:
× コンボ5に、コンボ1で仕入れた商品のみを全表示したい場合はどうしたらいいですか?
○ コンボ5に、コンボ4で確定した商品の詳細情報を表示するにはどうしたらいいですか?
完全に質問文を読み違っていました。
>コンボボックスの絞りこみについて教えてください。
絞り込むことなんてありえないでしょう。
ただただ、参照するだけですね。
そうではないのですか?
この回答への補足
こんにちは
>絞り込むことなんてありえないでしょう。
ネットでコンボボックスについて いろいろ調べていたら
複数のこんぼで検索する場合、「コンボボックスでの絞込み」と
いうキーワードが多かったので使わせていただきました。
仕入先の数と
商品の数がとても多いので
コンボボックスで 数段階にわけて選択しています。
でも、この段階を踏まずに
ダイレクトにコンボ5で商品を探したいときもあるので
全表示にしていたのですが
他の仕入先が入るので
質問させていただきました。
No.2
- 回答日時:
別解:
コンボボックス仕入先(cmbSupplier)が更新されると、サブフォーム(フォーム2)の商品名も自動更新。
一応、先頭の商品名を選択した状態で更新することにします。
それぞれのコンボボックスは値リストとします。
そうして、それぞれの値集合ソースはVBAで設定します。
Private Sub Form_Load()
Me.cmbSupplier.RowSource = DBSelect("SELECT sup_code, sname FROM supplier")
If Me.cmbSupplier.ListCount > 0 Then
Me.cmbSupplier.Value = Me.cmbSupplier.ItemData(0)
cmbSupplier_AfterUpdate
End If
End Sub
Private Sub cmbSupplier_AfterUpdate()
Me.フォーム2.Controls("cmbGoods").RowSource = _
DBSelect("SELECT gname FROM goods WHERE sup_code=" & Me.cmbSupplier.Value)
If Me.フォーム2.Controls("cmbGoods").ListCount > 0 Then
Me.フォーム2.Controls("cmbGoods").Value = Me.フォーム2.Controls("cmbGoods").ItemData(0)
End If
End Sub
[イミディエイト]
? DBSelect("SELECT sup_code, sname FROM supplier")
1;s1;2;s2;
? DBSelect("SELECT gname FROM goods WHERE sup_code=1")
A1;A1;
このように、仮に SQL文の実行結果を値リストの形式で返す DBSelect関数の類があれば実に簡単。
※システムのメンテナンスという意味では、先の回答より簡単になるでしょう。
※コンボボックスのプロパティの設定を調べなくても良い訳ですから・・・。
Public Function DBSelect(ByVal strQuerySQL As String, _
Optional ByVal strSeparator1 As String = ";", _
Optional ByVal strSeparator2 As String = ";") As String
On Error GoTo Err_DBSelect
Dim I As Integer
Dim J As Integer
Dim R As Integer
Dim C As Integer
Dim M As Integer
Dim N As Integer
Dim rst As ADODB.Recordset
Dim fld As ADODB.Field
Dim Datas As String
Set rst = New ADODB.Recordset
' =================
' Begin With: rst
' -----------------
With rst
.Open strQuerySQL, _
CurrentProject.Connection, _
adOpenStatic, _
adLockReadOnly
If Not .BOF Then
M = .RecordCount - 1
N = .Fields.Count - 1
.MoveFirst
For R = 0 To M
For C = 0 To N
Datas = Datas & .Fields(C)
If C <> N Then
Datas = Datas & strSeparator1
End If
Next C
If Len(strSeparator2) Then
Datas = Datas & strSeparator2
End If
.MoveNext
Next R
End If
End With
' ---------------
' End With: rst
' ===============
Exit_DBSelect:
DBSelect = Datas
Exit Function
Err_DBSelect:
MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSelect)" & Chr$(13) & Chr$(13) & _
"・Err.Description=" & Err.Description & Chr$(13) & _
"・SQL Text=" & strQuerySQL, _
vbExclamation, " 関数エラーメッセージ"
Resume Exit_DBSelect
End Function
No.1
- 回答日時:
supplier: table
sup_code_sname
__________1_s1
__________2_s2
goods: table
goods_num__sup_code_gname
____________1____________1__A1
____________2____________1__A2
____________3____________2__B1
____________4____________2__B2
フォーム1:
---------------------------------
仕入先___[s1_______] <----- cmbSupplier
=================================
商品名
[__________A1] <----------- cmbGoods
---------------------------------
こういうテーブルとフォームでテストします。
コンボボックス仕入先(cmbSupplier)が更新されると、サブフォーム(フォーム2)の商品名も自動更新。
Private Sub cmbSupplier_AfterUpdate()
Me.フォーム2.Controls("cmbGoods").Requery
End Sub
書くべきコードはこれだけです。
テーブル/クエリ
値集合ソース=SELECT supplier.sup_code, supplier.sname, * FROM supplier;
値集合ソース=SELECT goods.gname, * FROM goods WHERE (((goods.sup_code)=Forms!フォーム1!cmbSupplier));
と、仕掛けるだけです。
ありがとうございました
英語表記なので
コードと名称などが混乱して理解するのに時間がかかってしまい
お返事遅くなりました すいません。
コンボ1で仕入先決定 →コンボ2 →コンボ3 →コンボ4 →コンボ5
という感じなのですが
発注書なので
コンボ5で決定後
次のレコード(帳票形式で下に続きます)に
追加で商品名がならんでいくのですが
コンボ5には
SELECT 商品マスタ.商品コード, 商品マスタ.品番, 商品マスタ.商品名, 商品マスタ.色, 商品マスタ.サイズ, 商品マスタ.商品単価, 商品マスタ.仕入先コード
FROM 商品マスタ
WHERE (((商品マスタ.商品名)=[コンボ4]) AND ((商品マスタ.仕入先コード)="コンボ1")) OR ((([コンボ4]) Is Null))
ORDER BY 商品マスタ.品番;
にしているのですが
これをどう書き換えればいいのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Access 複数条件検索の設定が上手く行きません 1 2022/07/22 20:37
- オンラインゲーム スマブラってコンボとか覚えなくても楽しいですか? なんかめんどくさそうで 1 2023/08/16 12:32
- Visual Basic(VBA) 2つ目のコンボボックスが動作しません。 3 2023/03/25 12:29
- Access(アクセス) Accessフォーム 一部のレコードだけを抽出する方法について 1 2022/06/28 18:45
- JavaScript テーブルの中のセレクトボックスの値が0のとき、非表示にしたい 3 2022/05/29 10:13
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
- JavaScript ラジオボタンによるフォームの開閉を行いたい 3 2022/03/31 21:30
- HTML・CSS HTMLのフォームについてお尋ねします 1 2022/12/03 21:47
- SQL Server DBのテーブルの設計ができず困っています。 2 2023/06/29 16:43
- Access(アクセス) Accessの参照フィールドの列がずれてしまいます 1 2023/07/19 15:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ご発注ありがとうございます...
-
中3日の意味
-
フォーキャストって何ですか?
-
見積書兼発注書の書き方
-
エクセル ①上下にタイトル行を...
-
被服の営業をしています。取引...
-
もうすぐ、職場で担当の割引セ...
-
単価単位、発注単位、発注入数...
-
スーパーやドラストでの食品な...
-
皆さん 物置はどこで購入 設置...
-
ゲームアプリで不具合が発生し...
-
大手企業のヒラと中小企業の主...
-
Access 実行時エラー’3079’が解...
-
セブンイレブンの発注で ソフト...
-
発注書をもらったのちのキャンセル
-
発注残とは何ですか?
-
土木設計で、段切りの設計について
-
IP発注
-
「お打ち合わせの件につきまし...
-
私の勤め先とその同業他社のや...
おすすめ情報