【问题标题】:How do I display all records in a subform EXCEPT the one being displayed in the main form in Access 2010 without VBA?如何在子表单中显示所有记录,除了在没有 VBA 的 Access 2010 的主表单中显示的记录?
【发布时间】:2013-09-25 12:03:35
【问题描述】:

我正在使用 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,并有一个显示 other @ 的子表单987654325@s 在匹配的RELATIONSHIP 中,但不在子表单结果集中显示原始PERSON(父表单中显示的任何记录)。

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

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

【问题讨论】:

    标签: sql ms-access-2010 jet


    【解决方案1】:

    设置子窗体的记录源以包括关系中的所有行,但主窗体上显示的记录除外。我不太确定定义“匹配关系”的逻辑是什么样的,但我在下面进行了猜测:(这只是一个查询,但为了理解目的,我已经用 cmets 将其分解了一些 - 删除cmets 使用它)

    '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;
    

    【讨论】:

    • RELATIONSHIP 只是一个带有PERSON_IDRELATIONSHIP_ID 的行,关系的成员是通过匹配它们共同的RELATIONSHIP_ID 来确定的。 (我包含了一个 REL_PK 作为唯一标识符,但它可能是不必要的)。所以,使用您的解决方案,我需要将 SQL 直接输入到 RecordSource 字段中;我不使用它构建查询然后选择它;正确的?这是我没有尝试过的。
    • 是的,我就是这个意思
    • 我挠头试图让它工作,我终于意识到我仍然链接了主字段和子字段,这过滤掉了除了我的查询已经过滤掉的确切条件之外的任何东西。在 Access 中很容易犯愚蠢的错误!感谢您的帮助!
    【解决方案2】:

    是的,有。自从我使用 Access 以来已经有一段时间了。听起来你曾经非常接近。

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      相关资源
      最近更新 更多