【问题标题】:Alias a Caption in Access 2007Access 2007 中的标题别名
【发布时间】:2010-10-19 22:42:07
【问题描述】:

好的,我的 Access 2007 数据库中有两个表(嗯,不止这些,但问题适用于这两个...):

part
  part_no
  ...
  supplier_id
  special_supplier_id
  ...

supplier
  supplier_id
  supplier_nm      (NB: Caption="Supplier Name")
  special_supplier_flg

现在我已经建立了一个查询:

SELECT p.part_no, s.supplier_nm, ss.supplier_nm AS special_supplier_nm
FROM
  part AS p INNER JOIN
  supplier AS s ON p.supplier_id = s.supplier_id INNER JOIN 
  supplier AS ss on p.supplier_id = ss.supplier_id

一切都很好,它似乎适用于简单的选择(如果查询本身有任何错误,这是为问题重新键入它的人工制品,不是问题是什么大约),并且应该也适用于代码应用程序。

但问题是,如果我打开查询的数据表视图,两个名称字段都标记为“供应商名称”。有没有办法解决这个问题?

【问题讨论】:

    标签: ms-access


    【解决方案1】:

    试试这个:

     SELECT p.part_no, s.supplier_nm, (ss.supplier_nm + '') AS special_supplier_nm. . .
    

    但是,如果您使用查询构建器,您可能需要注意不要首先使用“默认”别名(来自标题)构建查询,因为这似乎会保留在一些不可见的元数据中。

    此外,如果您可以在 Access 的查询生成器中编辑此查询,如果您右键单击相关字段,则可以选择在查询中设置标题属性,这将覆盖原始表上的任何标题列。

    【讨论】:

      【解决方案2】:

      即使是单表查询,我在 Access 2003 中也看到了同样的情况……如果源字段分配了标题,则该标题将用作查询数据表视图中的列标题,无论我是否在查询定义中给该字段一个别名。

      除了从源表定义中删除 Caption 之外,我能找到解决它的唯一方法是使用 VBA 手动重新分配字段的 Caption 属性。 Query1 包含一个名为 id 的字段,该字段在源表中具有“Foo ID”作为其标题:

      CurrentDb.QueryDefs("Query1").Fields("id").Properties("Caption") = "foo_id"
      

      该命令确实导致查询数据表视图使用 foo_id 作为列标题。

      如果您为查询字段分配别名,则该别名将用作查询字段集合中的名称。您可以使用以下过程检查查询的字段名称及其标题:

      Public Sub InspectQueryFieldCaptions(ByVal pQuery As String)
          Dim fld As DAO.Field
          Dim strMsg As String
      
      On Error GoTo ErrorHandler
      
          For Each fld In CurrentDb.QueryDefs(pQuery).Fields
              Debug.Print "Field: " & fld.Name, "Caption: " & fld.Properties("Caption")
          Next fld
      
      ExitHere:
          Set fld = Nothing
          On Error GoTo 0
          Exit Sub
      
      ErrorHandler:
          Select Case Err.Number
          Case 3270 ' Property not found. '
              Debug.Print "Field: " & fld.Name, "no caption"
              Resume Next
          Case Else
              strMsg = "Error " & Err.Number & " (" & Err.Description _
                  & ") in procedure InspectQueryFieldCaptions"
              MsgBox strMsg
              GoTo ExitHere
          End Select
      End Sub
      

      【讨论】:

      • 我一定会看看这个,但是当我问这个问题时,Larry 的答案正是我想要的。
      • 是的,拉里的方式肯定更方便。如果您进一步探索,请查看 fld.Properties("Caption").Inherited ... 这似乎有助于我更好地了解整个字幕业务的运作方式。
      【解决方案3】:

      您的表格定义中是否设置了标题?这些定义将显示而不是您的别名。由于您选择的列具有相同的标题(无别名),您将在数据表视图中看到相同的标题。

      您可以选择更改标题字段吗?将其留空将使用其给定名称(或视图中的别名)

      【讨论】:

      • 是的,我说的是表定义中设置的 Caption,并且我已经完全观察到您描述的行为(我将其设置为空白一段时间)。这没什么大不了的,因为我几乎不会向用户展示数据表,而且我可以重新定义表单和报告上的标签。我只是希望有一种方法可以将其作为查询定义的一部分。感谢您花时间回答(如果明天没有人给我更好的,我会接受)。
      【解决方案4】:

      可行的解决方法

      好吧,这个让我发疯了,因为我使用了来自我们公司财务、人力资源和 CRM 系统的链接(导入)表中的大量数据,所有这些数据都是由同一个开发人员设置的,他认为每个索引“ID”都有标题:是个好主意。但是,当您有一个将其中许多组合在一起的聚合时,您会容易出错,因为后续查询无法确定哪个“ID:”是哪个。他是我的解决方案:

      而不是简单地传递值,它只是传递标题:如果要重新描述的字段是值字段,只需重新标记它并将其乘以 1 像这样(在这个我的 per_id 字段是标题 ID:):

       Perid: 1*[pe_id]
      

      这会产生一个标记为 Perid 的新字段

      如果它是一个文本字段,只需将它与以下内容连接起来:

      Perid: ""&[fname]
      

      有效。

      【讨论】:

        猜你喜欢
        • 2019-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-26
        相关资源
        最近更新 更多