2015-09-17 27 views
0

美好的一天。我想知道爲什麼參數請求在執行查詢時彈出。我有一個2個組合框的形式,其中第二個依賴於第一個組合框的值。當涉及2個表時,我知道如何做到這一點。當有多對多的關係時,我遇到了麻煩。基於Combobox與連接表訪問2013 ComboBox

表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(使用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])); 

當它運行時,在tab鍵切換出cboSupplySource的,輸入參數值對話框彈出,尋找frmInventoryReceivedInput.cboSupplySource輸入。我輸入的任何內容都會在cboWLocation中顯示正確的列表。

顯然,我沒有正確的選擇語句。任何幫助,將不勝感激。

+0

告訴訪問'frmInventoryReceivedInput'是'Forms'集合的成員(那些目前形式打開)像這樣...'[Forms]![frmInventoryReceivedInput]![cboSupplySources]'也從這裏刪除分號:'Location_In_ID;'如果這些修改不能解決你的問題,至少你應該得到一個不同的錯誤。 ;-) – HansUp

+0

謝謝,我加了[Forms]並刪除了;。現在,沒有錯誤消息(是啊!),但在cboWLocation中仍然沒有任何信息。 –

+0

該值與WLocation_ID(pk)匹配。cboSupplySource顯示來自Supply_Sources表的SupplySourceName字段的文本,即「卡車2」。調試顯示來自Source_ID字段的相應的autonum,即1。因此,我期待在cboWLocations中顯示SupplySource_WarehouseLocation.Supply_Source_ID = 1的聯結表中的記錄(即SupplySource_WarehouseLocation.Location_In_ID)。但是我想要Warehouse_Locations中的相應文本。 Location_Name字段,例如'庫房'。 –

回答

0

對於cboWLocation嘗試記錄源查詢:

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])) 

要知道,組合框欄必須設置在這種情況下,適當的列寬列數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語句,也許你已經把「之間」的namecomparison,因爲它是一個字符串

+0

謝謝。我會盡快測試。 –

+0

當我退出cboSupplySource時,彈出菜單查找supply_sources.supply_source_id的參數值。順便提一句,我得到了HansUp的回答,(但我似乎無法這樣標記)。他的回答是SELECT sw.Supply_Source_ID,w.Location_Name FROM Warehouse_Locations AS w INNER JOIN(Supply_Source AS s INNER JOIN SupplySource_WarehouseLocation AS sw ON s.Source_ID = sw.Supply_Source_ID)ON w.WLocation_ID = sw.Location_In_ID WHERE(((sw .Supply_Source_ID)= [表格] [frmInventoryReceivedInput] [cboSupplySource]));! s,w和sw參考3個表 –

+0

好的,如果它有效的話。 – asdev