4

Access 2010 にはテーブルがTaskありAction、 table を介して多対多の関係がありますActionTask。のフォームに、ジャンクション テーブルを介して現在のタスクに関連するTaskすべての のサブフォームを配置したいと考えています。ActionActionTask

これ自体は、私ができることです。

秘訣は、それActionが実際にはテーブルの 4 層階層の最下位であるということです。それぞれActionが に属しGoal、それぞれがGoalに属しTheme、それぞれがThemeに属しStrategyます。

コンボ ボックスに利用可能なすべての をリストするだけではなく、 / / /Actionにカスケード コンボ ボックスを使用したいと考えています。StrategyThemeGoalAction

これは私にもできます。

問題は、データシートでこの手法を使用する場合です。特定の行を選択すると、選択した行には適切なStrategy/ Theme/ Goal/Actionが表示されますが、他のすべての行では

  • Action空白です
  • Strategy/ Theme/は、Goalその行の値ではなく、現在の行の値に設定されます

データシート ビューで 1 行を選択する データシート ビューで別の行を選択する

「データシート」ビューではなく「連続フォーム」ビューを使用してみましたが、結果はほとんど同じです。

連続フォーム ビューで 1 行を選択する 連続フォーム ビューで別の行を選択する

理由(コールバックの内容)はわかっていると思いますMe.StrategyCombo = ...Form_Current、それを達成する別の方法はわかりません。

サブフォームにすべての行を正しく表示させるにはどうすればよいですか?


Access ファイルは次のとおりですが、関連するすべての詳細は以下のとおりです。

Tables:
  Strategy   : (ID, Desc)
  Theme      : (ID, StrategyID, Desc)
  Goal       : (ID, ThemeID, Desc)
  Action     : (ID, GoalID, Desc)
  Task       : (ID, Desc, ...)
  ActionTask : (ActionID, TaskID)

Form Settings:

  [Forms]![Task]![ActionTaskSub]:
    Link Master Fields: ID
    Link Child Fields : TaskID

  [Forms]![Task]![ActionTaskSub].[Form]:
    On Current:
      Private Sub Form_Current()
          ' when the form loads a record, should reverse propegate
          ' action > goal > theme > strategy
          Dim goalID, themeID, strategyID

          ' figure out the goal, theme, and strategy that go with this action
          If (Me.ActionID) Then
            goalID = DLookup("[GoalID]", "Action", "[ID] = " & CStr(Me.ActionID))
            themeID = DLookup("[ThemeID]", "Goal", "[ID] = " & CStr(goalID))
            strategyID = DLookup("[StrategyID]", "Theme", "[ID] = " & CStr(themeID))
          End if

          ' populate the combo boxes and make the appropriate selections
          Me.StrategyCombo = strategyID
          Me.ThemeCombo.Requery
          Me.ThemeCombo = themeID
          Me.GoalCombo.Requery
          Me.GoalCombo = goalID
          Me.ActionCombo.Requery
          Me.ActionCombo = Me.ActionID
      End Sub

  [Forms]![Task]![ActionTaskSub].[Form]![StrategyCombo]:
    Row Source  : SELECT [Strategy].[ID], [Strategy].[Desc] FROM [Strategy];
    After Update:
      Private Sub StrategyCombo_AfterUpdate()
          Me.ThemeCombo = Null
          Me.ThemeCombo.Requery
          Call ThemeCombo_AfterUpdate
      End Sub

  [Forms]![Task]![ActionTaskSub].[Form]![ThemeCombo]:
    Row Source  : SELECT [Theme].[ID], [Theme].[Desc] FROM [Theme] WHERE 
                  [Theme].[StrategyID] = [Forms]![Task]![ActionTaskSub].[Form]![StrategyCombo];
    After Update:
      Private Sub ThemeCombo_AfterUpdate()
          Me.GoalCombo = Null
          Me.GoalCombo.Requery
          Call GoalCombo_AfterUpdate
      End Sub

  [Forms]![Task]![ActionTaskSub].[Form]![GoalCombo]:
    Row Source  : SELECT [Goal].[ID], [Goal].[Desc] FROM [Goal] WHERE 
                  [Goal].[ThemeID] = [Forms]![Task]![ActionTaskSub].[Form]![ThemeCombo];
    After Update:
      Private Sub GoalCombo_AfterUpdate()
          Me.ActionCombo = Null
          Me.ActionCombo.Requery
      End Sub

  [Forms]![Task]![ActionTaskSub].[Form]![ActionCombo]:
    Row Source  : SELECT [Action].[ID], [Action].[Desc] FROM [Action] WHERE 
                  [Action].[GoalID] = [Forms]![Task]![ActionTaskSub].[Form]![GoalCombo];
4

3 に答える 3

2

できません。すべてのアクションはサブフォームの現在のレコードに適用されますが、すべてのコントロールに影響を与えるように見えます。さまざまな回避策があります。

于 2012-11-24T13:59:50.973 に答える
2

私の知る限りではできませんが、連続フォームを作成し、フィールドを表形式のレイアウトにしてから、各コンボボックスにテキストボックスを追加することで回避できます (フィールドが prodID の場合、テキストボックスに txtprodID という名前を付けます)。テキストボックスをコンボボックスの真上に移動しますが、少し狭くして、コンボリストの矢印の少し後ろに置き、テキストボックスを更新するコードを記述します。

于 2015-02-04T01:46:59.013 に答える