2013-09-25 46 views
0

我正在使用存儲地址的Access 2010中的數據庫。我仔細設計了這些表格,以便我可以分別存儲一個人和一個地址,然後通過另外兩個表格關聯他們(人員之間的關係也需要與他們的地址分開存放)。如何顯示子窗體中的所有記錄除了Access 2010中沒有VBA的主窗體中顯示的記錄?

我有如下表(此問題,重點是PERSONRELATIONSHIP):

PERSON   RELATIONSHIP   ADDR_REL    ADDR 
    ------------  ------------   -----------   ----------- 
(PK)PERSON_ID  (FK)PERSON_ID   (FK)RELATIONSHIP_ID (PK)ADDR_ID 
    FIRST   (K)RELATIONSHIP_ID (FK)ADDR_ID    ADDR_LINE1 
    LAST    RELATIONSHIP_TYPE (PK)ADDR_REL_ID   ADDR_LINE1 
        (PK)REL_PK          ... 

不使用VBA(如果可能),我希望能夠在顯示給定PERSON一個窗體,並有一個子窗體,它在匹配RELATIONSHIP中顯示其他PERSON s,但在子窗體結果集中不顯示原始PERSON(無論哪條記錄顯示在父窗體中)。

FYI:我能夠在VBA建立一個解決方案,這一點我自己,但它只是好像他們奧特是退出這個功能沒有它的方式。

我試過隱藏的字段,鏈接的子表單和自定義查詢,但我總是以關係中顯示的子表單中的所有人(或根本沒有結果或參數提示)結束。沒有編寫代碼,真的沒有辦法打敗它嗎?

回答

1

設置子窗體的記錄源以包括在除主窗體上顯示的記錄的關係的所有行。我不太確定定義「匹配關係」的邏輯是什麼樣的,但我已經在下面做了一個猜測:(這是一個查詢,但是爲了理解目的我已經打斷了一些評論 - 刪除了意見使用它)

'get all persons in a given relationship 
SELECT p.Person_ID, First, Last 
FROM Person p INNER JOIN Relationship r ON p.Person_ID = r.Person_ID 

'define given relationship 
WHERE Relationship_ID = (
    SELECT Relationship_ID FROM Relationship 
    WHERE Person_ID = Forms(nameOfYourMainForm)!nameOfTextboxInMainFormContainingPersonID) 

'and the person isnt the person displayed on the main form: 
AND p.Person_ID <> Forms(nameOfYourMainForm)!nameOfTextboxInMainFormContainingPersonID; 
+0

'RELATIONSHIP'只是一個帶有'PERSON_ID'和'RELATIONSHIP_ID'的行,並且一個關係的成員通過匹配其常見的'RELATIONSHIP_ID'來確定。 (我包含一個REL_PK作爲唯一標識符,但它可能是不確定的)。因此,在您的解決方案中,我需要將SQL直接輸入到RecordSource字段中;我不用它構建查詢,然後選擇它;正確?這是我沒有嘗試過的。 – 4AM

+0

是的,這就是我的意思 –

+0

我在摸索着試圖讓這個工作,我終於意識到我仍然有主子字段鏈接,除了我的查詢已經過濾掉的確切條件之外的任何東西都被過濾掉了。很容易在Access中犯下愚蠢的錯誤!感謝您的幫助! – 4AM

1

是的。自從我使用Access以來已經有一段時間了。這聽起來像你曾經非常親密。

首先創建您的主/主表單。然後創建你的子表單/細節表單。只需將詳細信息表單拖放到主表格上,如果您的關係正確,它會自動爲您設置父/子關係。

一旦你的父/子關係設置,那麼您修改窗體/細節窗體的記錄源的信息。如果它基於一個表,然後將其更改爲查詢。這可以在表單設計視圖中完成。

簡單的答案是,在查詢生成器可以隱藏字段。在你的情況下,可能你想隱藏子窗體中的Person_ID字段。

查詢必須包含的重點領域,因此父子關係被保留。

此外,如果你的子窗體是一個帶有文本框的窗體,你也可以刪除你不想看到的文本框。

所以正確的答案是肯定的,但是我解釋了它足以讓你理解嗎?

相關問題