電子書籍の厳選無料作品が豊富!

こんにちは アクセス2000で発注書を作っています
ど素人です。。

コンボボックスの絞りこみについて教えてください。
現在5つのコンボで絞込みをしています
コンボ1仕入先(メインフォーム)
コンボ2種類1(サブフォーム)
コンボ3種類2(サブフォーム)
コンボ4商品名(サブフォーム)
コンボ5詳細(サブフォーム)

です。
コンボ1は一度選択すると、変更はありません。
コンボ5で選択決定した後、コンボ2、コンボ3、コンボ4は空白に、
コンボ5は全表示に設定しているのですが
それだとコンボ1で選択した仕入先以外の商品も入ってしまうので
コンボ5に、コンボ1で仕入れた商品のみを全表示したい場合は
どうしたらいいですか?

説明下手で申し訳ありませんが
どなかたご教授の程よろしくお願いいたします

A 回答 (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'か空でも入力されたら商品選択のためのフォームをオープンするだけ!
    • good
    • 0
この回答へのお礼

いつも丁寧にご回答くださり、ありがとうございます

質問のお答えですが
こちらは私が担当しないのでどう処理するか?ですが
多分1になるかと思われます。

また、〔発注明細クエリ〕も元々作成されてたのですが
帳票フォームでやりたいことと
どうしても結びつかないことがおきて
不具合が多すぎて 外しました。

今回いろいろなアドバイスをいただき、
改めてシステムを見直すいいきっかけになりました。

質問の内容は
値集合ソースを書き換えることで
解決することができましたので
これで、質問を終了させていただきます。

WHERE (((商品.商品名)=[商品名コンボ]) AND ((商品.仕入先コード)=[forms]![発注書]![仕入先コードコンボ])) OR ((([商品名コンボ]) Is Null))

WHERE (((商品.商品名)=[商品名コンボ] or [商品名コンボ]) Is Null) AND ((商品.仕入先コード)=[forms]![発注書]![仕入先コードコンボ])))

本当にありがとうございました

お礼日時:2008/12/10 13:07

本格的回答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社〕____〔山田五郎〕

補足日時:2008/12/09 15:45
    • good
    • 0
この回答へのお礼

こんな感じです

発注書:メインフォーム
〔発注書番号〕〔日付〕{仕入先コードコンボ}〔仕入先名〕〔担当者名〕〔以下省略〕
発注書明細:サブフォーム
●ヘッダー
{種類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 商品.品番;

お礼日時:2008/12/09 15:48

本格的回答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


以上です。
特殊な業種なので分かりやすいようにアパレルにしてみました

コンボボックスは上からの命令&現時点で一応完成しているものなので
使用不可にすることはできません。
品番コンボでダイレクトに品番をタイプすることも多いのですが
仕入先によっては商品数が少ないものもあり、
品番コンボでダイレクトに選べると便利なときもあるのと
他の仕入先が混ざってしまうと発注ミスなどが起こるとこまるので
品番コンボに メインフォームで選択した仕入先の商品一覧が
並ぶといいなあと思ったしだいです。

 

補足日時:2008/12/09 15:48
    • good
    • 0

帳票タイプのコンボボックスですと、一つの行のロウソースを変更すると全てに反映しますよね。


そうなると、矛盾した行も出てきますよね。
ですから、この矛盾を回避するには、商品選択フォームなどをオープンしてターゲットを特定。
商品選択フォームを閉じる時に各行に必要なデータを書き込むのが普通。

※ロウソースと各行の値との矛盾が許される設計ですか?
    • good
    • 0
この回答へのお礼

何度も本当にありがとうございます
感謝いたします
仕事が来週までお休みになったので
検証ができず、来週あらためてお返事させていただきます
ありがとうございます!!

お礼日時:2008/12/05 12:08

更に言えば、商品名と商品コードとをなぜ絞り込む必要があるのか?



-------------------------------------
[商品コード][品名・品番______]
[S001______][シューズ型番S001]

かように、既定の品名・品番を表示しアレンジも可はありえるでしょう。
でも、この場合は、コンボボックスではないですよね。

この回答への補足

度々ありがとうございます。
同じ商品コードが無数にあり、
最後に色や、形状などを選択するのです
かなりの商品数で既に管理されているテーブルなので
大まかなことは変えることができないのです。。

補足日時:2008/12/04 16:37
    • good
    • 0

× コンボ5に、コンボ1で仕入れた商品のみを全表示したい場合はどうしたらいいですか?


○ コンボ5に、コンボ4で確定した商品の詳細情報を表示するにはどうしたらいいですか?

完全に質問文を読み違っていました。

>コンボボックスの絞りこみについて教えてください。

絞り込むことなんてありえないでしょう。
ただただ、参照するだけですね。

そうではないのですか?

この回答への補足

こんにちは
>絞り込むことなんてありえないでしょう。

ネットでコンボボックスについて いろいろ調べていたら
複数のこんぼで検索する場合、「コンボボックスでの絞込み」と
いうキーワードが多かったので使わせていただきました。

仕入先の数と
商品の数がとても多いので
コンボボックスで 数段階にわけて選択しています。
でも、この段階を踏まずに
ダイレクトにコンボ5で商品を探したいときもあるので
全表示にしていたのですが
他の仕入先が入るので
質問させていただきました。

補足日時:2008/12/04 16:29
    • good
    • 0

別解:



コンボボックス仕入先(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
    • good
    • 0

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));

と、仕掛けるだけです。

この回答への補足

ありがとうございます
試してみてまた報告します!!

補足日時:2008/12/03 17:03
    • good
    • 0
この回答へのお礼

ありがとうございました
英語表記なので 
コードと名称などが混乱して理解するのに時間がかかってしまい
お返事遅くなりました すいません。

コンボ1で仕入先決定 →コンボ2 →コンボ3 →コンボ4 →コンボ5
という感じなのですが
発注書なので
コンボ5で決定後
次のレコード(帳票形式で下に続きます)に
追加で商品名がならんでいくのですが
コンボ5には

SELECT 商品マスタ.商品コード, 商品マスタ.品番, 商品マスタ.商品名, 商品マスタ.色, 商品マスタ.サイズ, 商品マスタ.商品単価, 商品マスタ.仕入先コード
FROM 商品マスタ
WHERE (((商品マスタ.商品名)=[コンボ4]) AND ((商品マスタ.仕入先コード)="コンボ1")) OR ((([コンボ4]) Is Null))
ORDER BY 商品マスタ.品番;

にしているのですが
これをどう書き換えればいいのでしょうか?

お礼日時:2008/12/04 10:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!