0

我正在使用 Access 2010 中存储地址的数据库。我仔细设计了这些表,以便我可以分别存储一个人和一个地址,然后通过另外两个表将它们关联起来(人们之间的关系也必须与他们的地址分开存储)。

我有以下表格(对于这个问题,重点是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的内容,并有一个子表单显示匹配中的其他 s ,但不显示原始文件(父表单中显示的任何记录)在子表单结果集中。PERSONRELATIONSHIPPERSON

仅供参考:我自己可以在 VBA 中构建一个解决方案,但他们似乎只是在没有它的情况下解决这个问题。

我已经尝试过隐藏字段、链接子表单和自定义查询,但我总是以关系中的所有人都显示在子表单中(或者根本没有结果,或参数提示)。不写代码真的没有办法打败它吗?

4

2 回答 2

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;
于 2013-09-25T03:33:07.327 回答
1

就在这里。自从我使用 Access 以来已经有一段时间了。听起来你曾经非常接近。

您首先创建您的主/主表单。然后创建您的子表单/详细信息表单。只需将详细信息表单拖到主表单上,如果您的关系正确,它将自动为您设置父/子关系。

设置父/子关系后,您可以修改子表单/详细信息表单的记录源信息。如果它基于表,则将其更改为查询。这可以在表单设计视图中完成。

简单的答案是,在查询生成器中,您可以隐藏字段。在您的情况下,您可能想隐藏子表单中的 Person_ID 字段。

查询必须包含关键字段,以便保留父子关系。

此外,如果您的子表单是带有文本框的表单,您也可以删除不希望显示的文本框。

所以正确的答案是肯定的,但是我解释得够不够让你理解?

于 2013-09-25T04:03:35.650 回答