4

在 Access 2010 中,我有表Task,并且Action通过 table 具有多对多关系ActionTask。在 for 的表单中Task,我想通过联结表Action为与当前任务相关的所有 s放置一个子表单。ActionTask

这本身,我可以做到。

诀窍是这Action实际上是四层表层次结构的底层。每个Action属于一个Goal,每个Goal属于一个Theme,每个Theme属于一个Strategy

Action我想为Strategy/ Theme/ Goal/使用级联组合框,而不仅仅是一个列出所有可用s 的组合框Action

这个我也可以。

问题是当我在数据表中使用此技术时,如果我选择给定行,则所选行显示正确的Strategy// Theme/ GoalAction但在所有其他行中

  • Action空白的
  • Strategy//设置为当前行的值,而不是该行的ThemeGoal

在数据表视图中选择一行 在数据表视图中选择另一行

我尝试使用“连续表单”视图而不是“数据表”视图,但结果几乎相同。

在连续表单视图中选择一行 在连续表单视图中选择另一行

我想我知道为什么(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

4

我解决了数据表中依赖(级联)组合框的问题。从本质上讲,如果组合框 1 依赖于组合框 2 中的值,它会将当前行中的“行源”应用于数据表中的所有行

解决方案:

1 在加载或设计器中,定义行源以包含所有行,以便其后面的数据值始终与行源中的选项匹配(否则显示空白值)

IE:

Private Sub Form_Load()
    Me.cmbProjects.RowSource = "SELECT [Projects].[ProjectPK],  [Projects].[ProjectName], [Projects].[PI_ID] FROM [Projects]  ORDER BY  [ProjectName] "
End Sub

2 在从属组合框获取焦点事件中,将行源重新定义为基于前者所依赖的另一个组合框的值。重新查询控件

Private Sub cmbProjects_GotFocus()
Me.cmbProjects.RowSource = "SELECT [Projects].[ProjectPK],  [Projects].[ProjectName], [Projects].[PI_ID],  [Projects].[Status] FROM [Projects]  WHERE [PI_ID] = " + CStr(cmbPIs.Value) + " ORDER BY [PI_ID], [ProjectName] "
cmbProjects.Requery
End Sub

3 在从属组合框失去焦点事件中,将行源重新定义为不基于前者所依赖的另一个组合框的值。

Private Sub cmbProjects_LostFocus()
Me.cmbProjects.RowSource = "SELECT [Projects].[ProjectPK],  [Projects].[ProjectName], [Projects].[PI_ID],  [Projects].[Status] FROM [Projects]  ORDER BY [PI_ID], [ProjectName] "
cmbProjects.Requery
End Sub
于 2018-07-26T13:12:05.127 回答
2

你不能。任何操作都适用于子表单当前记录,但似乎会影响所有控件。有各种变通方法。

于 2012-11-24T13:59:50.973 回答
2

据我所知你不能,但你可以通过创建一个连续的表单来解决它,将你的字段放在表格布局中,然后为每个组合框添加一个文本框(如果字段是 prodID,那么我将文本框命名为 txtprodID)。将文本框向右移动到组合框的顶部,但稍微窄一点,就在组合列表箭头附近,然后编写代码来更新文本框。

于 2015-02-04T01:46:59.013 回答