1

只是一些背景信息。我的表(HireHistory)中有 50 列(水平)。我有一个表单(HireHistoryForm),它有一个 2 个文本框(HistoryMovieID 和 HistoryCustomerID)和一个按钮(该按钮运行查询“HireHistoryQuery”)

这是我的数据的摘录(CustomerID 位于顶部): 数据

所以我需要的是,如果在 HistoryCustomerID 框中输入了一个数字,那么它会显示该列。例如,如果输入的值为“1”,那么在我的查询中它将显示第 1 列中的所有记录。

如果在 HistoryMovieID 框中输入了一个数字(例如 0001),那么它将显示特定 CustomerID 的该 MovieID 的所有实例。即在第 1 列中是 ID,因此对于 ID=1,它将显示“0001 on 19/05/2006”然后将继续查找“0001”等的下一个实例。

对于 HistoryCustomerID,我尝试将其放入我的“字段”中进行查询:

=[Forms]![HireHistoryForm]![HistoryCustomerID]

但它没有用。我的查询只返回了一个标有“10”的列,而这些行只是由“10”组成。

如果您能提供帮助,我将不胜感激。:)

4

1 回答 1

1

无意冒犯(或尽可能少冒犯),但这是一种构建数据的可怕方式。你真的需要像这样重组它:

CustomerID  MovieID HireDate
----------  ------- --------
1           0001    19/05/2006
1           0003    20/10/2003  
1           0007    13/08/2003
...     
2           0035    16/08/2012
2           0057    06/10/2012
...

如果您保留当前的数据结构,那么

  1. 你会发疯的,而且

  2. 其他任何人都不太可能接近这个问题。

编辑

您修改后的数据结构是一个非常小的改进,但它仍然对您不利。考虑到您在这里的另一个问题中,您实质上是在询问一种在进行查询时“即时”“修复”数据结构的方法。

好消息是您可以运行一些 VBA 代码一次将您的数据结构转换为可用的东西。首先创建您的新表,我将其命名为“HireHistoryV2”

ID         - AutoNumber, Primary Key
CustomerID - Number(Long Integer), Indexed (duplicates OK)
MovieID    - Text(4), Indexed (duplicates OK)
HireDate   - Date/Time, Indexed (duplicates OK)

将数据复制到新表的 VBA 代码如下所示:

Function RestructureHistory()
Dim cdb As DAO.Database, rstIn As DAO.Recordset, rstOut As DAO.Recordset
Dim fld As DAO.Field, a() As String

Set cdb = CurrentDb
Set rstIn = cdb.OpenRecordset("HireHistory", dbOpenTable)
Set rstOut = cdb.OpenRecordset("HireHistoryV2", dbOpenTable)

Do While Not rstIn.EOF
    For Each fld In rstIn.Fields
        If fld.Name Like "Hire*" Then
            If Not IsNull(fld.Value) Then
                a = Split(fld.Value, " on ", -1, vbBinaryCompare)
                rstOut.AddNew
                rstOut!CustomerID = rstIn!CustomerID
                rstOut!MovieID = a(0)
                rstOut!HireDate = CDate(a(1))
                rstOut.Update
            End If
        End If
    Next
    Set fld = Nothing
    rstIn.MoveNext
Loop
rstOut.Close
Set rstOut = Nothing
rstIn.Close
Set rstIn = Nothing
Set cdb = Nothing
MsgBox "Done!"
End Function

注意:您似乎正在使用 dd/mm/yyyy 日期格式,因此请仔细检查日期转换以确保它们正确转换。

于 2013-04-18T08:46:36.717 回答