プロが教える店舗&オフィスのセキュリティ対策術

アクセスで大分類・中分類・小分類を作っています。

コンボボックスを連動させて,作成したのですが?

データー入力後,例えば中分類を変更しても,大分類や小分類がそのままで登録されてしまうのです。

それではダメですよね・・・

その部分がデータとしてあっていればいいのですが,違うければ弾いて欲しいやり方を

ご教示していただきたいのです。。。

ちなみに!

大分類に SELECT DISTINCT 配置署所 FROM ボンベ管理クエリ;

中分類に SELECT DISTINCT 署所記号番号 FROM ボンベ管理クエリ WHERE 配置署所=[大分類];


小分類に SELECT [ボンベID], [容器記号番号] FROM ボンベ管理クエリ WHERE 配置署所=[大分類] AND 署所記号番号=[中分類];


中分類と小分類には,イベントとして

Private Sub 小分類_Enter()
Me.小分類.Requery
End Sub

を書き込んでいます。

  ※ この質問をする場合のカテゴリ選択のようにしたいのです・・・・

ぜひどうかよろしくお願いします。

A 回答 (2件)

そのフォームは単票でしょうか。


帳票なら以下の方法ではできません(コントロールを重ねないと不可能だと思います。)

現状のフォームをコピーし、コピーした方で動作確認してみます。
レコードが更新されても良いようにバックアップは取っておきます。

コピーした方のフォームに記述してあるイベント関係のものをすべて削除し、
以下の記述と置き換えてみます。

Private Function EnterCheck()
  Dim vN As Variant
  Dim i As Long, j As Long

  vN = Array("大分類", "中分類", "小分類")
  For i = LBound(vN) To UBound(vN)
    If (Me.ActiveControl Is Me(vN(i))) Then
      For j = LBound(vN) To i - 1
        If (IsNull(Me(vN(j)))) Then
          Me(vN(j)).SetFocus
          Exit Function
        End If
      Next
      Exit For
    End If
  Next
  With Me.ActiveControl
    .Requery
    .Dropdown
  End With
End Function

Private Function UpdateCheck()
  Dim vN As Variant
  Dim i As Long, j As Long

  vN = Array("大分類", "中分類", "小分類")
  For i = LBound(vN) To UBound(vN)
    If (Me.ActiveControl Is Me(vN(i))) Then
      For j = i + 1 To UBound(vN)
        Me(vN(j)) = Null
      Next
      If (i <> UBound(vN)) Then
        Me(vN(i + 1)).SetFocus
        Exit Function
      End If
      Exit For
    End If
  Next
End Function

Private Sub Form_Load()
  Dim vN As Variant
  Dim i As Long

  vN = Array("大分類", "中分類", "小分類")
  For i = LBound(vN) To UBound(vN)
    With Me(vN(i))
      .ValidationRule = "Is Not Null"
      .OnEnter = "=EnterCheck()"
      .AfterUpdate = "=UpdateCheck()"
    End With
  Next
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
  If (IsNull(Me.小分類)) Then Cancel = True
End Sub


※※ 操作は、必ず "大分類" → "中分類" → "小分類" の順であるとします。

※ Enter 時の動き
どのコンボボックスの Enter でも同じ処理を走ります。
まず、Enter になったのは「誰」を求めます。
求まったら、前操作のコンボボックスが入力されているか確認します。
値が設定されていなければ、そのコンボボックスにフォーカスを移動します。
値が設定されていれば、 Requery 後 Dropdown 表示します。

※ AfterUpdate 時の動き
どのコンボボックスの AfterUpdate でも同じ処理を走ります。
まず、AfterUpdate になったのは「誰」を求めます。
求まったら、後操作のコンボボックス値を Null に変更します。
次のコンボボックスにフォーカスを移動します。

※ フォームのオープン時
各コンボボックスに上記関数を実行する様、イベントに設定していきます。
また、入力規則に念のため Is Not Null を設定しておきます。
既に値が設定されていて、Delキー 等で削除された場合エラーとなるように・・・

※ フォームの更新前処理
コンボボックスは、必ず "大分類" → "中分類" → "小分類" の順と決めたので、
最後の Me.小分類 が Null なら Cancel = True として、更新を拒否します。

※ コンボボックス3つの処理をまとめましたが、個別に記述しても良いと思います。


※※ 検証等は十分に行ってください。また、不具合等あれば修正してください。
    • good
    • 0
この回答へのお礼

ありがとうございます。とても参考になりました。すべての問題が解消したような気がします。
 ご親切にありがとうございました。

お礼日時:2013/03/13 13:35

中分類、小分類ではなく、



大分類のChangeイベントあたりで中分類をリセット。
中分類のChangeイベントあたりで小分類をリセット。


ではないでしょうか。
但し、Changeイベントは、同一値を選択した場合にも
発生するようなので、無駄なリセットがされないように
工夫は必要でしょう。
    • good
    • 0
この回答へのお礼

ありがとうございます。参考にしたいとおもいます。

お礼日時:2013/03/13 13:37

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

関連するカテゴリからQ&Aを探す