访问基于Combobox和连接表的2013 ComboBox

时间:2015-09-17 17:26:41

标签: combobox many-to-many ms-access-2013

美好的一天。我想知道为什么在执行查询时弹出参数请求。我有一个带有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; 

我试图根据cboSupplySource中的值在cboWLocation中获取一个下拉列表。我想查看耗材放置在仓库中的位置名称。

我在更新后的cboSupplySource中有一个requery(以cboWLocation作为控件名称)。我到目前为止提出的SQL是:

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

运行时,弹出cboSupplySource,弹出输入参数值对话框,查找frmInventoryReceivedInput.cboSupplySource输入。我输入的任何内容都没有在cboWLocation中显示正确的列表。

显然,我没有正确的select语句。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

对于cboWLocation,请尝试使用recordSource查询:

SELECT 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 ((Supply_Sources.SupplySourceName)=([Forms]![frmInventoryReceivedInput].[cboSupplySource]))

请注意,在这种情况下,组合框列必须设置为columncount 1,并且具有适当的列宽,因为您说您只想查看位置名称。此外,您应该确保cboWLocation未绑定到控件源,以便不覆盖任何内容。

您可以在cboWLocation Enter Event中将其应用于VBA。 在以下代码示例中,如果combobox cboSupplySource中存在值,则仅更新组合框cboWLocation。

Private Sub cboWLocation_Enter()
    If not (isNull(Me!cboSupplySource) Or Me!cboSupplySource.ListIndex = -1) then
        Me.cboWLocation.RowSource = strSQL 'Put here the previous mentioned SQLString
    End if    
End Sub

提示:当您将cboSupplySource中的绑定列更改为PK SourceID而不是名称时,性能会更好。 (在combobox cboSupplySource中有两列)然后使用此PK来比较WHERE语句而不是名称。这就是表格中的关键词。

编辑:在WHERE语句中,您可能必须将名称比较放在'之间。 '因为它是一个字符串