Ms access 查询通过查找获取,但具有相同SQL的RowSource不会

Ms access 查询通过查找获取,但具有相同SQL的RowSource不会,ms-access,Ms Access,在我的项目中,我有一个获取正确值的查询,但是当我将该表用作列表框的rowsource时,它不会显示相同的值 例如,我使用的是星球大战场景 有两个表:字符,场景和一个表单 字符表有以下列:ID和Title。它充满了星球大战人物的名字 场景表有以下列:ID、Title和外观外观是一个多选列,对Characters.ID字段执行查找。以下是该列的查找字符串: SELECT Characters.[Title], Characters.ID FROM Characters ORDER BY Charac

在我的项目中,我有一个获取正确值的查询,但是当我将该表用作列表框的
rowsource
时,它不会显示相同的值

例如,我使用的是星球大战场景

有两个表:
字符
场景
和一个表单

字符
表有以下列:
ID
Title
。它充满了星球大战人物的名字

场景
表有以下列:
ID
Title
外观
<代码>外观是一个多选列,对Characters.ID字段执行查找。以下是该列的查找字符串:

SELECT Characters.[Title], Characters.ID FROM Characters ORDER BY Characters.[Title]; 
这就是诡计发生的地方。虽然
外观
字段绑定到
Characters.ID
,但它显示
Characters.Title而不是在表中显示ID,我希望它显示名称以便于人类阅读。请注意,sql字符串如何设置为
Characters.ID
作为*第二个*列-*和*-绑定的是该列。这将使表正确地绑定到
ID
列,但由于*第一*列是
Title
列,因此当人们查看它时,表中显示的是
Title`

场景.外观的查找列

当我查看
场景
表时,我会在“外观”列中看到角色的名称,用逗号分隔-完美

显示标题而不是ID的场景表

但是,当我使用此表作为列表框的
rowsource
时,我希望得到相同的效果,但列表框只显示
ID
(我假设这是因为它是绑定列)

如何使列表框像表格一样显示?我希望有一个简单的技巧可以让listbox以与查询相同的方式显示。该表显示非绑定列中的名称,但listbox不显示,即使将listbox设置为显示相同的表。也许有更好的办法?还是这是一只虫子

显示场景表的列表框

我一直在看,这是相似的,但不能弄明白这一点


我想我已经很好地描述了一切,但这是我的示例数据库。在
场景
表中。

您正在使用查找字段,这是一种“智能”功能,在查询(或表)本身中很有用,但在其他方面只会带来麻烦,正如您现在看到的

您看到的值是与Bob、Harry和Justin相关的ID。将它们移动到单独的表中,在查询中联接此表,然后检索表单的名称

编辑:

要收集和连接名称,请首先创建一个简单的查询,如:

SELECT 
    tblChild.FK, 
    tblChild.Name
FROM 
    tblChild
WHERE 
    tblChild.FK = [Key];
将此另存为QueryConcat

然后,使用此查询并指定分隔符,修改原始查询以包含以下函数,如:

SELECT 
    tblParent.ID, 
    tblParent.SomeField, 
    ConcatenateRecords("QueryConcat", [ID], "Name", " ,") AS Names
FROM 
    tblParent;
以及功能:

Public Function ConcatenateRecords( _
  ByVal strSource As String, _
  ByVal lngKey As Long, _
  ByVal strField As String, _
  Optional ByVal strSeparator As String = ";") _
  As String

' Concatenates values from one field (strField) from all
' records in query strSource using parameter Value lngKey.
' Values are separated by strSeparator.
' Default output like:
' 34;56;34;67;234
'
' 1999-10-12. Cactus Data ApS, CPH

  Dim dbs         As DAO.Database
  Dim qdf         As DAO.QueryDef
  Dim rst         As DAO.Recordset
  Dim fld         As DAO.Field

  Dim booPluralis As Boolean
  Dim strFields   As String

  On Error GoTo Err_ConcatenateRecords

  Set dbs = CurrentDb()

  If Len(strSource) > 0 And Len(strField) > 0 Then
    Set qdf = dbs.QueryDefs(strSource)
    qdf.Parameters(0) = lngKey
    Set rst = qdf.OpenRecordset()
    Set fld = rst.Fields(strField)

    With rst
      While Not .EOF
        If booPluralis = True Then
          ' There is more than one record.
          ' Add separator.
          strFields = strFields & strSeparator
        End If
        strFields = strFields & Trim(fld.Value)
        booPluralis = True
        .MoveNext
      Wend
      .Close
    End With

    Set fld = Nothing
    Set rst = Nothing
    Set qdf = Nothing
  End If

  Set dbs = Nothing

  ConcatenateRecords = strFields

Exit_ConcatenateRecords:
  Exit Function

Err_ConcatenateRecords:
  MsgBox "Error " & Err.Number & ". " & Err.Description
  Resume Exit_ConcatenateRecords

End Function
MV表格字段:


您正在使用查找字段,这是一种“智能”功能,在查询(或表)本身中很有用,但在其他方面只会带来麻烦,正如您现在看到的

您看到的值是与Bob、Harry和Justin相关的ID。将它们移动到单独的表中,在查询中联接此表,然后检索表单的名称

编辑:

要收集和连接名称,请首先创建一个简单的查询,如:

SELECT 
    tblChild.FK, 
    tblChild.Name
FROM 
    tblChild
WHERE 
    tblChild.FK = [Key];
将此另存为QueryConcat

然后,使用此查询并指定分隔符,修改原始查询以包含以下函数,如:

SELECT 
    tblParent.ID, 
    tblParent.SomeField, 
    ConcatenateRecords("QueryConcat", [ID], "Name", " ,") AS Names
FROM 
    tblParent;
以及功能:

Public Function ConcatenateRecords( _
  ByVal strSource As String, _
  ByVal lngKey As Long, _
  ByVal strField As String, _
  Optional ByVal strSeparator As String = ";") _
  As String

' Concatenates values from one field (strField) from all
' records in query strSource using parameter Value lngKey.
' Values are separated by strSeparator.
' Default output like:
' 34;56;34;67;234
'
' 1999-10-12. Cactus Data ApS, CPH

  Dim dbs         As DAO.Database
  Dim qdf         As DAO.QueryDef
  Dim rst         As DAO.Recordset
  Dim fld         As DAO.Field

  Dim booPluralis As Boolean
  Dim strFields   As String

  On Error GoTo Err_ConcatenateRecords

  Set dbs = CurrentDb()

  If Len(strSource) > 0 And Len(strField) > 0 Then
    Set qdf = dbs.QueryDefs(strSource)
    qdf.Parameters(0) = lngKey
    Set rst = qdf.OpenRecordset()
    Set fld = rst.Fields(strField)

    With rst
      While Not .EOF
        If booPluralis = True Then
          ' There is more than one record.
          ' Add separator.
          strFields = strFields & strSeparator
        End If
        strFields = strFields & Trim(fld.Value)
        booPluralis = True
        .MoveNext
      Wend
      .Close
    End With

    Set fld = Nothing
    Set rst = Nothing
    Set qdf = Nothing
  End If

  Set dbs = Nothing

  ConcatenateRecords = strFields

Exit_ConcatenateRecords:
  Exit Function

Err_ConcatenateRecords:
  MsgBox "Error " & Err.Number & ". " & Err.Description
  Resume Exit_ConcatenateRecords

End Function
MV表格字段:


您确定查询不起作用吗?您是否已将框的显示属性设置为期望多个列并显示所需的列?(请不要忘记发布实际查询;))常规查询有效(Query1),但显示数字而不是文本的是sql字符串查询。我甚至尝试从常规查询中复制sql字符串。但我需要将其用作行源代码,这样我可以首先编辑它并将其添加到VBA代码中。我将尝试获取最小的查询字符串。是的,放一些更具体的示例。。。您有很好的描述,但添加了特定的示例查询——好的和坏的——并向我们显示方框的属性,例如屏幕截图。除此之外,您甚至可以在运行时向我们显示实际控件的屏幕截图。您确定查询不起作用吗?您是否已将框的显示属性设置为期望多个列并显示所需的列?(请不要忘记发布实际查询;))常规查询有效(Query1),但显示数字而不是文本的是sql字符串查询。我甚至尝试从常规查询中复制sql字符串。但我需要将其用作行源代码,这样我可以首先编辑它并将其添加到VBA代码中。我将尝试获取最小的查询字符串。是的,放一些更具体的示例。。。您有很好的描述,但添加了特定的示例查询——好的和坏的——并向我们显示方框的属性,例如屏幕截图。除此之外,您甚至可以在运行时向我们显示实际控件的屏幕截图。是的,我知道这些数字就是ID。multi-select字段提取ID,因为它们位于绑定的第1列中,但也设置为显示第2列。这在查询中起作用,但在表单的列表框中不起作用。所以,我必须查找ID,我明白了。ID在一个单独的表中,一个接一个地显示它们的ID和名称。第二个表将它们作为一个多选项进行拉入,因为我需要将它们组合在一个条目下。好吧,这只是另一个“智能”功能,但正如您所看到的,这是有限的。您在上面说过。如果我没有使用multi-select将ID选择到一个字段中,那么您会怎么做?我想找到一种使用“智能f”的方法