Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access MS Access 2007:筛选组合框的选择列表_Ms Access_Combobox_Ms Access 2007 - Fatal编程技术网

Ms access MS Access 2007:筛选组合框的选择列表

Ms access MS Access 2007:筛选组合框的选择列表,ms-access,combobox,ms-access-2007,Ms Access,Combobox,Ms Access 2007,背景:我的表单的记录源是一个查询(“BigQuery”),它只是组合了几个相关的表。我正在设置组合框来编辑字段;这些组合框的控制源始终只是BigQuery中的一个字段。其中一个字段是UnitType,另一个字段是UnitSubType。UnitSubType大约有100个不同的条目,但当与特定的UnitType配对时,其中许多条目没有上下文意义:如果UnitType=“Car”,那么UnitSubType=“18 wheeler”就没有意义,我宁愿不给客户犯错的机会 问题,A部分:当用户在表单上

背景:我的表单的记录源是一个查询(“BigQuery”),它只是组合了几个相关的表。我正在设置组合框来编辑字段;这些组合框的控制源始终只是BigQuery中的一个字段。其中一个字段是UnitType,另一个字段是UnitSubType。UnitSubType大约有100个不同的条目,但当与特定的UnitType配对时,其中许多条目没有上下文意义:如果UnitType=“Car”,那么UnitSubType=“18 wheeler”就没有意义,我宁愿不给客户犯错的机会

问题,A部分:当用户在表单上选择UnitType的值时,我想将UnitSubType的组合框限制为那些已经与数据库中的UnitType值配对的UnitSubType值。这是怎么做到的

示例:如果表中已存在一个或多个包含UnitType=“truck”和“UnitSubType=“18 wheeler”的记录实例,则假设用户已在UnitType组合框中选择了“truck”,UnitSubType组合框中显示的选项之一应为“18 wheeler”

问题,B部分:我还希望用户能够通过在组合框中键入一个新的UnitSubType来添加它:如果用户已经在UnitType的组合框中选择了“truck”,并在UnitSubType的组合框中手动键入了“flatbed”,那么编辑的记录应该是“flatbed”当UnitType为“truck”时,UnitSubType和未来的编辑操作应将“flatbed”作为UnitSubType选项。在更简单的情况下,将“允许值列表编辑”设置为“是”可以解决此问题,但我想确保在为问题A部分提供的解决方案中可以使用此功能

在SO中已经有类似的问题线索,但我是一个在访问方面的noob,以至于我无法推断出符合我需要的答案。我很抱歉;请尽量具体

非常感谢你!
Dave

我找到了一个我想分享的解决方案。访问很难描述,但我将列出规范的例外情况,并尝试以这种方式传达解决方案

用于拾取单位类型的第一个(主)组合框:

  • 名称:CBUnitType
  • ControlSource:UnitType'''主表中的字段:MainTbl
  • 行源:

    SELECT DISTINCT MainTbl.UnitType
    FROM MainTbl
    ORDER BY MainTbl.UnitType;
    
  • 绑定列:1

  • 允许值列表编辑:是
  • 没有
  • 更新后:[事件过程]''请参阅子例程:ComboBoxUnitType_AfterUpdate(),如下所示
用于拾取单元子类型的第二个(相关)组合框:

  • 名称:CBUnitSubType
  • ControlSource:UnitSubType'''主表中的字段:MainTbl
  • 行源:ComboQueryUnits子类型''',由查询生成器生成,详细信息如下
  • 绑定列:1
  • 允许值列表编辑:是
  • 没有
查询生成器对象:ComboQueryUnitSubType

SELECT DISTINCT [MainTbl].UnitSubType
FROM [MainTbl]
WHERE ((([MainTbl].UnitType)=[Forms]![Unit Editor]![UnitType]))
ORDER BY [MainTbl].UnitSubType;
通过在上述组合框“CBUnitType”中为更新后事件选择“[Event Procedure]”来创建VBA子例程。VBA子例程自动放置在VBA环境中名为“Form_Unit Editor”的模块中的Microsoft Office Access Class Objects文件夹中。子例程名称也预先选择为:ComboBoxUnitType_AfterUpdate()“几乎可以肯定,如果您更改其中任何一个名称,链接将严重中断。模块中的VBA代码为:

Option Compare Database
Option Explicit

Private Sub ComboBoxUnitType_AfterUpdate()
    Forms![Unit Editor]![ComboBoxUnitSubType].Requery
    Forms![Unit Editor]![ComboBoxUnitSubType].Value = ""
End Sub
因此,其效果是:用户更新Unit Type组合框后,vba例程执行并重新查询Unit SubType组合框的查询,然后它任意获取Unit SubType组合框的.value参数并将其清除为空字符串

我要感谢提供的大量教程。具体来说,重新查询组合框查询的VBA代码是一个救命稻草,在他们的教程中详细介绍了为什么每次选择组合框时,Access不会自动重新运行指定为组合框行源的查询组合QueryUnitSubtype用户的ted是任何人的猜测

我为冗长的问题和答案感到抱歉。我希望在不久的将来回到一些好的、简洁的代码! 戴夫