【问题标题】:Access 2013 ComboBox value based on other ComboBox with Junction Table基于其他带有连接表的 ComboBox 访问 2013 ComboBox 值
【发布时间】:2015-09-23 19:22:01
【问题描述】:

美好的一天。这是对上一个问题的跟进。我有一个带有 2 个组合框的表单,其中第 2 个组合框取决于第一个组合框的值。我有在第二个组合框中显示下拉列表的代码,但除了第一个条目之外我无法选择任何内容。
表 1:名称 - Supply_Sources、字段 - Source_ID(pk)、SupplySourceName

表 2:名称 - Warehouse_Locations,字段 - WLocation_ID(pk),Location_Name

表 3(连接点):名称 - SupplySource_WarehouseLocation,字段 - Supply_Source_ID(pk),Location_In_ID(pk)

在我的表单“frmInventoryReceivedInput”上,我有 cboSupplySource 和 cboWLocation。我用

填充 cboSupplySource
    SELECT [Supply_Sources].[Source_ID], [Supply_Sources].[SupplySourceName] 
    FROM Supply_Sources; 

cboWLocation 的 SQL 是:

    SELECT SupplySource_WarehouseLocation.Supply_Source_ID,
    Warehouse_Locations.Location_Name FROM Warehouse_Locations 
    INNER JOIN (Supply_Sources INNER JOIN SupplySource_WarehouseLocation
     ON Supply_Sources.Source_ID = SupplySource_WarehouseLocation.Supply_Source_ID) 
    ON Warehouse_Locations.WLocation_ID =  SupplySource_WarehouseLocation.Location_In_ID 
    WHERE ((( SupplySource_WarehouseLocation.Supply_Source_ID)=
    [forms]![frmInventoryReceivedInput]![cboSupplySource]));

cboWLocation 下拉列表中有 3 个选项供我选择(基于 cboSupplySource)。但是,我选择哪个并不重要,它默认为第一个。我需要做什么才能选择其他选项?

【问题讨论】:

  • ON Supply_Sources.Source_ID = SupplySource_WarehouseLocation.Supply_Source_ID?
  • 当 cboSupplySource 的值发生变化时,您是否正在更新 cboWLocation?不确定是什么问题,第二个 cbo 没有更新或不允许您选择列表中的第二个项目?
  • 这是一个错字 - 编码中有一个“=”。我有一个附加到 cboSupplySource 的重新查询,以便在发生更改时更新 cboWLocation。是的,第二个 cbo 不允许选择列表中的第一项以外的任何内容。
  • 第二个 cbo 在被选中后是否在做其他事情,或者其他任何事情会影响第二个 cbo?当您更改第一个 cbo 时,第二个 cbo 更新好吗?第二个 cbo 是否会下降,以便您确认它正在按照您期望的方式更新?
  • 只是为了让您知道我创建了一个包含 2 个具有简单一对多关系的 cbo 的新表单,并且我能够选择 cbo2 下拉列表中的任何项目。我对 m-m 进行了同样的尝试,但仍然存在相同的原始问题,即即使我在下拉列表中选择项目 2 或 3,也只允许项目 1。在这种情况下,根本没有 VBA 代码 - 只是表单中的 SQL。所以,我的访问不喜欢 SQL 中的某些内容。令人沮丧!

标签: sql ms-access combobox


【解决方案1】:

我重新创建了它,它工作正常,唯一不同的是我用 SQL 创建了一个查询:

    SELECT 
SupplySource_WarehouseLocation.Supply_Source_ID, Warehouse_Locations.Location_Name
    FROM 
Warehouse_Locations INNER JOIN 
(Supply_Sources INNER JOIN 
SupplySource_WarehouseLocation ON 
Supply_Sources.Source_ID = SupplySource_WarehouseLocation.Supply_Source_ID) ON 
Warehouse_Locations.WLocation_ID = SupplySource_WarehouseLocation.Location_In_ID
    WHERE 
(((SupplySource_WarehouseLocation.Supply_Source_ID)=
[forms]![frmInventoryReceivedInput]![cboSupplySource]));

所以我可以与 UI 分开检查该部分。

对于 cboWLocation,我有 column widths0";1"、rowSourceqry_cbo2 和 bound column 2。尝试将绑定列从 1 更改为 2,看看是否有帮助。

-贝丝

【讨论】:

  • 晚安,贝丝。我插入了您的 qry_cbo2,并且确实将绑定列更改为 2。正如预期的那样,我能够从 cbo2 下拉列表中选择不同的项目,该列表取决于 cbo1。我添加了以下代码: Private Sub cboWLocation_AfterUpdate() MsgBox "You selected " & Me.cboSupplySource.Column(1) & " value in Placed where is " & Me.cboWLocation.Column(1) End Sub
  • ...我的评论的其余部分:cboWLocation 返回(作为文本)我选择的位置。我想从第 1 列获取 ID(pk)#。当我使用 .column(0) 时,它返回 cbo1 的 ID(pk)#,不管 cbo2。还有其他想法吗?
  • 是的,使用 cbo 的 .value 属性,这将返回绑定的列。 .text 值应返回文本框中的条目。
  • 好的,我错过了一些东西。第 2 列绑定到 cbo2(即 cboWLocation)。如果我选择 cbo2 = 'garbage',它是 cbo2 下拉列表中的第 2 项,并且具有 35 的唯一自动编号(在第 1 列中),我会得到以下信息: msgbox cbo2 返回“垃圾”; msgbox cbo2.value 返回“垃圾”; msgbox cbo2.text 返回“错误 2185 除非控件具有焦点,否则您不能引用控件的属性或方法。”我误解了你最后的建议吗?我想让 msgbox cbo2 返回“35”(代表“垃圾”),即第 1 列中的数字。或者我应该只为那个数字做一个 DLookup?
  • 抱歉,请尝试使用 itemdata(cbo.listindex) 属性,例如 here
猜你喜欢
  • 2011-10-09
  • 2013-05-11
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 2012-06-04
  • 1970-01-01
相关资源
最近更新 更多